门锁介绍
这个门锁是我2018年暑假做的一个小作品,是我入门单片机后的第二个作品,第一个是一个船,使用串口通讯,完成了对船的遥控,而在假期,利用放假时间做了这个门锁,做出来已经好长时间了,就做个简单的展示,为刚学51单片机、而且想做一个自己作品的同学提供一个参考。门锁整体由外部(安装后的室外)矩阵键盘和1602显示器,一个电源开关、内部(室内)主控芯片,两个开关门状态控制开关,一个电源开关,一个蜂鸣器,一个L298N电机驱动及一个电动推杆组成。在外部通过4*4矩阵键盘输入密码和操作控制,LCD1602显示器显示状态提示或已输入密码位数;内部由两个按键分别控制开关门。开门或关门后有灯光和蜂鸣器提示状态。
门锁软硬件介绍
STC8989C52单片机
STC89C52RC是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但是做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
8k字节Flash,512字节RAM, 32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。
LCD1602显示屏
工业字符型液晶,能够同时显示16x02即32个字符,16列2行)。1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
LCD1602操作参考:
链接:https://blog.csdn.net/weixin_42133183/article/details/80911996
链接:https://blog.csdn.net/qq_34706280/article/details/53165561
链接 :https://blog.csdn.net/weixin_42625444/article/details/84331059
上面两个大佬的介绍很详尽了,而我也基本参考各种例程,将其简单驱动起来,显示我想要的字符。
故,我用P2 ^3作为LCD寄存器选择引脚,P2 ^4作为读写选择引脚,P2 ^5作为读写使能引脚,P0作为数据引脚。根据时序写出写数据和写命令函数。
1 | /*********************液晶写数据函数******************/ |
矩阵键盘
为了减少I/O口的占用,将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P3口)就可以构成4*4=16个按键。当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
1、判断键盘中有无键按下 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
门锁为了实现部分功能,有些按键没有使用,有些按键在室内,通过并联按键实现同样功能,具体实现如下代码:
1 | /******************键盘扫描函数**************************/ |
链接:https://blog.csdn.net/dlf1769/article/details/90599686
L298N电机驱动和电动推杆
逻辑部分实现后为实现门锁的功能,我采用了电动推杆作为门销,对门进行简单改造,利用电动推杆伸出来的杆体将门销住。电动推杆里面是一个电机,所以我采用了一个L298N来驱动电机。当密码正确或者有人在内部开门,就让电机开始正转就行,关门时相反。代码简单,也没写单独的函数,在这就不展示了。
门锁实物展示
门锁代码展示
1 | /*——————密码门锁————————*/ |
附上整个工程代码,上面代码无法复现可试试工程。
链接:https://download.csdn.net/download/weixin_42585316/12110359
参考文档
参考文档https://blog.csdn.net/matsukawahikari/article/details/83756903
参考文档https://blog.csdn.net/dlf1769/article/details/90599686
参考文档 https://blog.csdn.net/weixin_42133183/article/details/80911996
参考文档https://blog.csdn.net/qq_34706280/article/details/53165561
参考文档https://blog.csdn.net/weixin_42625444/article/details/84331059
总结
制作成中各种困难,从中发现了好多学习过程中没注意到的地方,比如说在学习过程中没太注意矩阵按键行扫描时的数据应该怎么去算,在做的过程中再去回顾,算了好几次,中间多次出错,多次检查更正,总算合适,完成了简单地密码输入及各种逻辑。再用LCD1602时因为之前没怎么用过,花了好长时间,做的过程中慢慢摸索,有点门道后参考例程,完成我想要的结果,之后再做其他小作品的时候慢慢深化。
密码门锁的功能是完成了,但相对简单,功能单一,没有新奇之处,但通过这次制作我对所学到的STC89C52单片机的知识有了很好的深化,之后还会对其完善,加上其他各种功能,比如射频卡、指纹等。