(1)实验平台:
普中STM32-F103-创客开发套件https://item.taobao.com/item.htm?id=917544208443(2)资料下载:普中科技-各型号产品资料下载链接
智能门禁系统,又称出入管理控制系统(ACCESS CONTROL SYSTEM),是一种管理人员进出的智能化管理系统。可通过RFID、密码锁、指纹识别等传感器采集数据并进行处理分析后,实现对进出人员的身份验证和记录。本章我们基于智能门禁系统板将密码、指纹、RFID功能进行汇总,最终实现智能门禁。本章分为如下几部分内容:
33.1 实验介绍
33.1.1 实验简介
在我们智能门禁系统中主要实现密码键盘、指纹、RFID射频卡解锁。密码键盘可实现密码修改、删除,在修改或删除密码前需通过管理员密码校验方可操作;密码键盘还可以用于指纹添加、删除操作,RFID磁卡写入特定信息用于解锁。其结构图如下:
本章主要将密码、指纹和RFID整合一起实现智能门禁。
33.1.2 实验目的
系统运行后,可实现密码、指纹、RFID解锁,指纹密码添加、修改、删除等功能。
33.2 硬件设计
本实验使用到硬件资源如下:
(1)STM32 GPIO
(2)LED模块
(3)USART1串口
(4)USB转TTL模块
(5)蜂鸣器模块
(6)RTC模块
(7)EEPROM模块
(8)IIC OLED模块
(9)4*4矩阵键盘模块
(10)HLK-FPM383C指纹模块
(11)RC522射频卡模块
相关电路在前面章节已经介绍过,此处省略。
33.3 软件设计
33.3.1 创建和配置工程
同样的在 STM32CubeIDE 中复制前面实验的工程,然后将工程文件名和.ioc 文件名均修改为27_rc522_lock,如下图所示:
在前面实验章节中.ioc文件已配置好,可打开工程查看。
修改完之后,按下键盘的“Ctrl+S”组合键保存27_rc522_lock.ioc 文件,系统开始生成初始化代码。生成工程文件目录如下图所示:
在工程的BSP文件夹下新建rc522文件夹,并在该文件夹内新建rc522.c和rc522.h文件,用于保存RC522射频卡相关驱动,这些一般厂家都有提供,直接移植即可。在Appmain文件夹内新建rfid_input.c和rfid_input.h文件,用于保存RFID应用程序。如下所示:
添加完以后,如果有自己创建的文件夹,且文件夹内有头文件,工程中调用了该头文件,必须记得在工程中添加头文件路径,同时将源文件与工程关联一起,如下图所示:
33.3.2 添加用户驱动代码
33.3.2.1 rfid_input.c文件
代码如下:
/*
要写入RC522的数据
[0][1][2]:0xA0 0xA1 0xA2为校验位 代表该卡存储的数据是指定的磁卡型号
[3]:磁卡ID,固定为0X18
*/
u8 WriteRC522Data[16] = {0xA0,0xA1,0xA2,0x18,0,0,0,0,0,0,0,0,0,0,0,0};
//rfid匹配
void rfid_mate(void)
{
u8 TempWriteRC522Data[16]; //存储RFID读取数据
//检测磁卡失败
if(ReadDataBlock(SaveRC522Block,TempWriteRC522Data) != MI_OK)
{
}
//磁卡检测OK
else
{
//属于规定型号的磁卡
if(TempWriteRC522Data[0]==0xA0 && TempWriteRC522Data[1]==0xA1 && TempWriteRC522Data[2]==0xA2)
{
// printf("RC522 OK\r\n");
if(TempWriteRC522Data[3]==0x18)
{
BEEP_Alarm(2, 20);//开锁
RELAY(1);
time3_start(1);//打开定时器
sys_ctrl.openflag=1;//键盘密码开锁
}
}
}
}
磁卡检测成功后,继电器触发,蜂鸣器响。
33.3.2.2 set_parm.c文件
新增代码如下:
//RFID磁卡设置窗口显示
void rfid_window_show(void)
{
OLED_Clear();
//磁卡设置
OLED_ShowFontHZ(16*0+20,0,20,16,1);
OLED_ShowFontHZ(16*1+20,0,21,16,1);
OLED_ShowFontHZ(16*2+20,0,14,16,1);
OLED_ShowFontHZ(16*3+20,0,15,16,1);
//请靠近感应区
OLED_ShowFontHZ(16*0,20,47,16,1);
OLED_ShowFontHZ(16*1,20,48,16,1);
OLED_ShowFontHZ(16*2,20,49,16,1);
OLED_ShowFontHZ(16*3,20,50,16,1);
OLED_ShowFontHZ(16*4,20,51,16,1);
OLED_ShowFontHZ(16*5,20,52,16,1);
}
//RFID磁卡设置
void set_rfid(void)
{
rfid_window_show();//RFID磁卡窗口显示
while(1)
{
if(WriteDataBlock(SaveRC522Block,WriteRC522Data,16) != MI_OK)
{
OLED_ShowString(0, 40, "Write Error! ", 16);
OLED_Refresh_Gram();
delay_ms(100);
OLED_ShowString(0, 40, " ", 16);
}
else
{
OLED_ShowString(0, 40, "Write Success!", 16);
OLED_Refresh_Gram();
delay_ms(100);
break;
}
//返回上一级菜单
if(sys_ctrl.key==16)
{
BEEP_Alarm(2, 20);//提示音
sys_ctrl.key=0;
return;
}
//返回主菜单
else if(sys_ctrl.key==15)
{
BEEP_Alarm(2, 20);//提示音
sys_ctrl.key=0;
sys_ctrl.page=0;
return;
}
//刷新显示缓存
OLED_Refresh_Gram();
}
}
//系统参数设置
void sys_parm_set(void)
{
u8 set_parm_flag=0;//默认为密码
//管理员密码校验
manager_check();
parm_set_show();//参数设置界面显示
while(1)
{
//参数设置界面显示
if(sys_ctrl.page==2)
{
//选择设置参数选项
if(sys_ctrl.key==13)
{
BEEP_Alarm(2, 20);//提示音
sys_ctrl.key=0;
set_parm_flag++;
if(set_parm_flag>2)set_parm_flag=0;
set_main_arrow_show(set_parm_flag);//设置主界面选择箭头显示
}
//确定
else if(sys_ctrl.key==12)
{
BEEP_Alarm(2, 20);//提示音
sys_ctrl.key=0;
switch(set_parm_flag)
{
case 0://密码设置
set_password();
break;
case 1://指纹设置
set_finger();
break;
case 2://磁卡设置
set_rfid();
break;
}
parm_set_show();//参数设置界面显示
set_main_arrow_show(set_parm_flag);//设置主界面选择箭头显示
}
//返回主菜单
else if(sys_ctrl.key==16 || sys_ctrl.key==15)
{
BEEP_Alarm(2, 20);//提示音
sys_ctrl.key=0;
sys_ctrl.page=0;
return;
}
//刷新显示缓存
OLED_Refresh_Gram();
}
else break;
}
}
33.4 实验现象
将程序编译下载到目标板运行,实验现象:
①进入主界面显示,OLED显示日期时间和星期,如下所示:
键盘密码和指纹操作的功能在前面已经介绍过,这里重点介绍RFID功能。
②进入设置界面,选择磁卡模式,给新磁卡数据块写入数据,用于后续RFID识别,如下所示:
进入该模式后,需将磁卡靠近RC522感应区,实现数据写入,如下所示:
写入数据成功时,会显示“Write Success!”,然后回到主界面时,就可以用这张写入数据的磁卡去解锁。