📄 main.c
字号:
/******************************************************************************
** copyright(c) skee ltd,.co. 1996-2009
** c8051f310 256+1024 bytes ram osc:24.5M
** RFchip si4421(433M) Anti-collision
** Last Modify 2009-12-9
** by jerkoh
** V2.0
******************************************************************************/
#include "global.h"
unsigned char code system_date[]="\r\n[msg:]Compiler_date:" __DATE__;
unsigned char code system_time[]="\r\n[msg:]Compiler_date:" __TIME__;
/******************************************************************************
** MAIN Routine
******************************************************************************/
void main (void)
{
unsigned char nr;
unsigned int event_word_copy;
// Disable Watchdog timer
PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer
// enable)
PORT_Init(); // Initialize Port I/O
SYSCLK_Init ();
// Initialize Oscillator
event_word=0;
delayms(200);
Timer0_Init();
Timer2_Init(SYSCLK/TIMER2_RATE); // Init Timer 2
PCA_Init ();
InitSysTimer(); // 初始化计数器
Beef(2,RED); // 上电2闪2滴
delayms(500);
BeefL(1,RED);
delayms(500);
LEDR_ON;
LEDG_OFF;
flash_boot(); //AT25参数启动检验提取
UART0_Init();
EA=1;
ES0=1;
delay(400);
nres=0;
delayms(100);
nres=1;
ia442xinit();
spirevtwobyte();
spisendcommand(0x8288); //电源管理 whole receive crystal on
spisendcommand(0xca83); //FIFO COMMAND
if(DEBUG) Printf_String("\r\n[msg:]Copyright(c) SKEE LTD,.CO. 1996-2009");
if(DEBUG) Printf_String("\r\n[msg:]EZradio SI4421(433Mhz) Running on C8051F310");
for(nr=0;nr<sizeof(system_date);nr++)
{
if(DEBUG) Printf_Char(system_date[nr]);
}
delayms(300);
for(nr=0;nr<sizeof(system_time);nr++)
{
if(DEBUG) Printf_Char(system_time[nr]);
}
delayms(100);
memset(tagnr, 0, sizeof(tagnr)); //清空登记标签结构体
memset(wiebuf_cout, 0, sizeof(wiebuf_cout));
Init_AT25XXX(0x00); //初始化AT25xxx SPI eeprom
PCA0L = 0x00;
PCA0CPL4 = 255; //32.1ms
PCA0MD |= 0x40; //开启看门狗
while(1)
{
/**********@task00@**********/
/**倒计时数组片管理LED+BELL**/
if(GetSysTimer(0)) //0=LEDR
{
LEDR^=1;
SetSysTimer(0,500); //500MS LEDR闪
}
if(GetSysTimer(1)) //1=LEDG
{ //关闭闪过的绿灯
LEDG_OFF;
}
if(GetSysTimer(2)) //2=BELL
{
BELL_OFF; //关闭响过的蜂鸣器
}
/**********@task01@**********/
/*****处理无线接收的信息*****/
if(receive())
{
Process_Frame();
}
/**********@task02@**********/
/********串口数据处理********/
event_word_copy=event_word; //搜集时间片
if(event_word_copy&event_uart_arrived)
{
EA=0;
event_word&= ~(event_uart_arrived);//消毁完成任务标记
EA=1;
process_uart();
}
/**********@task03@**********/
/****每100ms轮询无线标签*****/
if(event_word_copy&event_time_100ms)
{
EA=0;
event_word&= ~(event_time_100ms);
EA=1;
if(((TRIG==0)&&(TRIG_STATE==1)) ||(TRIG==1))
{ //触发状态加触发或者非触发才询卡
SeekFrame(WCMD_NOR); //普通寻卡
txregframe(FRAME_LEN);
}
}
/**********@task04@**********/
/*****1s基准处理时间事件*****/
if(event_word_copy&event_time_1000ms)
{
EA=0;
event_word&= ~(event_time_1000ms);
EA=1;
for(nr=0;nr<10;nr++) //查询登记是否需要老化
{
if((tagnr[nr].save_inactivity)&&(tagnr[nr].save_state!=0))
{
tagnr[nr].save_inactivity--;
if(tagnr[nr].save_inactivity==0)
{
tagnr[nr].save_state=0;
}
}
if(tagnr[nr].save_inactivity==0)
{
tagnr[nr].save_state=0;
}
}
if(event_relay!=0)
{
event_relay--;
if(event_relay==0)
{
if(ONLY_READER)
{
RELAY_IN =ON_1; //继电器
RELAY_OUT=ON_1;
}
else
{
RELAY_IN =OFF_0;
RELAY_OUT=OFF_0;
}
}
}
}
/**********@task05@**********/
/**处理接收的wiegand数据包***/
if(event_word_copy&event_wie_arrived)
{
EA=0;
event_word&= ~(event_wie_arrived);
EA=1;
wie_str=0; //清wiegand脉冲标记
//注意wie_cout半字节当一次处理
if(wie_cout==0)
{wie_cout++;}
for(nr=0;nr<wie_cout;nr++)
{
Printf_Char(wiebuf_cout[nr]);
}
CLR_WIEBUF_COUT;
}
/**********@task06@**********/
/****处理进出2路触发信号*****/
if(TRIG_IN==0)
{
RELAY_TRIG_STATE=1; //当前进门
TRIG_STATE=1;
flg_io=0x01;
}
else if(TRIG_OUT==0)
{
RELAY_TRIG_STATE=0; //当前出门
TRIG_STATE=1;
flg_io=0x00;
}
else
{
;
}
/**********@task07@**********/
/**********@task08@**********/
/**********@task09@**********/
/**********@task0A@**********/
/**********@task0B@**********/
/**********@task0C@**********/
/**********@task0D@**********/
/**********@task0E@**********/
/**********@task0F@**********/
}
}
/******************************************************************************
** 函数: PORT_Init ()
** 入参:
** 返回:
** 说明:
** PORT_Init
** Configure the Crossbar and GPIO ports.
** P0.4 - UART TX
** P0.5 - UART RX
** P3.3 - LED
******************************************************************************/
void PORT_Init (void)
{
P0SKIP = 0xcf; //注意SPI没有配置成硬件,只是脚放在对应位置
P1SKIP = 0x03; //配置P1.2 P1.3 两端块脉冲捕获
XBR0 = 0x01; //使能 UART on P0.4(TX) and P0.5
XBR1 = 0x42;
P0MDOUT = 0x1C; //使能 UTX 为推挽输出 p0.2 p0.3
P3MDOUT |= 0x06; //P3.1 P3.2 继电器
if(ONLY_READER) //只做读卡器时jdq不动作
{
RELAY_IN =1;
RELAY_OUT =1;
}
else
{
RELAY_IN =0;
RELAY_OUT =0;
}
P0MDOUT = 0xfd; // sdo非推挽
P1MDOUT |= 0xf3; // nsel p1.0 p1.1推挽 p1.4 p1.5 P1.6 P1.7
P2MDOUT |= 0xb0; // P2.7 P2.4 P2.5
D0IN = 0;
D1IN = 0;
D0OUT = 0;
D1OUT = 0;
BELL = 0; //蜂鸣器关闭
LEDR = 1; //LED关闭
sck = 0;
nsel = 0;
sdi = 1;
sdo = 1;
X_CS = 1; //不选中AT25128
}
/******************************************************************************
** 函数:beef(unchar be)
** 入参:be, rg
** 返回:
** 说明:
******************************************************************************/
void Beef(UCHAR be,UCHAR RG)
{
UCHAR i;
if(be==1)
{
BELL_ON;
if(RG==RED) {LEDR_ON;}
else
{LEDG_ON;}
delayms(100);
BELL_OFF; //单次蜂鸣
if(RG==RED) {LEDR_OFF;}
else
{LEDG_OFF;}
}
else
{
for(i=0;i<be;i++)
{
BELL_ON;
if(RG==RED) {LEDR_ON;}
else
{LEDG_ON;}
delayms(100);
BELL_OFF;
if(RG==RED) {LEDR_OFF;}
else
{LEDG_OFF;}
delayms(200); //多次蜂鸣需要间隔延时
}
}
}
void BeefL(UCHAR be,UCHAR RG)
{
UCHAR i;
if(be==1)
{
BELL_ON;
if(RG==RED) {LEDR_ON;}
else
{LEDG_ON;}
delayms(500);
BELL_OFF; //单次蜂鸣
if(RG==RED) {LEDR_OFF;}
else
{LEDG_OFF;}
}
else
{
for(i=0;i<be;i++)
{
BELL_ON;
if(RG==RED) {LEDR_ON;}
else
{LEDG_ON;}
delayms(300);
BELL_OFF;
if(RG==RED) {LEDR_OFF;}
else
{LEDG_OFF;}
delayms(200); //多次蜂鸣需要间隔延时
}
}
}
/******************************************************************************
** 函数: SYSCLK_Init ()
** 入参:
** 返回:
** 说明:
** SYSCLK_Init
** This routine initializes the system clock to use the internal oscillator
** at its maximum frequency.
** Also enables the Missing Clock Detector.
******************************************************************************/
void SYSCLK_Init (void)
{
OSCICN |= 0x03; // Configure internal oscillator for
// its maximum frequency
RSTSRC = 0x04; // Enable missing clock detector
}
/******************************************************************************
** 函数: delay()
** 入参: unsigned int m
** 返回:
** 说明:
******************************************************************************/
void delay(unsigned int m)
{
unsigned int n;
n=0;
while(n<m)
{n++;}
return;
}
/******************************************************************************
** 函数: PCA_Init
** 入参: 无
** 返回: 误
** 说明: 脉冲捕获初始化
******************************************************************************/
void PCA_Init (void)
{
EIE1 = 0x10; //允许PCA0中断请求
PCA0L = 0x00;
PCA0H = 0x00;
PCA0CPM0 = 0x11;
PCA0CPL0 = 0x00;
PCA0CPH0 = 0x20;
PCA0CPM1 = 0x11;
PCA0CPL1 = 0x00;
PCA0CPH1 = 0x20;
PCA0CN = 0x40; //允许PCA定时器/计数器
}
/******************************************************************************
** 函数: PCA_ISR
** 入参: 无
** 返回: 无
** 说明: 脉冲捕获中断服务程序
******************************************************************************/
void PCA_ISR (void) interrupt 11
{
CF = 0; //脉冲中断清标记
wie_str=1; //设置标记提供TIME0检测
RE_LOAD_TIME0;
//重载定时器0
if(CCF0==1) //查看d0 or d1
{
CCF0 = 0; //清匹配中断标志
wiebuf_cout[wie_cout]<<=1;
wiebuf_cout[wie_cout] |=0;
wie_8bit--;
}
if(CCF1==1)
{
CCF1 = 0;
wiebuf_cout[wie_cout]<<=1;
wiebuf_cout[wie_cout] |=1;
wie_8bit--;
}
if(!wie_8bit) //8bit 1字节溢出归0,数组指针+1
{
wie_cout++;
wie_8bit=8;
}
if(wie_cout>=32) //最多接收32字节wiegand信号
{
CLR_WIEBUF_COUT;
}
}
/******************************************************************************
** 函数: relay_work
** 入参: 无
** 返回: 无
** 说明: 继电器动作
******************************************************************************/
void relay_work()
{
if(ONLY_READER)
{
if(TRIG==1) //非外部触发信号
{
if(WIE_CK==0) //既进又出
{
RELAY_IN=OFF_0;
RELAY_OUT=OFF_0;
}
else
{
if(IN_OUT==1) //根据卡标记动作
{
RELAY_IN=OFF_0;
}
else
{
RELAY_OUT=OFF_0;
}
}
}
else //外部触发信号
{
if(RELAY_TRIG_STATE==1)
{
RELAY_IN=OFF_0; //如果触发的是进门,开进门继电器
}
else
{
RELAY_OUT=OFF_0;
}
}
}
else
{
return; //继电器不动作
}
}
/****************************@end@*************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -