# 门锁介绍
这个门锁是我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写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
故,我用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);
}
}
/*
```
## L298N电机驱动和电动推杆
逻辑部分实现后为实现门锁的功能,我采用了电动推杆作为门销,对门进行简单改造,利用电动推杆伸出来的杆体将门销住。电动推杆里面是一个电机,所以我采用了一个L298N来驱动电机。当密码正确或者有人在内部开门,就让电机开始正转就行,关门时相反。代码简单,也没写单独的函数,在这就不展示了。
# 门锁代码展示
```
/*——————密码门锁————————*/
/*——————密码86445131——————*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit l1=P2^0;
sbit bump=P1^3; //蜂鸣器控制
sbit IN1=P1^0;//驱动引脚
sbit IN2=P1^1;
sbit rs=P2^3; //液晶屏控制位
sbit rw=P2^4; //读写选择端
sbit lcden=P2^5; //使能控制端
/**********显示内容**************************/
uchar code xianshi0[]="input password:";
uchar code xianshi1[]="please come in!";
uchar code xianshi2[]="close the door!";
uchar code xianshi3[]="*";
uchar code xianshi4[]=" you are thief!";
uchar code xianshi5[]=" first error!";
uchar code xianshi6[]=" second error!";
uchar code xianshi7[]=" third error!!";
uchar code xianshi8[]=" Good Bye!!";
uchar code xianshi9[]=" Wait a moment! ";
static uchar table[8]; //给按键输入留�
MarcoPage
- 粉丝: 4409
- 资源: 8836
最新资源
- postgis-bundle-pg17-3.5.0x64.zip
- postgis-bundle-pg17x64-setup-3.5.0-2.exe
- 机械设计自动化立体仓库21可编辑非常好的设计图纸100%好用.zip
- postgis-bundle-pg96-2.5.0x32.zip
- 安卓项目源码Android中监听电话状态
- 语音数据集制作标记工具.zip
- postgis-bundle-pg96-3.2.3x64.zip
- 基于支持向量机(SVM)代理模型的,电机多目标优化 平均转剧,转剧脉动,迳向推力三个优化目标的R2都在0.99往上,具有较高的精度 优化算法采用的是多目标粒子群算法,PSO 优化软件:Matla
- postgis-bundle-pg96x32-setup-2.5.0-1.exe
- postgis-bundle-pg96x64-setup-3.2.3-1.exe
- IOS源码IOS应用源码之俄罗斯方块Demo
- 机械设计自动砌砖机step非常好的设计图纸100%好用.zip
- DNN多输出回归 基于深度神经网络(DNN)的多输出回归预测(多输入多输出) 程序已经调试好,数据格式为excel(如下图),仅需根据你的输出个数修改outdim值即可 1、运行环境要求MATLAB版
- postgresql-9.6.24.tar.bz2
- postgresql-10.23.tar.bz2
- 这是一个faster-rcnn的keras实现的库,可以利用voc数据集格式的数据进行训练 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈