目录

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的门禁系统的设计与实现相关推荐

  1. 【毕业设计】基于RFID的门禁系统 - 单片机 物联网 嵌入式 stm32

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  2. 物联网毕业设计 基于RFID的门禁系统

    文章目录 1 简介 2 绪论 2.1 课题背景与目的 3 射频识别 3.1 射频识别技术 3.2 射频识别模块 3.2.1 RFID模块 3.2.2 RFID模块组成 4 系统设计 4.1 系统架构 ...

  3. 【毕业设计】基于单片机的门禁系统 - 嵌入式 物联网

    文章目录 1 简介 2 课题背景 3 详细设计 3.1 整体设计方案 3.2 功能模块 3.3 软件设计 4 实现效果 5 部分实现代码 6 最后 1 简介 Hi,大家好,这里是丹成学长,今天向大家介 ...

  4. 【基于Arduino RFID门禁系统】

    基于Arduino RFID门禁系统 介绍 射频识别或RFID(Radio-Frequency Identification)是一种通过无线电信号进行自动识别,通过RFID标签检索和存储数据的方法. ...

  5. 【基于RFID的门禁系统】

    本文为毕业设计分享,门禁系统已经很多了,本人做的就只是参考刷卡门禁系统,在里面添加一些自己的需求,设计时参考了其他资料,并综合了其他作品的功能,主要包含后台设置和刷卡以及密码等功能,该设计还是能够满足 ...

  6. 基于android的门禁系统代码,基于ESP8266 base on esp8266门禁系统 安卓源码

    基于ESP8266门禁系统安卓源码 视频中的小伙伴是我的搭档,负责硬件电路搭建,为了搭电路没少熬夜,挺感谢他的. 这是本人的毕业设计(专科)历时一个月完成.在做毕业设计之前一直在准备转本考试,考完试, ...

  7. 基于STM32的门禁系统源码分享

    哈哈哈,今晚把电脑里面以前做的库存都分享出来了.给大家一个参考吧.这个的功能好像还有点多,有一年了,我也记不清了.我记得是有 一个门禁的指纹录入,门禁的RFID卡录入,显示当前刷卡或者按指纹的是谁,以 ...

  8. 毕设-基于STM32刷卡、指纹的门禁系统的设计与实现(进阶版)

    简介 上面一篇文章已经将指纹模块的驱动原理讲解明白,本文就详细介绍以下整个系统是如何实现的. 实现功能 系统要求如下: 1)使用RC522与指纹模块控制门的打开 2)添加IC卡和指纹数据 3)语音播报 ...

  9. 【语音识别】基于智能语音识别门禁系统matlab源码含GUI

    一.简介 本文基于Matlab设计实现了一个文本相关的声纹识别系统,可以判定说话人身份. 1 系统原理 a.声纹识别     这两年随着人工智能的发展,不少手机App都推出了声纹锁的功能.这里面所采用 ...

最新文章

  1. R语言常用线性模型特征筛选(feature selection)技术实战:基于前列腺特异性抗原(PSA)数据
  2. HDU 1847 Good Luck in CET-4 Everybody!
  3. 读秦小波《设计模式之禅》 -- 单例模式
  4. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...
  5. AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
  6. python免杀技术---shellcode的加载与执行
  7. Linux下TI omap芯片 MUX 配置分析(以AM335X芯片为例)
  8. (机器学习/计算机视觉/深度学习)代码
  9. 一、操作系统——处理机(作业)调度算法:先来先服务算法FCFS、最短作业优先算法SJF(非抢占式)、 最短剩余时间优先算法SRTN(抢占式)、最高响应比优先算法HRRN
  10. 每周到岗上班3天,2天可在家办公!携程3+2工作模式来了
  11. 使用方法 ros_大白菜的ROS笔记(8)(创建TF广播和监听,内容很多,细节满满)...
  12. HTMLCSS入门学习
  13. 我是如何用单例模式征服面试官的?
  14. win10使用命令提示符启用/关闭远程桌面
  15. 中国省市县地区代码数据库文件
  16. 根据卫星星历在cesium画卫星轨迹
  17. Excel表格快捷键使用
  18. 气压传感器c语言程序,气压芯片参数——以气压传感器芯片DSH553为例
  19. 如何查询oracle 的版本
  20. android性能测试自动化,Android App自动化性能测试探究

热门文章

  1. oracle执行计划time单位,Oracle中查看执行计划
  2. 可变悬挂调节软硬_可变悬架软硬怎么调节高度
  3. 这届年轻人为什么不过618?
  4. WiFi分销小程序3.0.9独立版
  5. 动态路由rip配置命令
  6. Android学习网站(1)
  7. CMAKE_INSTALL_PREFIX
  8. StringUtils的使用
  9. Mysql innodb 间隙锁
  10. single-shot detection(SSD)目标检测算法详解——(一看就懂系列!!!)