通过百度网盘分享的文件:资料详解
链接:https://pan.baidu.com/s/1zPXLcLmqZAljkgMeU2RT7w?pwd=597l
提取码:597l
本设计以STC89C52单片机为核心控制器,加上其他的模块一起组成蓝牙密码锁的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STC89C52单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。输入由五部分组成,第一部分是DS1302时钟模块,通过该模块可检测当前的时间;第二部分是储存模块,采用AT24C02芯片,存储按键输入的信息;第三部分是DS18B20温度检测模块,通过该模块可检测当前的温度;第四部分是4*4矩阵键盘,按键主要功能有一键关门、显示时间、重新设置密码、取消键、确认键、输入密码;第五部分是供电电路,给整个系统进行供电。输出由三部分组成,第一部分是LCD1602显示模块, 通过该模块可以显示门的开关状态、输入的密码显示、重置密码时的显示等;第二部分是蓝牙模块,通过该模块可连接手机;第三部分是蜂鸣器,当键盘锁定且有按键按下时,蜂鸣器作为按键音提醒。
4 系统程序设计
4.1 编程软件介绍
本设计所用到的编程软件为Keil5,其界面如图4-1所示:
图4-1 Keil5开发界面
本设计所使用的编程环境是Keil5,相对于其他软件编程环境,Keil5更加的轻便快捷,操作更加的简单,深受广大嵌入式软件开发者的喜爱。Keil5支持多种芯片,包括51单片机、STM32、HC32、NXP等,生成的HEX文件,可通过烧录器直接烧录到单片机中,非常方便。另外,Keil5编译有三种,一种是单编,一种是部分编译,还有一种是全部编译,这样给开发人员更多的选择,并且编译的结果,显示在界面的最下方,供开发者查找错误。
4.2 主程序流程设计
系统的主流程图如图4-2所示;在主程序中:首先对各个模块进行初始化,随后进入while主循环,在主循环中,首先将密码从存储模块中读出来;然后进入第一个函数按键函数,该函数主要分为两部分,第一部分为调用按键扫描函数获取按键键值,第二部分通过键值进行相应的处理操作,比如一键关门、显示时间、重新设置密码、取消键、确认键、输入密码等;紧接着进入第二个函数重置密码函数,该函数主要判断当前是否是重置密码界面,若是,再判断两次输入的新密码是否相同,若相同,则密码重置成功,若不相同,则密码重置失败;也可以通过蓝牙控制;最后,通过一个延时函数和计数公式,限制各函数扫描时间。其部分主程序源码如下所示:
void main()
{
Timer0Init();
Uart_Init();
Ds1302_Init();
Lcd1602_Init(); //LCD1602初始化
Delay_function(50); //延时50ms
lcd1602_clean(); //清屏
Delay_function(50); //延时50ms
Init_IIC(); //总线初始化,拉高释放总线
Delay_function(50); //延时50ms
//写过一次后关闭,无需重复写初值
// Write_init_EEPROM(); //写入初始密码123456到E2PROM
// ds1302_write_time();
lcd1602_display_str(1,0,"===Coded Lock==="); //初始化界面
lcd1602_display_str(2,0,"Password:");
while(1)
{
(部分代码省略)
……
}
}
图4-2 程序总体流程图
4.3 按键函数流程设计
按键函数子流程图如图4-3所示;按键设置函数首先通过按键扫描函数,获取按键按下的键值,通过不同的键值,进行相应变量的改变。如果键盘锁定时,三分钟内按下按键,蜂鸣器报警。没有锁定键盘时,如果获取的键值为“A”,则一键关门。如果获取的键值为“B”,则显示时间;如果获取的键值为“D”,则重新设置密码;如果获取的键值为“*”,则为取消键;如果获取的键值为“#”,则进确认键;如果获取的键值为0-9的数字,则为输入密码,只保存前6个数字。其部分程序源码如下所示:
void Key_function(void)
{
uchar i;
key_bianma = matrix_keyboard_scan(); //读按键的位置码
if(key_bianma != 0) //当有按键按下时
{
if(flag_key_en == 0) //按键使能标志为0时,锁3分钟
{
BEEP = 0;
Delay_function(50);
BEEP = 1;
}
else
(部分代码省略)
……
}
}
}
图4-3 按键函数子流程图
4.4 确认函数流程设计
确认函数子流程如图4-4所示;首先确认是否在设置密码,若不在,则判断当前门的状态是否为关闭,若是关闭状态,则将输入的密码于与储存密码对比,若正确,则打开门,若错误,则不开门,显示密码错误;若当前不在设置密码且门的状态为打开,显示屏显示打开状态;若此时处于设置密码状态,则输入密码并与管理员密码对比,若对比成功,则可设置密码,若对比不成功,则不可设置密码。其部分程序源码如下所示:
void Ensure_function(void)
{
lcd1602_display_str(1,0," ");
lcd1602_display_str(2,0," ");
//不在设置密码时,并且门是关着在执行如下函数
if(flag_reset_password == 0 && flag_stat_door == 0)
{
//键入密码进行比对将输入密码与存储的密码对比,正确则开门
if((password[0] == password_input[0]) && (password[1] == password_input[1]) &&
(password[2] == password_input[2]) && (password[3] == password_input[3]) &&
(password[4] == password_input[4]) && (password[5] == password_input[5]))
{
lcd1602_display_str(1,0,"===Coded Lock===");
lcd1602_display_str(2,0," Door Open ");
(部分代码省略)
……
}
}
图4-4 显示函数子流程图
4.5重置密码函数流程设计
重置密码函数子流程如下图4-5所示,首先判断是否在重置密码状态,若是,则显示屏显示重置密码页面并输入旧密码;然后输入两次新密码并对比两次输入的密码,若相同,则密码重置成功,若不相同,则密码重置失败。软件部分程序源码如下所示:
void Reset_password_function(void)
{
uchar i;
if(flag_reset_password == 1 && flag_reset_password_num == 0)
{
lcd1602_display_str(1,0,"=Reset Password=");
lcd1602_display_str(2,0,"adm_Pswd:");
(部分代码省略)
……
}
}
图4-5 处理函数子流程图
标签:密码锁,函数,22,重置,51,密码,键值,按键,password From: https://blog.csdn.net/2402_89220103/article/details/144595374