基于MFRC522的门禁系统的设计与实现
时间:2023-05-17 20:07:00
目录
1、MFRC522简介
2、概述
3、硬件设计
4、软件设计
5、实物测试
1、MFRC522简介
MFRC522是高度集成的非接触式(13.56MHz)读写卡芯片。该发送模块利用调制和解调的原理,将其完全集成到各种非接触式通信方法和协议中。MFRC522采用先进的调制和解调概念,完全集成在13.56MHz支持 所有类型的被动非接触式通信方式和协议ISO14443A的多层应用。其内部发送器部分可驱动读写器天线与ISO14443A/MIFARE无需其他电路即可通信卡和应答机。接收器部分提供一个强大有效的解调和解码电路,用于处理ISO14443A兼容的应答器信号。处理数字部分ISO14443A帧和错误检测(奇偶)&CRC)。此外,它还支持快速CRYPTO1用于验证加密算法MIFARE系列产品。MFRC522支持MIFARE双向数据传输速率高达424kbit/s。
2、概述
该系统由STM32F103C8T6作为主控制器,外围配有蜂鸣器和蜂鸣器LED报警装置由灯组成;使用AC、DC电源适配器为整个系统供电;MFRC522射频识别芯片作为系统RFID读写器; 显示模块为0.96’OLED;并以ESP通过8266物联网芯片作为通信模块WiFi与中国移动OneNET云平台连接,将数据流发送到OneNET。
3、硬件设计
STM32F该系列属于中低端32位ARM该系列芯片是意大利半导体(ST)公司生产,其核心是Cortex-M3.这个系列的芯片是按片内的。Flash大小可分为三类:小容量(16K和32K)、中容量(64K和128K)、大容量(256K、384K和512K)。F103C8T6属于中容量产品,程序存储容量为64KB,需要电压2V~3.6V,工作温度为-40°C ~ 85°C。
报警装置主要由蜂鸣器和LED构成,当系统出现异常情况时(如读取的卡为伪卡等),LED灯会点亮,蜂鸣器鸣响,实现异常报警功能。
我采用0显示模块.96’OLED,即有机发光二极管(Organic Light-Emitting Diode),也叫有机电激光显示(Organic Electroluminesence Display)。OLED由于具有自发光、无背光源、对比度高、厚度薄、视角广、反应速度快、柔性面板、使用温度范围广、结构简单、工艺简单等优良特点,被认为是下一代平面显示器的新兴应用技术。
我采用了MG995舵机作为门禁驱动装置。舵机上有三条线,分别是VCC、GND、信号线。控制信号通常需要20个周期ms的PWM信号。VCC、GND另外需要驱动给舵机供电,必须与开发板共用,控制相对简单。最大扭矩可达13KG/cm,满足设计要求。
我选择了通信ATK-ESP8266WIFI模块与中国移动OneNET云平台连接。ATK-ESP8266是ALIENTEK一款高性能的 UART-WiFi(串口-无线 WIFI)模块,ATK-ESP8266 模块支持 LVTTL 串口,兼容 3.3V 和 5V 单片机系统,与产品连接方便。模块支持串口转 WIFI STA、串口转 AP 和 WIFI STA WIFI AP 模式,快速构建串口-WIFI 数据传输方案,方便设备使用互联网传输数据。
4、软件设计
部分源码
主函数
2位响应优先级 OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS(); //清屏 while(1) { RC522_Handel(); } }2位响应优先级 OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS(); //清屏 while(1) { RC522_Handel(); } }
我们需要提前获得我们空白卡的16进制序列号(烧录程序后可以直接读取,一般有8个字母 数字,比如af123456),我们将其转换为10进制数组,存储(两两一组合)OLED读出来的还是十六进制。
unsigned char card_hy[4]= {12,34,138,199}unsigned char card_zp[4]= {26,49,39,25};//以十进制的形式存放
寻卡函数
#include "sys.h"#include "rc522.h"#include "delay.h"#include "usart.h"#include "string.h"#include "OLED_I2C.h"#include "pwm.h"/********************************连线说明:*1--SDA <----->PA4*2--SCK <----->PA5*3--MOSI <----->PA7*4--MISO <----->PA6*5--悬空*6--GND <----->GND*7--RST <----->PB0*8--VCC <----->VCC************************************//*全局变量*/unsigned char CT[2];//卡类型unsigned char SN[4]; //卡号unsigned char RFID[16];//存放RFIDunsigned char card_hy[4]= {12,34,138,199};unsigned char card_zp[4]= {26,49,39,25}; u8 KEY[6]= {0xff,0xff,0xff,0xff,0xff,0xff};/*函数声明*/unsigned char status;unsigned char s=0x08;unsigned char string1[10];unsigned char string2[10];#define RC522_DELAY() delay_us(20)void RC522_Handel(void){ status = PcdRequest(PICC_REQALL,CT);//寻卡 if(status==MI_OK)// 寻卡成功 { status=MI_ERR; status = PcdAnticoll(SN);// 防冲撞 } if (status==MI_OK)// 防冲撞成功 { OLED_CLS(); //清屏 status=MI_ERR; OLED_ShowCN(16,0,6); OLED_ShowCN(16+16,0,7); sprintf((char*)string1,"%02x%02x%02x%02x",SN[0],SN[1],SN[2],SN[3]); OLED_ShowStr(16+40,0,string1,2); if((SN[0]==card_hy[0])&&(SN[1]==card_hy[1])&&(SN[2]==card_hy[2])&&(SN[3]==card_hy[3])) { OLED_ShowCN(16,2,2); OLED_ShowCN(16+16,2,3); OLED_ShowCN(16+40,2,0); OLED_ShowCN(16+56,2,1); OLED_ShowCN(16,4,4); OLED_ShowCN(16+16,4,5); OLED_ShowStr(16+40,4,"031940306",2); OLED_ShowCN(32,6,8); OLED_ShowCN(16+32,6,9); OLED_ShowCN(16+48,6,10); OLED_ShowCN(16+64,6,11); TIM_SetCompare1(TIM1,190); delay_ms(500); TIM_SetCompare1(TIM1,175); } if((SN[0]==card_zp[0])&&(SN[1]==card_zp[1])&&(SN[2]==card_zp[2])&&(SN[3]==card_zp[3])) { OLED_ShowCN(16,2,2); OLED_ShowCN(16+16,2,3); OLED_ShowCN(16+40,2,12); OLED_ShowCN(16+56,2,13); OLED_ShowCN(16,4,4); OLED_ShowCN(16+16,4,5); OLED_ShowStr(16+40,4,"031940720",2); OLED_ShowCN(32,6,8); OLED_ShowCN(16+32,6,9); OLED_ShowCN(16+48,6,10); OLED_ShowCN(16+64,6,11); TIM_SetCompare1(TIM1,190); delay_ms(500); TIM_SetCompare1(TIM1,175); } status =PcdSelect(SN); }
5、实物测试
数据读取测试:提前向STM32F103C8T6单片机中写入用户信息,本系统中录入两名同学的学号和姓名,当阅读器识别到系统中已录入的卡时,可将卡号、姓名、学号等信息一并展示在OLED。
防碰撞测试:为更清晰的观察到防冲突实验现象,在本系统测试时分别采用一张录入STM32系统的卡和一张不录入系统的卡进行测试,本系统通过对IC卡内独一无二的十六进制序列号进行判断,最终读取卡内信息。这种方法可以保证任何情况下都能选出一张卡片。
射频距离测试:为实际检测RFID阅读器阅读距离,我们分别将2张RC522-IC卡放在阅读器的1-10cm处进行测试,检测阅读器响应结果,具体测试情况如下表所示。
测试距离 |
卡1响应结果 |
卡2响应结果 |
10cm |
不响应 |
不响应 |
9cm |
不响应 |
不响应 |
8cm |
不响应 |
不响应 |
7cm |
不响应 |
不响应 |
6cm |
响应 |
不响应 |
5cm |
响应 |
响应 |
4cm |
响应 |
响应 |
3cm |
响应 |
响应 |
2cm |
响应 |
响应 |
1cm |
响应 |
响应 |
根据上述测试可以发现,理论上RFID阅读器的射频距离可达10cm,但是在实际应用中, RC522-IC卡与RFID阅读器之间距离约为5cm左右时,RFID才能够读取到卡内信息。
系统综合测试:首先给该系统上电,首先将未录入信息的IC卡靠近RFID阅读器,识别不成功。然后将RC522-IC卡靠近RFID阅读器后阅读器识别成功,OLED上显示用户信息,舵机转动