基于MFRC522的门禁系统的设计与实现 您所在的位置:网站首页 门禁系统概述图 基于MFRC522的门禁系统的设计与实现

基于MFRC522的门禁系统的设计与实现

2024-01-13 18:13| 来源: 网络整理| 查看: 265

目录

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;并以ESP8266物联网芯片作为通信模块,通过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、信号线。控制信号一般要求周期为20ms的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、软件设计  

​部分源码

主函数

#include "delay.h" #include "sys.h" #include "usart.h" #include "pwm.h" #include "rc522.h" #include "OLED_I2C.h" int main(void) { TIM1_PWM_Init(199,7199);//不分频。PWM频率===(7200*200)/72000000=0.02=20ms delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级 uart_init(115200); //串口初始化为115200 RC522_Init(); //初始化射频卡模块 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3);//设置中断优先级分组为组3:2位抢占优先级,2位响应优先级 OLED_Init(); //OLED初始化 delay_ms(50); OLED_CLS(); //清屏 while(1) { RC522_Handel(); } }

我们要提前获取到我们空白卡的十六进制序列号(烧录程序后可直接读出来,一般为字母+数字共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];//存放RFID unsigned 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上显示用户信息,舵机转动



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有