点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503
源码获取
主要内容:
(1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。
(2)设计开锁密码位六位密码的电子密码锁。
(3)能够LCD显示在密码正确时显示PASSWORD OK,密码错误时显示PASSWORD ERROR,输入密码时显示INPUT PASSWORD。
(4)实现输入密码错误超过限定的三次电子密码锁定。
(5)4×4的矩阵键盘其中包括0-9的数字键和A-F的功能键
(6)本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮。
(7)密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作 。
基本要求:
1.通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
2.通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。
3.通话课程设计,培养分析问题、解决实际问题的能力。
1.设计要求;
用电子器件设计制作一个密码锁,使之在输入正确的密码时开锁;
在锁的控制电路中设-一个可以修改的4位代码,当输入的代码和控制电路的代码一致时打开;
用红灯亮、绿灯灭表示关锁,绿灯亮、红灯灭表示开锁。
如5s内未能将锁打开,则电路自动复位进入自锁状态,并发报警信号。
电子密码锁的结构框图如图1-1所示,选用单片机STC89C52作为电子密码锁的核心控制器件,在单片机的外围电路接矩阵键盘,用于输入密码并实现一些控制功能,外接LCD1602显示模块显示开锁信息,外接继电器,用继电器常开触点闭合模拟开锁动作,外接指示灯与蜂鸣器作为密码锁开锁成功或不成功的声光提示。
图中包括单片机最简单应用系统、 4╳3矩阵键盘、LCD1602显示电路、继电器电路和声光指示电路。
矩阵键盘的4根行线接在P2.0P2.3上,3根列线接在P2.4P2.6上。行线作为输出端,列线作为输入端,由于P2口内部有上拉电阻,无键按下时,列线输入均为高电平。
电子密码锁电路原理图如图1- 1所示
矩阵键盘、LCD1602显示电路、继电器电路和声光指示电路。矩阵键盘的4根行线接在P2.0P2.3上,3根列线接在P2.4P2.6上。行线作为输出端,列线作为输人端,由于P2口内部有上拉电阻,无键按下时,列线输人均为高电平。确定矩阵式键盘中的哪个键被按下,采用逐行扫描查询法,依次将行线置为低电平,再逐行检测各列线的电平状态,若某列为低电平,则该列线与置为低电平的行线交叉处的按键为闭合键。若所有的列线均为高电平,则无按键按下。LCD1602字符型液晶显示器的数据端口接单片机的 P 口,由单片机的P1.0~P1.2控制 LCD 的 RS 、 RW 和 E 控制端口。
开锁成功的仿真结果
3.程序设计
程序包括主程序、键盘扫描子程序、液晶显示器程序等。主程序进行变量及端口初始化定义,调用键盘扫描子程序,将按下的键值显示在液晶屏上,并很快替换为“*”,等六位密码全部输完后,进行密码匹配,如果密码正确,则液晶显示“ open”,同时开锁成功指示灯亮,否则液晶显示;“ error”,同时开锁失败指示灯亮。
端口初始化定义,调用键盘扫描子程序,将按下的键值显示在液晶屏上,并很快替换为“*”,等六位密码全部输完后,进行密码匹配,如果密码正确,则液晶显示“open",同时开锁成功指示灯亮,否则液晶显示“ error”,同时开锁失败指示灯亮。
设计的程序如下:
#include
#include
#define uchar unsigned char
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit ledg=P1^3;
sbit ledr=P1^7;
sbit relay=P1^4;
sbit buzz=P1^6;
char table0[]="error";
char table1[]="open";
char table2[]="password:";
int temp,ch,m0,m1,p,n0,n1,n2,n3,n4,n5;
void delay(int z)
{ int x,c;
for(x=z;x>0;x--)
for(c=100;c>0;c--);
}
keyscan()
{ temp=P2&0xf0;
P2=0xfe;
delay(1);
temp=P2&0xf0;
while(temp!=0xf0)
{ switch(temp)
{
case 0xe0:ch='7';break;
case 0xd0:ch='8';break;
case 0xb0:ch='9';break;
default:ch=p;break;
}
while (temp!=0xf0)
{ temp=P2;
temp=temp&0xf0;
}
}
P2=0xfd;
delay(1);
temp=P2&0xf0;
while(temp!=0xf0)
{ switch(temp)
{ case 0xe0:ch='4';break;
case 0xd0:ch='5';break;
case 0xb0:ch='6';break;
default:ch=p;break;
}
while(temp!=0xf0)
{ temp=P2;
temp=temp&0xf0;
}
void open()
{
char m2;
wcom(0xc6);
for(m2=0;m2<4;m2++)
{
wdat(table1[m2]);
}
}
void error()
{ char m2;
wcom(0xc6);
for(m2=0;m2<5;m2++)
{ wdat(table0[m2]);
}
}
void pass()
{
char m2;
wcom(0x80);
for(m2=0;m2<9;m2++)
{
wdat(table2[m2]);
}
}
void change(int m)
{
delay(500);
wcom(m);
wdat('*');
}
void main()
{
RW=0;
ledg=0;
ledr=0;
relay=1;
buzz=1;
init();
delay(5);
pass();
wcom(0x89);
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n0=keyscan();
change(0x89);
delay(10);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n1=keyscan();
change(0x8a);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n2=keyscan();
change(0x8b);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n3=keyscan();
change(0x8c);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n4=keyscan();
change(0x8d);
ch=p;
while(keyscan()==p)
{
delay(3);
keyscan();
}
wdat(keyscan());
n5=keyscan();
change(0x8e);
if(n0=='1'&&n1=='8'&&n2=='0'&&n3=='1'&&n4=='2'&&n5=='2')
{
int m3=1;
open();
relay=0;
delay(3000);
relay=1;
while(m3)
{
int m4,m5;
ledg=0;
for(m4=200;m4>0;m4--)
{
keyscan();
if(keyscan()=='A')
{
m4=0;
m3=0;
}
}
ledg=1;
if(m3!=0)
{
for(m5=200;m5>0;m5--)
{
keyscan();
if(keyscan()=='A')
{
m3=0;
}
}
}
}
}
else
{
ledr=1;
error();
buzz=0;
delay(5000);
}
}
4.仿真与实验结果
电子密码锁仿真电路及结果如图2示,按下预设的6位密码18012”液晶显示器第1行显示:“password: *****“, 第2行在中间位置显示“open”,继电器后面所接的指示灯PI.3口所接的开锁成功指示灯亮灭闪烁,如果输入的密码不是预设的密码,则液晶第2行在中间位置显示“error”,表示开锁失败,相应的指示灯也点亮。
仿真结果图如下所示:
5.异常现象分析与解决方法
1.由于代码过多,在编程中容易出错,所以在编程过程中要认真仔细。
2.密码锁无法输入密码,我积极向老师同学求助,最后在他们的帮助下,完成课程设计
3.按键不灵敏。
初步想法是:程序里包含了太多的延时。解决方法:减少延时时间尽量不用,将延时函数延时时间减短,将标志数增加。
输入数字时显示数字,并不显示‘',存在一定的密码泄露风险。
解决方法:查阅资料,知道‘’在1602里是0x2a,这样就可以在显示的时候输入数据位“0x2a”
6.心得体会
通过电子密码锁的课程设计有了很大的收获。首先,通过学习使自己对课本上的知识可以应用于实际,使理论与实际结合,加深自己对课本知识的理解。不足道的地方就是因为时间关系,没有能够将实物做出来验证自己的设计。但是在设计过程中用到了Multisim仿真验证,对Multisim达到学以致用的目的。以前只是泛泛的了解过Multisim 软件功能,在电路的设计过程中通过大量的运用,使自己在软件仿真方面有了很大的提高,有了受益匪浅的感觉。
在做电子密码锁的课程设计中,我感受到了老师对学生的悔人不卷的精神,老师细心的指导,使我少走了弯路,学到了很多电子应用技术的知识,顺利完成了课程设计,在这里对指导老师.表示衷心的感谢!
主要参考资料:
[1]王海军.一种单片机和云平台的电子密码锁设计[J].电子世界,2020(24):146-147.
[2]郭阳光.基于单片机的指纹识别电子密码锁设计[J].电子测试,2020(23):29-30+53.
[3]韩燕楚,余宏.基于51单片机的电子密码锁设计与应用研究[J].漯河职业技术学院学报,2020,19(06):21-23.
[4]韩旭,吴华,杨岱霖,邓昕.基于STC89C52的电子密码锁设计[J].电子技术,2020,49(10):10-11.
[5]黄田,杨婷婷,姜少维,李佳康,董莉霞.基于单片机的电子密码锁设计[J].软件,2020,41(10):102-104.
[6]孙凯悦.基于单片机的按键电子密码锁设计[J].科技经济导刊,2020,28(26):55-56.
[7]陈后全.基于51单片机设计的密码锁[J].电子制作,2020(10):37-38.