射频识别门禁系统
单片机源程序如下:
- #include "reg52.h"
- #include "mfrc522.h"
- #include <string.h>
- #include <12864.h>
- #include <i2c.h>
- #include <waishe.h>
- #include <key.h>
- unsigned char aaddrr,addr;
- unsigned char eepromreadnum[4];
- char returnkey=1;
- void Timer0Init() //定时器0初始化
- {
- EA=0;//打开总中断
- ET0=1;//打开定时器0中断允许
- TR0=1;//打开定时器
- TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- }
- void main( )
- {
- int failflag,y,successflag;
- int KeyValue=12;
- beep=0;
- RFID_Init();
- LCDInit();
- Timer0Init();
- if(At24c02Read(255)!=0x65) //eeprom初次上电初始化
- {
- delay(1000);
- ShowQQChar(0x82,"初次上电",4);
- ShowQQChar(0x91,"初始化中...",6);
- ShowQQChar(0x8a,"请稍等",3);
- for(y=0;y<255;y++)
- {
- At24c02Write(y,0xff); //eeprom区全部清零
- delay(1000);
- }
- At24c02Write(255,0x65);
- delay(1000);
- At24c02Write(248,0x25);
- delay(1000);
- At24c02Write(249,0x28);
- delay(1000);
- At24c02Write(250,0xa5);
- delay(1000);
- At24c02Write(251,0x51);
- delay(1000);
- }
- while(1)
- {
- unsigned char status,i,k;
- k=0;
- LCD_show();
- status = PcdRequest(PICC_REQIDL, g_ucTempbuf);//寻天线区内未进入休眠状态的卡
- if (status != MI_OK)
- {
- PcdReset();
- PcdAntennaOff();
- PcdAntennaOn();
- continue;
- }
- status = PcdAnticoll(g_ucTempbuf); //防冲撞,此时g_ucTempbuf的值为卡号
- if(status != MI_OK)
- continue;
- ////////卡号打印////////////////////////
- led1=0;
- WRCommand(0x01); //清除显示 DDRAM
- ShowQQChar(0x90,"卡号:",3);
- while(aaddrr<252) //卡号比对程序段
- {
- k=0;
- for(i=0;i<4;i++) //卡号占用四个地址,比对四次
- {
- eepromreadnum[i]=At24c02Read(aaddrr); //读取EEPROM地址1内的数据保存在 g_ucTempbuf[]中
- aaddrr++;
- ShowNUMChar(0x93+i,g_ucTempbuf[i]); //显示卡号
- if(eepromreadnum[i]==g_ucTempbuf[i]) //卡号开始进行比对
- {
- k=k+i; //四次比对成功0+1+2+3
- delay(1000);
- }
- else k=0; //比对失败
- if(k==6)
- {
- failflag=0;
- aaddrr=252;
- }
- }
- }
- aaddrr=0; //地址回到首位,以便下次比较
- if(k==6) //卡号对比成功
- {
- relay=0;
- ShowQQChar(0x8a,"请通过\xfd",3);
- beep_Init(1);
- }
- if(k!=6) //卡号对比失败
- {
- beep_Init(0);
- delay(50000);
- WRCommand(0x01);
- failflag=1; //卡号对比失败标志位
- }
- if(failflag==1)
- {
- ShowQQChar(0x91,"是否输入密码",6);
- ShowQQChar(0x8a,"添加卡号",4);
- delay(500);
- while(returnkey)
- {
- EA=0;
- KeyValue=KeyDown();
- if(KeyValue==11)
- {
- WRCommand(0x01);
- delay(10000);
- successflag=inputmima(); //密码输入函数
- delay(10000);
- WRCommand(0x01);
- delay(1000);
- if(successflag==1)
- {
- for(i=0;i<4;i++) //显示卡号 g_ucTempbuf[] 所刷卡的卡号
- {
- ShowNUMChar(0x92+i,g_ucTempbuf[i]);
- At24c02Write(addr,g_ucTempbuf[i]); //将卡号存入eeprom中,addr为存入地址
- addr++;
- delay(1000);
- }
- delay(10000);
- WRCommand(0x01);
- ShowQQChar(0x92,"存储成功",4);
- delay(10000);
- }
- returnkey=0;
- }
- else if(KeyValue==10)
- returnkey=0;
- else
- EA=1;
- }
- }
- returnkey=1;
-
- delay(70000); //延时等待
- WRCommand(0x01); //清除显示 DDRAM
- led1=1;
- relay=1;
-
- }
- }
- void Timer0() interrupt 1
- {
- static u16 i;
- TH0=0XFC; //给定时器赋初值,定时1ms
- TL0=0X18;
- i++;
- if(i==5000)
- {
- i=0;
- returnkey=0;
- }
- }
复制代码
以上程序51hei提供下载 (无仿真工程):
门禁系统.rar
(115.9 KB, 下载次数: 314)
|