锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

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

时间:2023-01-19 18:00:00 面板led连接器dc

目录

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、信号线。控制信号通常需要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、软件设计

部分源码

主函数

#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抢占优先级,二位响应优先级     uart_init(115200);   //串口初始化为115200     RC522_Init();       ///      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_3)//设置中断优先级分组为3: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];//存放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上显示用户信息,舵机转动

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章