最近设计了一个项目基于单片机的多功能密码锁控制系统设计,与大家分享一下:
一、基本介绍
项目名:基于单片机的多功能密码锁的设计
单片机:STM32F103C8T6
功能简介:
1、通过4*4的矩阵键盘中的0-9为数字键,*为删除键,#为确定键,A为重置密码键,B为一键还原密码键,C为添加指纹,D为删除指纹
2、重置密码过程:管理员密码-->旧密码-->新密码-->再次新密码
3、一键还原:输入管理员密码,直接还原密码123456
4、添加指纹:输入管理员密码,再添加指纹
5、删除指纹:输入管理员密码,再删除指纹
6、通过AT24C02存储密码,实现掉电保存密码
7、当密码输入错误时,语音播报“密码不正确”,当指纹不匹配时,语音播报“指纹不匹配”,当输入密码或指纹总错误次数大于等于3次,进行锁定键盘及指纹模块3分钟,在此期间,每按一次按键都会蜂鸣器报警
8、通过继电器控制门磁锁,模拟开门和关门,当正确解锁时,语音播报“欢迎回家”
9、通过显示屏显示输入的密码(*号表示,防止被偷看),另外,输入密码可以前后加入扰乱码,只要包含正确密码即可
10、通过蓝牙模块可远程手机端进行开锁
二、32实物图
单片机型号:STM32F103C8T6
板子为绿色PCB板,两层板,厚度1.2,上下覆铜接地。元器件基本上为插针式,个别降压芯片会使用贴片式。
供电接口:TYPE-C
三、原理图
软件版本:AD2013
电路连线方式:网络标号连线方式
注意:原理图只是画出了模块的引脚图,而并不是模块的内部结构原理图
四、PCB图
由原理图导出,封装很大一部分都是作者自己绘制,不提供封装库,只提供连接好的源文件。中间有一个项目编号,隐藏在单片机底座下,插入单片机后不会看到。
两层板,上下覆铜接地。
五、系统框图
本设计以单片机为核心控制器,加上其他模块一起组成此次设计的整个系统,其中包括中控部分、输入部分和输出部分。中控部分采用了单片机控制器,其主要作用是获取输入部分的数据,经过内部处理,逻辑判断,最终控制输出部分。输入由三部分组成,第一部分是矩阵键盘模块,通过该模块可以输入密码、修改密码和指纹等;第二部分是指纹模块,用户可以通过该模块进行开锁;第三部分是供电模块,通过该模块可给整个系统进行供电。输出由五部分组成,第一部分是显示模块,通过该模块可以显示监测密码锁锁的开关及其修改密码等信息;第二部分是继电器模块,通过该模块看者门磁锁的开关;第三部分是声光报警模块,当错误次数大于3次,进行开锁时,进行蜂鸣器提醒;第四部分是语音输出模块,通过该模块播报开锁的情况;第五部分是存储模块,将修改的密码和指纹信息存储到该模块之中。除此之外还有蓝牙连接手机端,用户可以通过手机连接蓝牙看者门锁的开关,具体系统框图如图3.1所示。
六、软件设计流程
系统的主流程图如图4-2所示。在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,包括搜索指纹、添加指纹、输入密码等;紧接着进入第二个函数确认函数,输入密码对比正确,进入下一步,输入密码和用户密码不同,错误次数+1;然后进入锁定键盘函数,三次输入密码错误,锁定键盘3分钟,三分钟内检测到按键按下,声光报警10s;然后进入搜索指纹函数,指纹对比成功,进入下一步,指纹对比失败,错误次数+1;然后进入蓝牙操作函数,密码模数,直接看者门锁打开,在指纹加密码模数,先按指纹,然后输入密码进行开锁。
七、部分程序展示
软件版本:keil5
逻辑程序和驱动程序分开,分布于main.c和其他.c文件
*******蓝牙操作函数
*****/
void Bluetooth_function(void)
{
u16 data_len = 0, i = 0;
char data_temp[8] = {0};
if(USART1_WaitRecive() == 0) //如果接收到蓝牙数据
{
data_len = (u16)strlen((char*)usart1_buf);
if(flag_reset_password == 0 && flag_fop == 0 && data_len <= 12) //在开门界面
{
if(flag_mode == 1 || (flag_mode == 2 && flag_password == 0))
{
for(i = 0; i < 6; i++)
{
data_temp[i] = password[i]+'0';
}
if(strstr((char*)usart1_buf,data_temp) != NULL)
{
if(flag_mode == 1) //密码模式,开门
{
UsartPrintf(USART3,"欢迎回家");
Oled_Clear_All();
Oled_ShowCHinese(1,1,"指纹密码锁");
Oled_ShowCHinese(2,0,"门已打开");
DOOR = 1;
delay_ms(1500);
delay_ms(1500);
DOOR = 0;
Oled_ShowString(2,0," ");
Oled_ShowCHinese(2,0,"密码:");
if(flag_mode == 1)
{
Oled_ShowCHinese(4,0,"模式:密码");
}
else if(flag_mode == 2)
{
Oled_ShowCHinese(4,0,"模式:密码加指纹");
}
}
else if(flag_mode == 2) //指纹加密码模式,按手指
{
Oled_ShowCHinese(1,1,"指纹密码锁");
Oled_ShowCHinese(2,0,"请按手指");
Oled_ShowCHinese(4,0,"模式:密码加指纹");
flag_password = 1;
}
flag_error_num = 0;
password_num = 0;
memset(password_input,'\r',12);
}
else //用户密码与输入密码不相同,错误次数+1
{
flag_password = 0;
UsartPrintf(USART3,"密码错误");
Oled_Clear_All();
Oled_ShowCHinese(1,1,"指纹密码锁");
Oled_ShowCHinese(2,0,"密码错误");
delay_ms(1000);
Oled_ShowString(2,0," ");
Oled_ShowCHinese(2,0,"密码:");
if(flag_mode == 1)
{
Oled_ShowCHinese(4,0,"模式:密码");
}
else if(flag_mode == 2)
{
Oled_ShowCHinese(4,0,"模式:密码加指纹");
}
flag_error_num++;
password_num = 0;
memset(password_input,'\r',12);
}
}
}
USART1_Clear();
}
}