基于STM32的智能门禁系统设计与实现(全部资料)

STM32项目设计:自能门禁系统设计资料
简介:解锁方式为数字密码+指纹+射频卡+蓝牙 
一款基于STM32的自能密码锁设计,有四种解锁方式,分别是密码解锁、指纹解锁、FID卡解锁、蓝牙解锁,并且管理员拥有单独的管理密码。支持修改解锁密码、修改管理员密码、RFID卡录入与删除、指纹录入与删除,且具有掉电保存功能,当解锁失败,蜂鸣器报警提醒且显示屏显示“解锁失败”。
内容包括:
1.源代码
2.原理图+PCB
3.元件清单
4.软件流程图(仅供参考)
5.参考资料
6.模块资料手册
7.各种串口工具
8.蓝牙解锁软件
9.演习视频
10.外文翻译
11.学习资料(可以不看)
12.NEW参考技巧和常见问题
13.功能说明


项目介绍:
1、使用STM32F103C8T6单片机做主控芯片
2、使用LCD12864做显示屏,12864可显示汉字、数字、字母等。显示屏主页显示“自能电子密码锁”。
3、使用AS608做指纹识别,与单片机串口进行通讯。
4、使用RCC522做射频卡识别,可以使用射频卡进行解锁。
5、使用4*4矩阵键盘模拟数字0-9和其他功能。
6、使用HC-05蓝牙模块与手机通讯,可以使用手机解锁。
7、使用继电器带动电磁锁,继电器吸合电磁锁打开。
8、使用蜂鸣器做报警提示,当输出密码后,会自动报警。

基于STM32的智能门禁系统设计与实现
摘要

随着物联网技术的不断发展,智能门禁系统在安全防护领域得到了广泛应用。本文设计并实现了一种基于STM32F103C8T6单片机的智能门禁系统。该系统集成了LCD12864显示屏、AS608指纹识别模块、RC522射频卡识别模块、4*4矩阵键盘、HC-05蓝牙模块、继电器和蜂鸣器等组件,实现了多种解锁方式和报警功能。系统通过多种方式(指纹、射频卡、密码、手机蓝牙)进行身份验证,提高了门禁系统的安全性和便捷性。

1. 引言

智能门禁系统是现代安全防护的重要组成部分,广泛应用于家庭、办公室、学校等场所。本文设计的智能门禁系统以STM32F103C8T6单片机为核心,结合多种识别技术,实现了多种解锁方式和报警功能。系统通过LCD12864显示屏显示系统状态,使用AS608指纹识别模块和RC522射频卡识别模块进行身份验证,通过4*4矩阵键盘输入密码,使用HC-05蓝牙模块与手机通讯,通过继电器控制电磁锁的开关,使用蜂鸣器进行报警提示。系统具有高安全性、高可靠性和高便捷性,适用于多种应用场景。

2. 系统总体设计
2.1 系统架构

系统主要由以下几个部分组成:

STM32F103C8T6单片机:作为系统的核心,负责处理各种传感器数据和控制信号。
LCD12864显示屏:用于显示系统状态和提示信息。
AS608指纹识别模块:用于指纹识别,与单片机串口进行通讯。
RC522射频卡识别模块:用于射频卡识别,可以使用射频卡进行解锁。
4*4矩阵键盘:用于输入数字0-9和其他功能。
HC-05蓝牙模块:用于与手机通讯,可以使用手机解锁。
继电器:用于控制电磁锁的开关。
蜂鸣器:用于报警提示。
2.2 系统功能
指纹识别解锁:用户可以通过指纹识别进行身份验证,验证成功后继电器吸合,电磁锁打开。
射频卡识别解锁:用户可以通过射频卡进行身份验证,验证成功后继电器吸合,电磁锁打开。
密码输入解锁:用户可以通过4*4矩阵键盘输入密码进行身份验证,验证成功后继电器吸合,电磁锁打开。
手机蓝牙解锁:用户可以通过手机蓝牙模块发送解锁指令,验证成功后继电器吸合,电磁锁打开。
继电器控制电磁锁:继电器吸合时,电磁锁打开;继电器断开时,电磁锁关闭。
蜂鸣器报警提示:当用户输入密码后,蜂鸣器会发出报警提示。
LCD12864显示屏:显示系统状态和提示信息,主页显示“自能电子密码锁”。
3. 硬件设计
3.1 STM32F103C8T6单片机

STM32F103C8T6单片机是系统的核心,负责处理各种传感器数据和控制信号。该单片机具有高性能、低功耗和丰富的外设接口,能够满足系统的需求。

3.2 LCD12864显示屏

LCD12864显示屏用于显示系统状态和提示信息。该显示屏支持汉字、数字和字母的显示,通过4线SPI接口与STM32F103C8T6单片机通信。系统主页显示“自能电子密码锁”,其他页面显示系统状态和提示信息。

3.3 AS608指纹识别模块

AS608指纹识别模块用于指纹识别,与单片机串口进行通讯。该模块具有高识别率和低功耗,能够快速准确地识别用户的指纹。当用户将手指放在指纹识别模块上时,模块会将指纹数据发送给单片机进行验证。

3.4 RC522射频卡识别模块

RC522射频卡识别模块用于射频卡识别,可以使用射频卡进行解锁。该模块通过SPI接口与STM32F103C8T6单片机通信,当用户将射频卡靠近模块时,模块会读取卡内的数据并发送给单片机进行验证。

3.5 4*4矩阵键盘

4*4矩阵键盘用于输入数字0-9和其他功能。该键盘通过行扫描和列扫描的方式与STM32F103C8T6单片机通信,当用户按下按键时,单片机会读取按键值并进行处理。用户可以通过键盘输入密码进行身份验证。

3.6 HC-05蓝牙模块

HC-05蓝牙模块用于与手机通讯,可以使用手机解锁。该模块通过UART接口与STM32F103C8T6单片机通信,当用户通过手机发送解锁指令时,模块会将指令发送给单片机进行处理。单片机验证成功后,控制继电器吸合,电磁锁打开。

3.7 继电器

继电器用于控制电磁锁的开关。继电器通过GPIO接口与STM32F103C8T6单片机连接,当单片机接收到解锁指令时,控制继电器吸合,电磁锁打开;当单片机接收到锁门指令时,控制继电器断开,电磁锁关闭。

3.8 蜂鸣器

蜂鸣器用于报警提示。蜂鸣器通过GPIO接口与STM32F103C8T6单片机连接,当用户输入密码后,蜂鸣器会发出报警提示。此外,当系统检测到异常情况时,蜂鸣器也会发出报警提示。

4. 软件设计
4.1 系统初始化

系统初始化包括STM32F103C8T6单片机的初始化、LCD12864显示屏的初始化、AS608指纹识别模块的初始化、RC522射频卡识别模块的初始化、4*4矩阵键盘的初始化、HC-05蓝牙模块的初始化、继电器的初始化和蜂鸣器的初始化。初始化完成后,系统进入主循环,开始处理各种任务。

4.2 指纹识别

AS608指纹识别模块通过串口与STM32F103C8T6单片机通信,将指纹数据发送给单片机进行验证。单片机根据指纹数据进行匹配,验证成功后控制继电器吸合,电磁锁打开。验证失败时,蜂鸣器发出报警提示。

4.3 射频卡识别

RC522射频卡识别模块通过SPI接口与STM32F103C8T6单片机通信,读取射频卡内的数据并发送给单片机进行验证。单片机根据卡内数据进行匹配,验证成功后控制继电器吸合,电磁锁打开。验证失败时,蜂鸣器发出报警提示。

4.4 密码输入

4*4矩阵键盘通过行扫描和列扫描的方式与STM32F103C8T6单片机通信,当用户按下按键时,单片机会读取按键值并进行处理。用户可以通过键盘输入密码进行身份验证。单片机根据输入的密码进行匹配,验证成功后控制继电器吸合,电磁锁打开。验证失败时,蜂鸣器发出报警提示。

4.5 手机蓝牙解锁

HC-05蓝牙模块通过UART接口与STM32F103C8T6单片机通信,当用户通过手机发送解锁指令时,模块会将指令发送给单片机进行处理。单片机验证成功后,控制继电器吸合,电磁锁打开。验证失败时,蜂鸣器发出报警提示。

4.6 继电器控制

继电器通过GPIO接口与STM32F103C8T6单片机连接,当单片机接收到解锁指令时,控制继电器吸合,电磁锁打开;当单片机接收到锁门指令时,控制继电器断开,电磁锁关闭。

4.7 蜂鸣器报警

蜂鸣器通过GPIO接口与STM32F103C8T6单片机连接,当用户输入密码后,蜂鸣器会发出报警提示。此外,当系统检测到异常情况时,蜂鸣器也会发出报警提示。

4.8 LCD12864显示

LCD12864显示屏通过4线SPI接口与STM32F103C8T6单片机通信,单片机将系统状态和提示信息发送给显示屏,显示屏将信息直观地显示给用户。系统主页显示“自能电子密码锁”,其他页面显示系统状态和提示信息。

5. 系统测试
5.1 指纹识别测试

通过实际测试,AS608指纹识别模块能够快速准确地识别用户的指纹,验证成功后继电器吸合,电磁锁打开。测试结果显示,指纹识别模块的识别率高,响应速度快。

5.2 射频卡识别测试

通过实际测试,RC522射频卡识别模块能够准确读取射频卡内的数据,验证成功后继电器吸合,电磁锁打开。测试结果显示,射频卡识别模块的识别率高,响应速度快。

5.3 密码输入测试

通过实际测试,4*4矩阵键盘能够准确读取用户输入的密码,验证成功后继电器吸合,电磁锁打开。测试结果显示,密码输入功能稳定可靠,用户操作简便。

5.4 手机蓝牙解锁测试

通过实际测试,HC-05蓝牙模块能够与手机进行稳定通讯,用户可以通过手机发送解锁指令,验证成功后继电器吸合,电磁锁打开。测试结果显示,蓝牙解锁功能稳定可靠,用户操作简便。

5.5 继电器控制测试

通过实际测试,继电器能够根据单片机的指令准确控制电磁锁的开关。当单片机接收到解锁指令时,继电器吸合,电磁锁打开;当单片机接收到锁门指令时,继电器断开,电磁锁关闭。测试结果显示,继电器控制功能稳定可靠。

5.6 蜂鸣器报警测试

通过实际测试,蜂鸣器能够在用户输入密码后发出报警提示,当系统检测到异常情况时,蜂鸣器也会发出报警提示。测试结果显示,蜂鸣器的报警声音清晰,能够有效提醒用户。

5.7 LCD12864显示测试

通过实际测试,LCD12864显示屏能够准确显示系统状态和提示信息,用户可以直观地查看系统状态。测试结果显示,显示屏的显示效果良好,信息清晰。

6. 结论

本文设计并实现了一种基于STM32F103C8T6单片机的智能门禁系统。系统集成了LCD12864显示屏、AS608指纹识别模块、RC522射频卡识别模块、4*4矩阵键盘、HC-05蓝牙模块、继电器和蜂鸣器等组件,实现了多种解锁方式和报警功能。系统通过多种方式(指纹、射频卡、密码、手机蓝牙)进行身份验证,提高了门禁系统的安全性和便捷性。测试结果显示,系统功能完善,性能稳定,具有较高的实用价值。未来,可以进一步优化系统的识别算法,提高识别准确率,增加更多的智能控制功能,提升用户体验。

#include "delay.h"
#include "usart2.h"
#include "stdarg.h"	 	 
#include "stdio.h"	 	 
#include "string.h"	 
#include "timer.h"  

//串口接收缓存区 	
u8 USART2_RX_BUF[USART2_MAX_RECV_LEN]; 				//接收缓冲,最大USART2_MAX_RECV_LEN个字节.
u8 USART2_TX_BUF[USART2_MAX_SEND_LEN]; 			  //发送缓冲,最大USART2_MAX_SEND_LEN字节

//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过10ms,则认为不是1次连续数据.也就是超过10ms没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
vu16 USART2_RX_STA=0;   	


void USART2_IRQHandler(void)
{
	u8 res;	      
	if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据
	{	 
		res =USART_ReceiveData(USART2);		 
		if((USART2_RX_STA&(1<<15))==0)//接收完的一批数据,还没有被处理,则不再接收其他数据
		{ 
			if(USART2_RX_STA<USART2_MAX_RECV_LEN)	//还可以接收数据
			{
				TIM_SetCounter(TIM2,0);//计数器清空          				//计数器清空
				if(USART2_RX_STA==0) 				//使能定时器4的中断 
				{
					TIM_Cmd(TIM2,ENABLE);//使能定时器4
				}
				USART2_RX_BUF[USART2_RX_STA++]=res;	//记录接收到的值	 
			}else 
			{
				USART2_RX_STA|=1<<15;				//强制标记接收完成
			} 
		}
	}  				 											 
}   


//初始化IO 串口2
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率	  
void usart2_init(u32 bound)
{  

	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// GPIOA时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE); //串口2时钟使能

 	USART_DeInit(USART2);  //复位串口2
		 //USART2_TX   PA2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //PA2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
  GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化PA2
   
    //USART2_RX	  PA3
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //初始化PA3
	
	USART_InitStructure.USART_BaudRate = bound;//波特率设置
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
  
	USART_Init(USART2, &USART_InitStructure); //初始化串口2
  

	USART_Cmd(USART2, ENABLE);                    //使能串口 
	
	//使能接收中断
  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启中断   
	
	//设置中断优先级
	NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;		//子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器
	
	
	TIM2_Int_Init(99,7199);		//10ms中断
	USART2_RX_STA=0;		//清零
	TIM_Cmd(TIM2,DISABLE);			//关闭定时器4

}

//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)  
{  
	u16 i,j; 
	va_list ap; 
	va_start(ap,fmt);
	vsprintf((char*)USART2_TX_BUF,fmt,ap);
	va_end(ap);
	i=strlen((const char*)USART2_TX_BUF);		//此次发送数据的长度
	for(j=0;j<i;j++)							//循环发送数据
	{
	  while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
		USART_SendData(USART2,USART2_TX_BUF[j]); 
	} 
}

 


















### Java 文件操作中的权限问题解决方案 当遇到 `java.io.FileNotFoundException` 或者类似的异常提示 `(Access is denied)` 时,通常是因为程序试图访问或修改某个文件或目录时缺乏必要的权限。以下是可能的原因以及对应的解决方案: #### 原因分析 1. **目标路径的权限不足** 如果尝试在受保护的位置(如 C 盘根目录或其他受限区域)创建文件,则可能会因为操作系统级别的权限限制而失败[^3]。 2. **文件已被占用** 若目标文件已经被其他进程打开并锁定,则当前程序将无法对其进行写入或覆盖操作[^4]。 3. **用户账户控制 (UAC)** Windows 系统下的 UAC 功能可能导致即使是以管理员身份运行的应用也无法获得某些敏感位置的操作许可。 4. **网络驱动器或共享资源上的权限冲突** 当处理位于远程服务器或通过局域网挂载的存储设备上的数据时,可能存在额外的身份验证需求或是更严格的 ACL 设置阻止了正常流程执行。 5. **错误配置的安全策略** 错误设置的目标文件夹安全性选项也可能阻碍正常的读/写行为;比如未赋予 Everyone 组足够的权利来完成所需动作。 #### 解决策略 针对上述提到的各种可能性,这里给出几个可行的办法帮助克服此类障碍: ##### 方法一:调整保存路径至非特权区 建议把新建立文档放置于用户的个人资料空间内(例如 Documents),而不是系统盘或者其他特殊分区下。这样可以有效规避大部分由 OS 强加给开发者带来的不便之处。 ```java @Test public void createInUserDirectory(){ String userHome = System.getProperty("user.home"); String filePath = userHome + "\\Documents\\news1.txt"; File file = new File(filePath); try { boolean created = file.createNewFile(); if(created){ System.out.println("文件已成功创建!"); } }catch(IOException ex){ ex.printStackTrace(); } } ``` ##### 方法二:提升应用启动级别 如果确实有必要继续沿用原始指定地址的话,那么可以通过右击项目入口点(.bat,.jar etc.)选择“以管理员身份运行”,从而临时提高整个会话期间所享有的授权等级以便顺利完成任务。不过需要注意的是这种方法仅适用于桌面端环境,在服务模式或者自动化脚本场景里并不适用。 另外也可以考虑修改 MANIFEST.MF 中 Main-Class 的定义部分加入如下参数实现自动请求最高权限: ```properties Manifest-Version: 1.0 Main-Class: com.example.MainApp Request-UAC-Elevation: true ``` ##### 方法三:确认无竞争性锁存在 确保没有任何第三方软件正在使用即将要操纵的那个具体实例之前,请务必关闭所有关联窗口和服务进程后再试一次新的调用逻辑测试看效果如何变化。 ##### 方法四:审查并修正NTFS属性分配情况 前往涉及的具体子目录上面点击鼠标右键-> 属性 -> 安全标签页 ,检查现有列表里面是否有对应主体条目缺失或者是其拥有的作用范围不足以满足实际业务诉求 。如果没有发现合适的匹配项则手动新增进去即可解决问题。 --- ### 注意事项 尽管提供了多种途径去缓解这个问题的影响程度,但在生产环境中还是推荐遵循最小化原则只授予刚好够用的那一份功能集就好,避免过度开放带来不必要的安全隐患风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

科创工作室li

你的鼓励将是大学生的创作动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值