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]);
}
}