陕西理工学院毕业设计
附 录 C 源程序
#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \
void init_all(void) //初始化 {
EA = 0; //关总中断 init_timer(); //定时器初始化 init_uart(); //串口初始化 init_rc522(); //RC522初始化 lcd_init(); //LCD初始化
EEPROM_READ(0,Card_SN_BUF,4);//EEPROM初始化,取出记录的卡号 EEPROM_READ(7,KEY_BUF,8);//EEPROM初始化,取出记录的密码
send_bytes(Card_SN_BUF,4); EA = 1; //开总中断 }
void main(void) //主函数 {
INT8U key;
Delay_ms(50); //让硬件稳定
init_all(); //执行初始化函数 relay_OFF(); //关继电器 LED_BLINK_1(); //led test beep1(); //beep test display(0,0,0); //显示初始化 while(1) {
key=key_scan(); //按键操作 if(key==12)
if(states>0) states--;
else states=0; //上一功能
第 32 页 共 61 页
陕西理工学院毕业设计
if(key==13)
if(++states>3) states=3; //下一功能
ctrl_process(); //进入RC522操作 }
void time0() interrupt 1 //定时器中断1 {
TH0=(65536-50000)/256; //给定时器1赋初值 TL0=(65536-50000)%6; //给定时器1赋初值 if(flag_m==1) {counts1++;}
if(counts1>150){counts1=0;beep1();} //count1=20是计数一秒,150大概7.5秒 if(l2==1){beep1();}
} }
#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \#include \
INT8U states=0;//状态机
INT8U Card_type[2], //卡片类型 Card_SN[4]={0},//IC卡号
Card_SN_BUF[4]={0xff,0xff,0xff,0xff},//卡号登记缓冲区 KEY_BUF[8]={'0','0','0','0','0','0','0','0'}; INT8U bPass = 0; bWarn = 0;
void uart_over( void ) //串口数据还原 {
UartCount = 0; UartStart = FALSE; UartComp = FALSE; }
void pass( void ) {
beep1();
Delay_ms(2000);//让卡片离开 LED_BLINK_1();
第 33 页 共 61 页
陕西理工学院毕业设计
}
void warn(void) {
LED_BLINK_2(); }
INT8U IC_READ( void ) {
INT8U ID_ASC[8],i;
if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 {
if( PcdRequest( PICC_REQIDL, Card_type ) != MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 {
return FALSE; } }
if( PcdAnticoll( Card_SN ) != MI_OK ) //防冲撞,返回卡的序列号 4字节 {
bWarn = 1;
return FALSE; }
bPass = 1;
send_bytes(Card_type,2); send_bytes(Card_SN,4);
for(i=0;i<4;i++) //卡ID号转化成ASCII {
if(Card_SN[i]/16>9) ID_ASC[i*2]=Card_SN[i]/16+'7'; else ID_ASC[i*2]=Card_SN[i]/16+'0';
if(Card_SN[i]>9) ID_ASC[i*2+1]=Card_SN[i]+'7'; else ID_ASC[i*2+1]=Card_SN[i]+'0'; }
display2(3,0,\显示卡号 display2(3,2,ID_ASC,8);
return TRUE; }
第 34 页 共 61 页
陕西理工学院毕业设计
void ctrl_process( void ) {
INT8U i,key_count,key_value=16,table[8]=\
if(states!=statesbuf) //状态改变,清屏 {
display_clear_line(2); display_clear_line(3); statesbuf=states; }
switch(states) {
case 0: //IC卡读卡输入 display(1,0,1); if(IC_READ()) {
if ((Card_SN[0]==Card_SN_BUF[0]) &&(Card_SN[1]==Card_SN_BUF[1]) &&(Card_SN[2]==Card_SN_BUF[2]) &&(Card_SN[3]==Card_SN_BUF[3])) {
relay_ON();//灯开关 display(2,0,5); }
else display(2,0,6); relay_OFF(); }
break;
case 1:
display(1,0,2); //密码输入 display2(3,0,table,8); key_count=0; while(1) {
key_value=key_scan(); if(key_value==12) {
states--; return; }
第 35 页 共 61 页