一、系统效果
编写程序使液晶屏上显示“清华大学”字样,调试RFID-RC522读取卡的卡号,将读取到的卡号显示在液晶屏上,并且用此卡号和EEPROM中存储的卡号进行比较,匹配液晶屏则显示“匹配成功”字样,继电器开启;反之则显示“匹配失败”字样,继电器关闭。设置三个独立按键实现以下功能:
按键1:当按下此按键时再次刷卡单片机可以将此卡号存在EEPROM中;
按键2:当按下此按键时再次刷卡单片机可以将此卡号从EEPROM中删除;
按键3:当按下此按键时再次刷卡单片机可以将EEPROM中的所有存在卡号都删除。
二、射频识别模块RFID-RC522
RFID是视频识别的英文缩写。通俗的说,RFID读卡器是一种能阅读电子标签数据的自动识别设备。RFID射频识别是一种非接触式的自动识别技术,它通过射频信号自动识别目标对象并获取相关数据,识别工作无须人工干预,可工作于各种恶劣环境。RFID技术可识别高速运动物体并可同时识别多个标签,操作快捷方便。
RC522是具有高集成度的读写卡芯片,也是一款非常常用的非接触式通信芯片。它利用了先进的调制和解调概念,完全集成了在13.56MHz下的所有类型的被动非接触式通信方式和协议。支持了ISO14443A的多层应用。当其工作时,射频读写器向IC卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,这样在电磁波激励下,LC谐振电路产生共振,从而使电容内有了电荷;在这个电荷的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内存储,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接受读写器的数据。
#include <reg52.h>
#include <intrins.h>
#include <STDIO.H>
#include <string.h>
#include"i2c.h"
#include "lcd.h"
#include "initi.h"
#include "mfrc522.h"
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit D1=P2^3;
unsigned int flg=0;//存入判断标志
unsigned int flg1=0;//读取判断标志
unsigned int flg2=0;
extern unsigned char idata g_ucTempbuf[20];
extern unsigned char idata array[9];
extern unsigned char idata brray[9];
void SaveCard();//存卡函数
void DeleteCard1();//删当前卡函数
void Keypros();void main( )
{
unsigned char status,i;
P2 = 0xff;
P0 = 0xff;
LCD_init();
LCD_clear(100);
LCD_init(); //初始化LCD模块
ChineseChar(14,10,2,colors[2],colors[7],1);
ChineseChar(38,10,2,colors[2],colors[7],2);
ChineseChar(62,10,2,colors[2],colors[7],3);
ChineseChar(86,10,2,colors[2],colors[7],4);
InitializeSystem( );
PcdReset();
PcdAntennaOff();
PcdAntennaOn();
while ( 1 )
{
//Int1Init();
status = PcdRequest(PICC_REQALL, g_ucTempbuf);//寻卡
if (status != MI_OK)
{
continue;
}
display_type();//显示
/* printf("卡的类型:");
for(i=0;i<2;i++)
{
temp=g_ucTempbuf[i];
printf("%X",temp);
}
*/
status = PcdAnticoll(g_ucTempbuf);
if (status != MI_OK)
{
continue;
}
display_cardnum();//显示寻到的卡的序列号
FM_QI= 0; //蜂鸣器
delay_ms(100);
FM_QI= 1;
delay_ms(100);
FM_QI= 0;
delay_ms(200);
FM_QI= 1;
PcdHalt();
SaveCard();
DeleteCard(); //全部删掉
LCD_clear(5);
for(i=0;i<6;i++)
{
if(k3==0)
{
delay_ms(1); //消抖处理
if(k3==0)
{
DeleteCard1(); //删掉当前一张
if(flg2==1)
{
flg1=0;
break;
}
}
}
else
{
Keypros();
}
}
}
}
void SaveCard()//存卡函数
{
unsigned int i;
if(k1==0)
{
delay_ms(1); //消抖处理
if(k1==0)
{
switch(flg)
{
case 0:
for(i=0;i<8;i++)
{
At24c02Write(i,brray[i]); //在地址内写入数据
delay_ms(5);
}break;
case 1:
for(i=0;i<8;i++)
{
At24c02Write(i+8,brray[i]); //在地址内写入数据
delay_ms(5);
}break;
case 2:
for(i=0;i<8;i++)
{
At24c02Write(i+16,brray[i]); //在地址内写入数据
delay_ms(5);
}break;
case 3:
for(i=0;i<8;i++)
{
At24c02Write(i+24,brray[i]); //在地址内写入数据
delay_ms(5);
}break;
case 4:
for(i=0;i<8;i++)
{
At24c02Write(i+32,brray[i]); //在地址内写入数据
delay_ms(5);
}break;
default:
break;
}
flg=flg+1;
if(flg==5)
{
flg=0;
}
}
}
}void DeleteCard1()//删当前卡函数
{
unsigned int i;
switch(flg1)
{
case 0:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 1:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+8); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 2:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+16); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 3:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+24); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 4:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+32); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
default:
break;
}
array[8]='\0';
if(array[0]==brray[0]&&array[1]==brray[1]&&array[2]==brray[2]&&array[3]==brray[3]&&array[4]==brray[4]&&array[5]==brray[5]&&array[6]==brray[6]&&array[7]==brray[7])
{
D1=1;
flg2=1;
ChineseChar(14,10,2,colors[2],colors[7],11);
ChineseChar(38,10,2,colors[2],colors[7],12);
ChineseChar(62,10,2,colors[2],colors[7],7);
ChineseChar(86,10,2,colors[2],colors[7],8);
switch(flg1)
{
case 0:
for(i=0;i<8;i++)
{
At24c02Write(i,0); //在地址内写入数据
delay_ms(5);
}break;
case 1:
for(i=0;i<8;i++)
{
At24c02Write(i+8,0); //在地址内写入数据
delay_ms(5);
}break;
case 2:
for(i=0;i<8;i++)
{
At24c02Write(i+16,0); //在地址内写入数据
delay_ms(5);
}break;
case 3:
for(i=0;i<8;i++)
{
At24c02Write(i+24,0); //在地址内写入数据
delay_ms(5);
}break;
case 4:
for(i=0;i<8;i++)
{
At24c02Write(i+32,0); //在地址内写入数据
delay_ms(5);
}break;
default:
break;
}
}
else
{
flg1=flg1+1;
}
}void DeleteCard()//删全部卡函数
{
unsigned int i;
if(k2==0)
{
delay_ms(1); //消抖处理
if(k2==0)
{
for(i=0;i<40;i++)
{
At24c02Write(i,0); //在地址内写入数据
delay_ms(5);
}
ChineseChar(14,10,2,colors[2],colors[7],11);
ChineseChar(38,10,2,colors[2],colors[7],12);
ChineseChar(62,10,2,colors[2],colors[7],7);
ChineseChar(86,10,2,colors[2],colors[7],8);
flg=0;
}
}
}
void Keypros()
{
unsigned int i;
switch(flg1)
{
case 0:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 1:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+8); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 2:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+16); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 3:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+24); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
case 4:
for(i=0;i<8;i++)
{
array[i]=At24c02Read(i+32); //读取EEPROM地址内的数据保存在num中
delay_ms(5);
}break;
default:
break;
}
array[8]='\0';
if(array[0]==brray[0]&&array[1]==brray[1]&&array[2]==brray[2]&&array[3]==brray[3]&&array[4]==brray[4]&&array[5]==brray[5]&&array[6]==brray[6]&&array[7]==brray[7])
{
D1=0;
ChineseChar(14,10,2,colors[2],colors[7],5);
ChineseChar(38,10,2,colors[2],colors[7],6);
ChineseChar(62,10,2,colors[2],colors[7],7);
ChineseChar(86,10,2,colors[2],colors[7],8);
LCD_ShowString(12,80,colors[0],colors[5],array);
flg1=0;
}
else
{
flg1=flg1+1;
}
if(flg1==5)
{
D1=1;
ChineseChar(14,10,2,colors[2],colors[7],5);
ChineseChar(38,10,2,colors[2],colors[7],6);
ChineseChar(62,10,2,colors[2],colors[7],9);
ChineseChar(86,10,2,colors[2],colors[7],10);
flg1=0;
}
}
void InitializeSystem()//系统初始化
{
TMOD=0x21; //设T0为方式1,GATE=1;
SCON=0x50;
TH1=0xFA; //波特率为4800bps
TL1=0xFA;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
TI=1;
EA=1; //开启总中断
ES = 1;
RI = 1;
}