RFID门禁系统

该实验旨在通过51单片机控制MFRC522读卡器读取S50卡,读卡成功后点亮LED,对比卡ID以模拟解锁过程。实验中,读卡失败灯灭,匹配卡ID则开锁并蜂鸣。程序实现了RFID卡的读取、ID比较及LED和蜂鸣器控制功能。
摘要由CSDN通过智能技术生成

一、实验目的

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文件,然后在开发板上,当目标卡靠近时,蜂鸣器响起,并且亮灯,开锁;当别的卡靠近,蜂鸣器不响,灯不亮。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值