基于STC89C52单片机毕业设计完整版附原理图pcb图源程序仿真图 下载本文

内容发布更新时间 : 2024/6/29 5:37:08星期一 下面是文章的全部内容请认真阅读。

图4-10 总电路图

5 软件程序设计

电子密码锁的软件设计是整个电子密码锁可靠安全运行的关键,密码锁软件程序分为主程序、延时程序、LCD1602液晶显示屏显示程序、修改密码程序、扫描键盘输入程序、报警程序。密码通过矩阵键盘输入,并且在LCD1602液晶显示屏上显示,如果输入密码正确,则可以直接开锁。如果不正确,并且3次以上输入不正确,则启动报警系统,触发蜂鸣器发声。如果要修改密码,则需要在输入基础密码判别正确后,输入修改后的密码,通过系统确认后方可修改密码。为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。而本次设计分为四大模块,分别是键盘输入模块、LCD1602液晶显示屏显示模块、开锁和报警模块以及修改密码模块,通过主程序来实现控制。

5.1主程序流程介绍

主程序主要内容是各程序模块的调用,并利用各模块进行电子密码锁功能的实现,即是键盘输入密码并在LCD1602液晶显示屏显示密码,当密码输入完成后,单片机会将输入进的密码与原单片机内部所储存的密码进行对比,如若密码正确,则代表电磁吸合器的发光二极管会发光,同时LCD1602液晶显示屏会显示出正确的密码;如若密码错误,会启动计数器计数,当错误次数超过三次时,报警系统会启动即是蜂鸣器会发出报警声,以提醒保安。流程图如图5-1所示。

开始 初始化 输入密码 N N 密码正确? Y Y 开锁? N 修改密码N 返回

图5-1 主程序流程

Y 修改程序 开锁程序 次数加1 次数>3? Y 报警程序

5.2 键盘模块流程图

键盘输入模块主要包含键盘的扫描、延时去抖、找到键值以及返回键值。键盘扫描时循环的,程序编写是会使其进入是循环,这样可以检验出是否有按键按下,如果无按键按下就会进入等待有按键按下的状态,如果有按键按下的话就进入延时去抖的步骤,这样可以肯定的确定扫描到的按键是否被按下。经过去抖之后就是确定按键的位置即是第几行和第几列,找到按键后,就是确定键值并返回按键值,每一次扫描到有键按下后,最后都要有释放闭合按键的步骤,这是为了避免影响下一次键盘的扫描和按键值的读取。流程图如图5-2所示

键盘扫描 N 有键闭合? 延时去抖 找到闭合键 计算键值 闭合键释放 返回键值

图5-2 键盘模块流程

Y

按键的消抖子程序所示:

if(press_on!=0XF0)//--按键消抖---(时间自定)

{

delay(50); press_on=KEY_IO;

}

确定键值的子程序如下所示: switch(row) {

case 0xe0:row=0;break; case 0xd0:row=1;break; case 0xb0:row=2;break; case 0x70:row=3;break; }

switch(col) {

case 0x07:col=0;break; case 0x0b:col=1;break; case 0x0d:col=2;break; case 0x0e:col=3;break; }

recieve=key_value[row][col]; }

5.3显示模块流程图

LCD显示模块的软件设计主要包含开始、初始化LCD、清除LCD、写LCD四个过程。其中写包含写数据和写字符。

写数据的部分程序:

//写数 (5位数据)

void printf_data(uchar row,uchar col,uchar count,uint dat) {

uchar sh1,sh2,sh3,sh4,sh5; sh5=dat/10000;

sh4=dat000/1000; sh3=dat00/100; sh2=dat0/10; sh1=dat;

write_adr(0x0c); switch(row) {

case 1:row=0x80;break; case 2:row=0xc0;break; default:break; }

write_adr(row+col-1); delay(500); if(count>=5)

write_data(sh5+48); if(count>=4)

write_data(sh4+48); if(count>=3)

write_data(sh3+48); if(count>=2)

write_data(sh2+48); if(count>=1)

write_data(sh1+48);

写字符的小程序为: //写一段字符

void printf_char(uchar row,uchar col,uchar Inbuffer[31]) {

uchar i;

write_adr(0x0c); switch(row) {