一、实验目的
1. 了解RFID工作原理
2. 了解SPI通信协议
3. 了解MFRC522读卡器引脚功能。
4. 了解S50卡内部结构
5. 学会使用MFRC522读卡器读写S50卡
6. 学会控制LED灯亮灭。
7. 学会使用蜂鸣器发出报警声
三、实验项目要求
使用51单片机控制MFRC522读卡器读S50卡,读卡成功后点亮LED1灯;然后比对卡ID是否为已注册卡号,是则开锁成功(用LED2灯模拟,开锁成功灯亮,并且蜂鸣器响一下),否则灯灭。
请按要求设计一个可行方案,包括设备选型、系统连接图等,并编写程序实现上述功能。
四、实验步骤
1. 设计方案
①方案:51单片机连接读卡器,设置引脚,使用51单片机控制MFRC522读卡器读S50卡,通过MFRC522读卡装置模拟简易密码锁解锁过程
引脚设计:
sbit led_card=P2^7;//读卡
sbit led_lock=P2^6; //开锁
sbit beep=P2^5;
②系统连接图:
2. 编写源程序,编译,生成hex文件
源程序:
#include <config.h>
#include <rc522.h>
#include <uart.h>
#include <beep.h>
u8 CardRevBuf[16] = { 0 }; //存放从卡片接收到的数据
u8 code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//默认密码
u8 Card_ID[4];
u8 Key_ID[4]={0x29,0x23,0xC5,0xBD};//存放添加进来的卡号
u8 IDBuf[4];
sbit led_card=P2^7;//读卡
sbit led_lock=P2^6; //开锁
sbit beep=P2^5;
void NumTostr(u8 *SrcBuf)
{
u8 *p=IDBuf,Tmp, i;
for( i = 0; i < 4; i++ )
{
Tmp = ( ( *SrcBuf ) >> 4 ) & 0x0F;
if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
{
*p ++ = '0' + Tmp;
}
else
{
*p ++ = 'A' + Tmp - 10;
}
Tmp = ( *SrcBuf ) & 0x0F;
if( ( Tmp >=0 ) && ( Tmp <= 9 ) )
{
*p ++ = '0' + Tmp;
}
else
{
*p ++ = 'A' + Tmp - 10;
}
SrcBuf ++;
}
*p ++ = '\0';
}
void main()
{
u8 flag=0,j,i,snr=0,find=0;
init_rc522();
uart_init(9600);
uart_send_str("hello");
while(1)
{
//操作卡
if( PcdRequest( PICC_REQIDL, &CardRevBuf[0] ) == MI_OK )//寻天线区内未进入休眠状态的卡,返回卡片类型 2字节
{
if( PcdAnticoll( &CardRevBuf[2] ) == MI_OK ) //防冲撞,返回卡的序列号 4字节
{
if( PcdSelect( &CardRevBuf[2] ) == MI_OK )//选卡
{
if(PcdAuthState(PICC_AUTHENT1A, (snr*4+3), DefaultKey, &CardRevBuf[2])== MI_OK ) // 校验1扇区密码,密码位于每一扇区第3块
{
flag=1;
Card_ID[0]=CardRevBuf[2];
Card_ID[1]=CardRevBuf[3];
Card_ID[2]=CardRevBuf[4];
Card_ID[3]=CardRevBuf[5];
NumTostr(&CardRevBuf[2]);
uart_send_str(IDBuf);
}
else flag=0;
}
else flag=0;
}
else flag=0;
}
else flag=0;
//LED灯的处理
if(flag)
{
led_card=0;
for(i=0;i<4;i++)
{
if(Card_ID[i]!=Key_ID[i]) break;
}
if(i==4)
{led_lock=0;
beep_on(500,1000);
}
else led_lock=1;
}
else
{
led_card=1;
led_lock=1;
}
}
}
3. 将hex文件下载到实验板运行,描述实验现象
实验现象:首先打开串口,通过串口连接,卡靠近时串口接收到卡号信息;把卡号信息添加到代码中,重新编译获取hex文件,然后在开发板上,当目标卡靠近时,蜂鸣器响起,并且亮灯,开锁;当别的卡靠近,蜂鸣器不响,灯不亮。