RFID课程设计–智能门禁系统
前言
本次课程设计要求如下,我们团队两人完成了90%的功能。
其中我们设置的是刷卡错误3次不报警,密码输入错3次报警(原理相同,大家根据需要自行修改)
然后暂时只能显示卡号和卡是第几个录入到系统中的,想到身份证号和电话(身份信息)输进去有点长就没花太多心思,想实现这个功能会写卡就可以了。这是我的队友 kiro_1023
最初版设计
完整版工程文件下载链接
RFID课程设计工程文件,基于STM32F103RCT6的智能门禁系统
摘要
本次课程设计项目完成了一款以STM32F103RCT6单片机为控制中心门禁系统设计。通过RC522模块实现录入卡和刷卡身份识别的功能;4*4矩阵按键模块实现密码的输入和功能的切换;继电器模块和电磁铁控制控制门的开关;DHT11模块采集室内温湿度数据;OLED显示屏显示菜单和各类数据。刷卡验证和密码的验证给门禁系统添加了双重的保险,简约的OLED显示的交互页面在保证信息显示完整的同时也极大地减少了用户的阅读量,降低了操作难度,方便使用。
文章目录
一、系统的功能描述
首先有四个功能
A刷卡解锁
B输入密码解锁
C录入卡
D修改密码
A功能使用一个大数组card_sql[101]
,存放卡的卡号
存放格式为 1字节序号 4字节卡号
通过刷卡获取的卡号与passwd
数组内的卡号按格式校对,成功则开门,并在OLED上显示DHT11温湿度数据
B功能使用两个数组
passwd_scan
输入数据缓冲数组
passwd
当前密码存放数组
读取按键输入的有效键值存放到passwd_scan
中,输入4位后将passwd_scan
的四位数据与passwd
的四位密码进行一一校对
成功则返回成功标志,失败则返回失败标志
失败三次,报警,只能按*退出
C功能为录入不在card_sql
中的卡号
用追加的方式,将序号和卡号添加到card_sql
中
如果卡已经在库中会显示卡已存在而不进行录入
D功能是B功能的延伸
先输入旧密码,读取按键输入的有效键值存放到passwd_scan
中,输入4位后将passwd_scan
的四位数据与passwd
的四位密码进行一一校对,如果密码认证成功
输入新密码
同样以读取按键输入的有效键值存放到passwd_scan
中,输入4位后将passwd_scan
的四位数据与passwd
的四位密码进行替换
实现新密码的录入
二、系统整体设计
2.1方案描述
本作品通过四个功能解决门禁系统的基本设计要求,分别为A刷卡解锁,B密码解锁,C录入卡号,D修改密码。
通过OLED屏对作品的功能选择进行显示,还能够显示刷卡后状态以及密码输入的状态,利用矩阵按键控制门禁系统的功能选择以及密码输入部分,采用DHT11温湿度传感器模块接收实时的温湿度数据并从OLED屏上显示,开门部分则采用电磁铁模拟小区内开关门的控制部分。系统总体设计框图如图1-1所示。
注:来自队友的制作 这是我的队友 kiro_1023
2.2系统整体设计流程
系统功能流程图如图1-2所示,初始化完成后,OLED屏首先显示菜单界面,等待用户利用44矩阵按键选择功能。
若选择A功能则进入刷卡解锁功能,RC522能够识别并判断通过程序内存储的卡号控制电磁铁开门,同时OLED屏显示刷卡开门的卡号和卡内的身份,三秒后显示当地的温湿度数据,如果卡号并非程序内存储的卡号,则会提示刷正确的卡。
若选择B功能则进入密码解锁功能,用户输入四位密码与存储密码的数组比较,若正确则显示开门,三秒后显示当地的温湿度数据,如果密码错误则提示用户再输入一次,若用户输入错误密码超过三次,OLED屏则显示该功能已被禁用,只能按“”键退出该功能。
若选择C功能则进入录入信息功能,用户可将程序内没有存储的卡进行刷卡,刷卡后OLED屏会显示卡录入成功并显示卡号,如果用程序内已经存储的卡录入信息,OLED屏则会提示该卡已经存在。
若选择D功能则进入修改密码功能,用户需要先输入旧密码让程序进行与旧密码进行比对,若密码正确则进入修改密码界面,用户可以输入新的四位密码修改密码,若用户输入错误密码超过三次,OLED屏则显示该功能已被禁用,只能按“*”键退出该功能。
注:来自队友的制作 这是我的队友 kiro_1023
三、硬件单元的接口连接设计
3.1 硬件总体接线设计
硬件总体接线原理图如图2-1所示,在本系统中,我们采用STM32F103RCT6控制RC522射频模块、OLED屏、4*4矩阵键盘等模块来实现基本功能,并利用电磁铁模拟小区内门禁系统的开关门状态。
图中详细描述了各个模块与单片机各引脚的链接关系。
四、软件详细设计
我们的软件系统一共设计了4个功能,分别是A刷卡解锁、B输入密码解锁、C录入新卡、D修改密码。软件总体设计思路如图3-1所示。
刷卡解锁的软件设计思路如图3-3所示。
密码解锁功能流程图如图3-5所示。
修改密码的功能是密码解锁功能的延伸。当用户按下D进入修改密码模式后,单片机开始循环执行change_passwd()函数。
在change_passwd()函数中会经历输入旧密码的过程,此时输入旧密码的操作和密码解锁的操作完全相同。当旧密码输入正确后,进入新密码的输入循环,此时变量changePasswd用于存放输入新密码的位数,数组scan_key用来存放输入的密码值,当changePasswd等于4时表示已经输入了4位新密码,紧接着进入修改密码的操作。由于程序中lock_passwd指针指向的是存放初始密码的数组p_lock_passwd的首地址,所以修改密码就是将数组scan_key的值逐位赋给数组lock_passwd,从而实现密码替换的效果,若此时再进入密码解锁功能进行解锁时就需要输入新密码。
五、核心函数描述和注释
.c文件内函数简介(有注释,主要提供大家思路
main.c:
个人认为比较精髓的代码(可能是因为是自己理解然后自己写出来的):
因为卡号是4字节数据,而OELD显示屏的函数每次只能显示1个字符即半字节,例如:卡号为3B42A921
,虽然使用%X%X%X%X
在串口可以打印出来,但对于OLED显示屏中我们需要数据分位高低位存入长度为八字节的数组来依次显示。
OLED是通过
//将刷卡的卡号存入主函数的显示数组
*(oled_use_p++) = ((SN[0]>>4)>9) ?(SN[0]>>4)-10+'a' :(SN[0]>>4)+'0';
*(oled_use_p++) = ((SN[0]&0x0f)>9)?(SN[0]&0x0f)-10+'a':(SN[0]&0x0f)+'0';
*(oled_use_p++) = ((SN[1]>>4)>9) ?(SN[1]>>4)-10+'a' :(SN[1]>>4)+'0';
*(oled_use_p++) = ((SN[1]&0x0f)>9)?(SN[1]&0x0f)-10+'a':(SN[1]&0x0f)+'0';
*(oled_use_p++) = ((SN[2]>>4)>9) ?(SN[2]>>4)-10+'a' :(SN[2]>>4)+'0';
*(oled_use_p++) = ((SN[2]&0x0f)>9)?(SN[2]&0x0f)-10+'a':(SN[2]&0x0f)+'0';
*(oled_use_p++) = ((SN[3]>>4)>9) ?(SN[3]>>4)-10+'a' :(SN[3]>>4)+'0';
*(oled_use_p++) = ((SN[3]&0x0f)>9)?(SN[3]&0x0f)-10+'a':(SN[3]&0x0f)+'0';
*(oled_use_p++) = '\0';
刷卡成功后的DHT11数据显示函数
relay = 1;//继电器关闭,电磁铁不通电
OLED_ShowString(0,4,"T=");//oled显示
OLED_ShowString(48,4,"H=");
DHT11_Read_Data(&temp,&humi);//DHT11获取温湿度,存入temp(温度),humi(湿度)
TandH[0] = temp/10+'0';//存放高位
TandH[1] = temp%10+'0';//存放低位
TandH[2] = '%';
TandH[3] = '\0';
TandH[4] = humi/10+'0';
TandH[5] = humi%10+'0';
TandH[6] =