确认正确密码时,开锁正常,计时清零正常,5秒内输入错误密码或者超时输入且不管密码正确与否,均报警,按键失灵,成功进入自锁,当在开锁状态键按下,密码重置键按下后,密码重置,自锁解除,开锁成功。
七、结论与心得
本次设计的电子密码锁以STC89C51为核心,用LED灯、自锁开关、贴片开关、蜂鸣器以及直流电源来表现实验效果,通过四位密码锁实现对密码锁的控制。通过对硬件的仿真及软件测试,实现了设计功能的要求。
在这次设计中还有几个问题未解决,第一,密码锁必须保持不断电,才能保证设入密码的正常保存和修改;第二,密码锁的密码重置键为隐藏按键,设计中位置的摆放问题,保证其隐蔽性问题。
在后期成品制作过程中,解决断电问题,利用IC总线技术,比如加个24C02之类的芯片,将用户信息放到24C02里面,这样断电之后,用户信息不丢失,密码可以长久保存。解决密码重置键问题可以选择,密码的双重性,通过设置双重密码,一重密码解锁和修改密码,在进入自锁之后,利用另一重密码进行解除自锁。
在设计本系统的过程中,小组各成员热情投入,相互配合,不仅学到了很多的知识,也培养了良好的团队精神。总之,课程设计是一个很好的平台,通过本次设计,我们小组各成员都受益匪浅。
八、参考文献
[01] 何宏主编 《单片机原理与接口技术》 北京,国防工业出版社 2006.07
[02] 杨西明 朱骐主编 《单片机编程与应用入门》 北京,机械工业出版社 2004.06 [03] 先锋工作室编著《单片机程序设计实例》 北京,清华大学出版社 2003.01 [04] 谢宜仁主编 《单片机实用技术问答》北京,人民邮电出版社 2003.02 [05] 梁丽 《电子密码锁的计算机仿真设计》 《计算机仿真》 2005 [06] 房小翠 王金凤编著 《单片机实用系统设计技术》. 北京,国防工业出版社 1999.06 [07] 郭天祥编著 《51单片机C语言教程》 北京,电子工业出版社 2010.3
附件:程序设计
程序设计如下: #include
#define uint unsigned int void delay(uint);
sbit ledr=P2^0;//红色LED控制端 sbit ledg=P2^1;//绿色LED控制端 sbit bj=P2^2;//蜂鸣器控制端 sbit key1=P2^3;//密码重置键 sbit key2=P2^4;//开锁状态键 sbit keyr=P2^5;//密码确认键 uint nn,num; void main()
{TMOD=0x01;//设定工作方式 TH0=(65536-45872)/256;
TL0=(65536-54872)%6;//装初值,用于5秒计时 while(1) {
if(key1==0&&key2==1) {delay(5);
if(key1==0&&key2==1) {nn=P1; bj=0;
delay(30); bj=1;
delay(30); bj=0;
delay(30); bj=1;
delay(30); ledr=0; delay(100); ledr=1; delay(100); ledr=0; delay(100); ledr=1;
while(!key1&&!key2); }
}//按下密码重置键设定密码,红色LED闪烁
if (key2==1&&keyr==0&&P1==nn)//检测在正确输入密码时或输入后,中断关闭,计时清0 {delay(5); //为下一次输入做准备 if (key2==1&&keyr==0&&P1==nn) {EA=0;num=0;} }
if (key2==0)//开锁状态键被按下,此时为开锁状态,密码扫描及确认开始 {delay(5); if (key2==0) {EA=1;//开总中断
ET0=1;//开定时器中断 TR0=1;//启动定时器中断 ledr=1; ledg=1;
bj=1;//报警解锁模块初始状态 if(key1==0) {delay(5); if(key1==0)
{num=0; nn=P1;
bj=0;
delay(30); bj=1;
delay(30); bj=0;
delay(30); bj=1;
delay(30); ledr=0; delay(100); ledr=1; delay(100); ledr=0; delay(100); ledr=1;
while(!key1); } }
if(P1==nn&&num<100&&keyr==0)//检测5秒之内密码是否被正确输入,正确则开锁 {ledr=1; ledg=0; bj=1; num=0; }
if(num>100)//5秒超时,系统自锁,报警启动 {ledg=1; ledr=0; bj=0;}
if(P1!=nn&&keyr==0&&num<100)//检测5秒之内是否输入错误密码,错误则自锁 {ledg=1; ledr=0; bj=0; } }}}}
void delay(uint x)//延时函数 {uint y,z;
for(y=x;y>0;y--) for(z=110;z>0;z--);}
void t0() interrupt 1 //定时器中断函数 {TH0=(65536-45872)/256; //重装数值 TL0=(65536-54872)%6;
num++; //5毫秒,num+1,当num记到100时,计满5秒,自动清零 }