【普中 STM32-F103-创客(套件)开发攻略】-- 第 33 章 智能门禁实验-密码&指纹&RFID

STM32智能门禁系统实现

 (1)实验平台:

普中STM32-F103-创客开发套件​https://item.taobao.com/item.htm?id=917544208443(2)资料下载:普中科技-各型号产品资料下载链接


        智能门禁系统,又称出入管理控制系统(ACCESS CONTROL SYSTEM),是一种管理人员进出的智能化管理系统。可通过RFID、密码锁、指纹识别等传感器采集数据并进行处理分析后,实现对进出人员的身份验证和记录。本章我们基于智能门禁系统板将密码、指纹、RFID功能进行汇总,最终实现智能门禁。本章分为如下几部分内容:

 

33.1 实验介绍

33.1.1 实验简介

33.1.2 实验目的

33.2 硬件设计

33.3 软件设计

33.3.1 创建和配置工程

33.3.2 添加用户驱动代码

33.3.2.1 rfid_input.c文件

33.3.2.2 set_parm.c文件

33.4 实验现象


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!”,然后回到主界面时,就可以用这张写入数据的磁卡去解锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值