基于MFRC522的门禁系统的设计与实现
目录
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=20msdelay_init(); //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200RC522_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];//存放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上显示用户信息,舵机转动
基于MFRC522的门禁系统的设计与实现相关推荐
- 【毕业设计】基于RFID的门禁系统 - 单片机 物联网 嵌入式 stm32
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...
- 物联网毕业设计 基于RFID的门禁系统
文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...
- 【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网
文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介 ...
- 【基于Arduino RFID门禁系统】
基于Arduino RFID门禁系统 介绍 射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法. ...
- 【基于RFID的门禁系统】
本文为毕业设计分享,门禁系统已经很多了,本人做的就只是参考刷卡门禁系统,在里面添加一些自己的需求,设计时参考了其他资料,并综合了其他作品的功能,主要包含后台设置和刷卡以及密码等功能,该设计还是能够满足 ...
- 基于android的门禁系统代码,基于ESP8266 base on esp8266门禁系统 安卓源码
基于ESP8266门禁系统安卓源码 视频中的小伙伴是我的搭档,负责硬件电路搭建,为了搭电路没少熬夜,挺感谢他的. 这是本人的毕业设计(专科)历时一个月完成.在做毕业设计之前一直在准备转本考试,考完试, ...
- 基于STM32的门禁系统源码分享
哈哈哈,今晚把电脑里面以前做的库存都分享出来了.给大家一个参考吧.这个的功能好像还有点多,有一年了,我也记不清了.我记得是有 一个门禁的指纹录入,门禁的RFID卡录入,显示当前刷卡或者按指纹的是谁,以 ...
- 毕设-基于STM32刷卡、指纹的门禁系统的设计与实现(进阶版)
简介 上面一篇文章已经将指纹模块的驱动原理讲解明白,本文就详细介绍以下整个系统是如何实现的. 实现功能 系统要求如下: 1)使用RC522与指纹模块控制门的打开 2)添加IC卡和指纹数据 3)语音播报 ...
- 【语音识别】基于智能语音识别门禁系统matlab源码含GUI
一.简介 本文基于Matlab设计实现了一个文本相关的声纹识别系统,可以判定说话人身份. 1 系统原理 a.声纹识别 这两年随着人工智能的发展,不少手机App都推出了声纹锁的功能.这里面所采用 ...
最新文章
- R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
- HDU 1847 Good Luck in CET-4 Everybody!
- 读秦小波《设计模式之禅》 -- 单例模式
- java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
- AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
- python免杀技术---shellcode的加载与执行
- Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
- (机器学习/计算机视觉/深度学习)代码
- 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN
- 每周到岗上班3天,2天可在家办公!携程3+2工作模式来了
- 使用方法 ros_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
- HTMLCSS入门学习
- 我是如何用单例模式征服面试官的?
- win10使用命令提示符启用/关闭远程桌面
- 中国省市县地区代码数据库文件
- 根据卫星星历在cesium画卫星轨迹
- Excel表格快捷键使用
- 气压传感器c语言程序,气压芯片参数——以气压传感器芯片DSH553为例
- 如何查询oracle 的版本
- android性能测试自动化,Android App自动化性能测试探究