基于STC89C52单片机的矩阵键盘密码锁的设计
2022-12-21戴文骏
戴文骏
(江苏联合职业技术学院 南京分院,江苏南京,210019)
0 前言
随着电子技术的飞速发展以及人们对美好生活的不断追求,电子密码锁渐渐走进了千家万户。相比于传统机械锁存在的机械结构简单,容易被撬锁,需要随身携带钥匙并且钥匙容易被复制的缺点,电子密码锁因其安全性能可靠、开锁密码变更便捷、密码不易被陌生人破解的优点,逐渐取代了传统的机械锁[1~4]。电子密码锁摆脱了随身携带钥匙的烦恼,由于数字密码的组合结果多种多样,保密性较强,一旦发现密码泄露,随时都可以更改密码,确保了解锁的安全可靠[5]。电子密码锁适用于家庭、学生宿舍、办公室及宾馆等场所,受到越来越多的年轻用户群体的青睐和选择,也改变了他们的生活方式。
1 总体设计
本设计将STC89C52 单片机作为主控制芯片,外加4×4 的矩阵键盘作为密码输入按键以及LCD1602 液晶显示屏作为按键键值的显示,并且可以自动判别按键键值与设定的四位数密码是否相同,两者相同解锁成功,两者不同解锁失败,并重新输入4 个按键键值重复上面的判断,直到密码输入正确,解锁成功。本设计方案中,需求效果易于实现且硬件成本价格低廉,可以在实现基本解锁功能的基础上,对硬件进行扩展,软件进行升级,以实现更加丰富多样的用户需求。该项目的总体设计结构框图,如图1 所示。
图1 总体设计结构框图
本设计充分利用已有的单片机开发试验仪进行开发设计。硬件上采用STC89C52 型单片机作为主控芯片,它具有操作简单、性能稳定的优点[6]。外设采用了4×4 的矩阵键盘作为输入方式,一共16 个按键,实际只使用了12 个按键。其中按键S1~S9 代表数字1~9 输入键,按键S10 代表数字0 输入键,按键S11代表“确认”键,按键S12代表“取消”键。LCD1602 液晶显示屏显示用户按下的四位数密码。如果密码输入正确,则在已有的“Password:”的右端显示“OK”;如果密码输入错误,则在已有的“Password:”的右端显示“ERR”。在输入密码的过程中,如果发现输入有误,按下S12“取消”键,则输入地显示界面恢复到初始界面“0000”状态,重新开始输入四位数密码。输入完成后,按下S11“确认”键,系统自动对比预设的正确密码与输入的密码是否一致,两者一致显示“OK”,否则显示“ERR”。与此同时密码输入界面又一次恢复到初始的“0000”状态。预设的正确密码通过软件程序编写的方式进行修改变更,可以预设0000-9999 中的任意一个四位数作为正确密码。
2 硬件设计
■2.1 单片机最小系统
如图2 所示,STC89C52 是由COΜS 工艺技术制成的入门级的8 位微控制器,它基于8051 的内核,指令代码完全兼容传统的8051,运行速度较传统的51 单片机提高了8~12 倍,自带ADC,具有4 路PWΜ,双串口,有全球唯一的ID 号,加密性更好,抗干扰能力更强,是一款增强型51 单片机[7]。具有价格低廉、可靠性好、功耗低、电压低等优点,因此得到了快速发展和广泛应用[8~9]。STC89C52具有8K 字节程序存储空间,512 字节数据存储空间,内带8K 字节EEPROΜ 存储空间,可直接使用串口下载用户程序。内部集成专用的复位电路。本设计以STC89C52 单片机为主控系统,包括晶振电路、复位电路等构成了单片机最小系统[10~11]。单片机最小系统的主要功能是系统资源完全开放,电路板简单实用,结合用户动手搭建的硬件电路或者模块化的集成电路可以实现多种实验功能。此外,它的接口设计灵活,使用方便,适用于创新实践活动中设计使用。
图2 STC89C52 主控芯片引脚排列
■2.2 LCD 液晶显示电路
本设计使用LCD1602 液晶屏作为密码的显示界面,可以显示2 行16 列的字符,显示的内容与LED 数码管相比,更加多样[12]。而且还避免了数码管需要不断扫描更新,一旦扫描不及时就会出现数码管显示闪烁的缺点。液晶屏插接到开发板的排针上,操作简单,利用螺丝刀调节电位器可以改变屏幕显示的对比度。LCD 液晶屏作为调试的窗口,提供了类似于printf 函数的功能,可以实时地观察单片机内部数据的变化情况。单片机STC89C52 与LCD1602的接线如图3 所示,单片机P0.0~P0.7 共8 个引脚分别接显示屏的DB0~DB7 的8 个接口。单片机的RD 管脚(P2.6 引脚)、WR 管脚(P2.5 引脚)、LCDE 管脚(P2.7 引脚)分别接显示屏的RS 接口、RW 接口、E 接口。此外,还需要给显示屏及其背景灯提供电源。
图3 LCD1602 接线图
■2.3 键盘输入电路
为了减少I/O 口的占用,本项目采用如图4 所示的4 行4 列的矩阵键盘形式作为输入按键,16 个按键仅占用了8 个接口。其中最后一行的按键没有设置功能,前三行,即S1~S12 共12 个按键,依次对应数字1~9 键,数字0 键,“确认”键和“取消”键的输入功能。本项目采用逐列扫描的方式,然后快速循环这个过程,从而读取出12 个按键中任意位置按键的状态,实现所有按键同时检测的效果。硬件接线将16 个按键的引脚通过排针JP4 的1~8 口依次连接到单片机的P2.0~P2.7 的引脚上。
图4 4×4 矩阵键盘输入电路
矩阵键盘的按键实质上是机械开关,受到弹性的作用,机械触点在闭合时不会立马就稳定地接通,同样在断开时也不会一下子就断开。按键地按下和抬起的瞬间,都伴随有一连串的极短时间的抖动。为了消除抖动,可以采用搭建硬件电路,过滤掉抖动的瞬间后,再进行按键状态的检测,但这种方法需要消耗硬件资源,而且操作起来难度较大,所以本项目采用软件编写的方式消除抖动。因为产生抖动的时间段一般为5~10ms,所以当检测到按键按下或者抬起时,通过软件延时20ms,就可以规避掉抖动的时间段。
3 软件设计
本项目针对一个相对复杂的任务,将其拆分成若干个小任务来解决,这种方法叫做分层。分层后形成的若干个较小的局部任务,相较于整个任务来说,往往易于研究,容易找到突破口,处理起来难度也较小。这也就是软件编程设计中,模块化的编程思路。模块化编程的好处有以下四个方面:
(1)各模块之前相互独立。当一个模块需要使用其他模块的功能时,不需要知道它的底层逻辑是如何实现的,只需要调用该模块的接口,就可以接受到它所提供的服务。
(2)灵活性好。当某一模块的任务需求发生改变后,只需要对该模块的程序进行修改,实现对应的功能函数的编写,则不影响其他模块功能的实现。
(3)结构上可分割。每个模块都可以采用最合适的算法技术来实现。
(4)复杂性低,易于排错。每个模块的功能性比较明确,在整个程序的调试过程中便于定位到存在问题的具体位置,只要针对该位置进行程序的修改调试即可。
■3.1 子函数
本项目包含3 个相互独立的子程序,分别为Delay 延时子程序、LCD1602 液晶屏调试子程序、ΜatrixKey 矩阵按键子程序。在使用延时子程序的延时功能时,只需要调用它的函数声明,并给它的形式参数在合理取值范围内赋值,可以实现预定时间的延时。在本项目中延时功能主要用于软件消抖,检测到按键按下或抬起时,延时20ms。本项目提供的LCD1602 代码属于模块化的代码,在使用过程中只要知道所提供函数的作用和使用方法就可以很容易地使用LCD1602。比如初始化LCD 液晶屏、显示字符串“Password:”、显示十进制的数字“0000”等,按照对应功能函数的参数说明,添加合适的参数值即可完成相应功能。矩阵按键子程序,主要实现功能是通过单片机P2 端口的不断循环扫描读取,检测定位到矩阵按键的具体位置,并给该按键附上键值。矩阵按键的部分程序如下:
■3.2 主函数
主函数调用LCD1602 子函数实现LCD 初始化,在LCD 显示屏的第一行显示字符串“Password:”。调用矩阵按键子程序,对按下的键值进行判断。如果键值KeyNum<=10,即S1~S10(数字键0~9)按键按下,变量Count 计数1 次,累计计数达到4 次,实现输入四位数密码的功能,并且四次的键值依次从高位到低位显示在LCD1602 显示屏上;如果键值KeyNum==11,即S11(“确认”键)按下,实现软件设置的四位数预设密码和输入的四位数密码的比对,两者相同显示屏显示“OK”,两者不同显示“ERR”;如果键值KeyNum==12,即S12(“取消”键)按下,实现四位数密码清零,恢复到“0000”的显示。程序设计流程图,如图5 所示。
图5 程序设计流程图
4 总结
本设计以STC89C52 单片机为核心,结合LCD1602 液晶显示屏和4×4 矩阵键盘的外设组合,构成了简单的电子密码锁设计。该设计易于实现,设计实物图,如图6 所示。在此基础上可以增加外设模块,拓展出其他功能,满足更加多元化的用户需求。如实现连续三次输入密码错误触发声光报警、增加远程遥控器输入密码完成远程解锁功能、预先存储用户的指纹和实时检测到的指纹相比对,从而实现若指纹匹配则智能化打开电子锁的功能等[13]。
图6 设计实物图