# 门锁介绍
这个门锁是我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/weixin_42133183/article/details/80911996)
链接:[https://blog.csdn.net/qq_34706280/article/details/53165561](https://blog.csdn.net/qq_34706280/article/details/53165561)
链接 :[https://blog.csdn.net/weixin_42625444/article/details/84331059](https://blog.csdn.net/weixin_42625444/article/details/84331059)
上面两个大佬的介绍很详尽了,而我也基本参考各种例程,将其简单驱动起来,显示我想要的字符。
故,我用P2 ^3作为LCD寄存器选择引脚,P2 ^4作为读写选择引脚,P2 ^5作为读写使能引脚,P0作为数据引脚。根据时序写出写数据和写命令函数。
```
/*********************液晶写数据函数******************/
void writedate(uchar date) //写命令
{
P0=date; //写入命令
rs=1; //选择数据寄存器
lcden=0; //写入数据
delay_xs(10); //稍作延时保证数据写入
lcden=1; //停止写入
delay_xs(10);
lcden=0;
}
/*********************液晶写命令函数******************/
void writecom(uchar com) //写命令
{
P0=com; //写入命令
rs=0; //选择指令寄存器
lcden=0; //写入数据
delay_xs(10); //稍作延时保证数据写入
lcden=1; //停止写入
delay_xs(10);
lcden=0;
}
```
## 矩阵键盘
为了减少I/O口的占用,将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P3口)就可以构成4*4=16个按键。当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。确定矩阵式键盘上何键被按下介绍一种“行扫描法”。行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
1、判断键盘中有无键按下 将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
门锁为了实现部分功能,有些按键没有使用,有些按键在室内,通过并联按键实现同样功能,具体实现如下代码:
```
/******************键盘扫描函数**************************/
void keyscan()
{
uchar temp;
/**************第一行扫描********************/
P3=0xfe;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay_xs(10);
if(temp!=0xf0)
temp=P3;
switch(temp)
{
case 0xee: keydeal1(); break;
case 0xde: keydeal2(); break;
case 0xbe: keydeal3(); break;
case 0x7e: keydeal4(); break;
}
while((P3&0xf0)!=0xf0); //松手检测
}
/******************第二行扫描**********************/
P3=0xfd;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay_xs(10);
if(temp!=0xf0) temp=P3;
switch(temp)
{
case 0xed: keydeal5(); break;
case 0xdd: keydeal6(); break;
case 0xbd: keydeal7(); break;
case 0x7d: keydeal8(); break;
}
while((P3&0xf0)!=0xf0); //松手检测
}
/*****************第三行扫描*********************/
P3=0xfb;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay_xs(10);
if(temp!=0xf0)
temp=P3;
switch(temp)
{
case 0xeb: keydeal9(); break;
case 0xdb: keydeal10(); break;
case 0xbb: keydeal11(); break;
case 0x7b: keydeal12(); break;
}
while((P3&0xf0)!=0xf0);
}
/********************第四行扫描********************/
P3=0xf7;
temp=P3&0xf0;
if(temp!=0xf0)
{
delay_xs(10);
if(temp!=0xf0)
temp=P3;
switch(temp)
{
case 0xe7: keydeal13(); break;
case 0xd7: keydeal14(); break;
case 0xb7: /*keydeal15();*/ break;
case 0x77: /*keydeal16();*/ break;
}
while((P3&0xf0)!=0xf0);
}
}
/*
```
链接:[https://blog.csdn.net/dlf1769/article/details/90599686](https://blog.csdn.net/dlf1769/article/details/90599686)
## L298N电机驱动和电动推杆
逻辑部分实现后为实现门锁的功能,我采用了电动推杆作为门销,对门进行简单改造,利用电动推杆伸出来的杆体将门销住。电动推杆里面是一个电机,所以我采用了一个L298N来驱动电机。当密码正确或者有人在内部开门,就让电机开始正转就行,关门时相反。代码简单,也没写单独的函数,在这就不展示了。
# 门锁代码展示
```
/*——————密码门锁————————*/
/*——————密码86445131——————*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit l1
基于STC89C52RC单片机的密码门锁仓库.zip
版权申诉
145 浏览量
2023-06-10
18:34:15
上传
评论 2
收藏 77KB ZIP 举报
我慢慢地也过来了
- 粉丝: 6338
- 资源: 3975
最新资源
- Picasso_v3.1 2.ipa
- chromedriver-mac-arm64.zip
- 蓝zapro.apk
- chromedriver-linux64.zip
- UCAS研一深度学习实验-MNIST手写数字识别python源码+详细注释(高分项目)
- 基于Python和PyTorch框架完成的一个手写数字识别实验源码(带MINIST手写数字数据集)+详细注释(高分项目)
- 基于Matlab在MNIST数据集上利用CNN完成手写体数字识别任务,并实现单层CNN反向传播算法+源代码+文档说明(高分项目)
- NVIDIA驱动、CUDA和Pytorch及其依赖
- 基于SVM多特征融合的微表情识别python源码+项目说明+详细注释(高分课程设计)
- html动态爱心代码一(附源码)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈