电子密码锁.docx
《电子密码锁.docx》由会员分享,可在线阅读,更多相关《电子密码锁.docx(20页珍藏版)》请在冰豆网上搜索。
电子密码锁
单片机原理与应用课程设计报告
设计题目:
电子密码锁
专业:
班级:
学号:
参与人员:
指导老师:
完成日期:
指导老师评语:
得分:
指导教师签名:
目录
1设计任务和性能指标1
1.1设计任务1
1.2性能指标1
2设计方案1
2.1需求分析1
2.2方案论证2
3系统硬件设计2
3.1键盘电路设计3
3.2LED显示电路设计3
3.3报警电路设计4
4系统软件设计5
4.1软件设计总流程图5
4.2开锁软件流程图6
4.3密码程序设计流程图7
5系统硬件设计8
5.1调试步骤8
5.2性能分析8
6心得体会9
参考文献10
附录1系统硬件电路图11
附录2程序清单12
1设计任务和性能指标
1.1设计任务
1、设计方案要合理、正确;
2、系统软件设计及调试;
3、系统联调;
4、写出设计报告。
1.2性能指标
1)保密性好,编码量多,远远大于机械控制。
随机开锁成功率几乎为零。
2)密码可变,用户可以随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使控制的保密性下降。
3)误码输入保护,当输入密码多次错误时,报警系统自动启动。
4)无活动零件,不会磨损,寿命长。
5)使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
6)电子密码控制系统具有操作简单易行,一学即会的特点
2设计方案
2.1需求分析
随着电子元件的进一步发展,电子密码控制系统也出现了很多的种类,功能日益强大,使用更加方便,安全保密性更强,由以前的单密码输入发展到现在的,密码加感应元件,实现了更为真正的电子加密,用户只有密码或电子钥匙中的一样,是打不开锁的,随着电子元件的发展及人们对保密性需求的提高出现了越来越多的电子密码控制系统。
由于数字、字符、图形图像、人体生物特征和时间等要素均可成为电子信息,组合使用这些信息能够使电子防盗密码控制获得更高的保密性,如防范森严的金库,需要使用复合信息密码的电子防盗密码控制系统。
组合使用信息也能够使电子防盗密码控制系统获得无穷扩展的可能。
可以看出组合使用电子信息是电子密码控制系统今后发展的趋势。
2.2方案论证
方案一:
采用数字密码锁电路的好处就是设计简单。
用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。
电路由两大部分组成:
密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。
密码锁电路包含:
键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。
方案二:
采用一种是用以AT89C51为核心的单片机控制方案。
利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控制功。
通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。
3系统硬件设计
3.1键盘电路设计
矩阵式键盘电路如图3-1所示:
图3-1:
矩阵式键盘电路图
由于本设计所用到的按键数量较多而不适合用独立按键式键盘。
采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。
本设计中使用的这个4*4键盘不但能完成密码的输入还能作特别功能键使用,比如清空显示功能等。
键盘的每个按键功能在程序设计中设置。
其大体功能(看键盘按键上的标记)及与单片机引脚接法如上图所示。
3.2LED显示电路设计
LED显示电路如图3-2所示:
图3-2:
LED动态显示电路
为了提高密码锁的密码显示效果能力。
本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。
只有按下键盘上的开启按键后,显示器才处于开启状态。
同理只有按下关闭按键后显示器才处于关闭状态。
否则显示器将一直处于初始状态,当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示同一个数字,输入多少位就显示多少个*。
当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD子显示“OPENED”,单片机其中P2.0引角会输出低电平,使三极管T2导通,电磁铁吸合,电子密码锁被打开,如果密码不正确,LCD显示屏会显示“ERROR”,P2.0输出的是高电平,电子密码锁不能被打开。
通过LCD显示屏,可以清楚的判断出密码锁所处的状态。
3.3报警电路设计
输入密码与设定密码做比较,当输入密码与设定密码不同,返回再输入,当输入密码次数超过3次时,通过软件从80C51的P3.0输出脉冲,使扬声器鸣笛报警。
报警电路如图3-3所示:
图3-3:
报警电路图
4系统软件设计
4.1软件设计总体流程图如下:
如图4-1为密码设置流程图,开始按下设置键,输入旧密码,如果错误累计三次,进行报警程序。
如果输入正确,可以修改密码,确认后再次输入新密码,如果两次输入一样,则输入成功。
如果两次输入的新密码不一样,则修改密码失败,重新返回设置新密码。
软件设计总流程图如下:
图4-1软件设计总流程图
4.2开锁软件流程图
如图4-4开锁流程图,开始时按开锁键,输入密码,如果输入正确,则开锁成功。
如果输入错误累计达到三次,则执行报警程序。
图4-4开锁流程图
4.3密码设置流程图
如图4-3为密码设置流程图,开始按下设置键,输入旧密码,如果错误累计三次,进行报警程序。
如果输入正确,可以修改密码,确认后再次输入新密码,如果两次输入一样,则输入成功。
如果两次输入的新密码不一样,则修改密码失败,重新返回设置新密码。
图4-3密码设置流程图
5系统硬件设计
5.1硬件调试步骤
单片机应用系统的硬件调试和软件调试是分不开的.许多硬件故障只有通过软、硬件联调才能发现,但一般是先排除系统中比较明显的硬件故障后才和软件一起联调。
常见的硬件故障:
(1)逻辑错误
硬件的逻辑错误是由于设计错误和焊接过程中的工艺错误而造成的,包括错线、开路、短路等,其中最常见的是短路故障。
(2)元器件错误
元器件错误的原因有器件损坏或性能不符合要求,电解电容、二极管的极性接反或集成块装反等。
(3)可靠性差
应用系统可靠性差的原因很多,如内部和外部的干扰、电压纹波系数过大、器件负载过重等均会造成系统的可靠性差。
另外,走线和布置的不合理也会造成系统可靠性差。
(4)电源故障
电源故障包括:
电压值不符合设计要求、电源功率不足、负载能力差、纹波太重等。
硬件调试方法
脱机调试是在加电前,先用万用表等工具,按图纸仔细核对线路是否正确,并对元器件的安装、型号、规格等进行仔细检查,特别焊接时有无走线之间相互短路等。
5.2软件调试
程序在KEILC51上调试,采用模块程序设计技术,则逐个模块调好后再进行系统程序总调。
对于模块结构程序.要一个个子程序分别调试。
调试时,一定要符合入口条件和出口条件,调试可用单步运行和断点运行方式,通过检查用者系统的CPU现场情况、RAM的内容和I/O口的状态,检测程序执行结果是否符合设计要求,有无循环错误、有无机器码错误以及转移地址的错误,同时,还可以发现系统中存在的硬件设计错误和软件算法错误。
各程序模块通过后,则可以把相关功能块连在一起进行总调。
这个阶段若有故障,可以考虑各子程序运行时是否破坏了现场,缓冲单元、工作寄存器是否发生冲突,标志位的建立和清除是否有误,堆栈区是否有溢出,输入设备的状态是否正常等等,若用者系统是在开发机的监控程序下运行时,还要考虑用者缓冲单元是否和监控程序的工作单元发生冲突。
单步和断点调试后,还应进行连续调试,用以确定定时精度、CPU的实时响应等问题。
当全部调试和修改完成后,将程序固化到AT89C51中。
进行整机调试。
各功能实现则调试完成。
6心得体会
回顾起此次单片机课程设计,让我感慨很多,从理论到实践,在整整两个星期的日子里,可以说是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多书本上所没有学到过的知识。
四天以来,整日埋头于电路程序的设计,分析,绘制,仿真。
其实一开始真不知道该从何入手,短短几天内,在同学的帮助之下,开始在脑海里有了大致的模块,面对电脑搜索资料,查找相关的资料,分析电路,根据自己的目的有效地编制程序,对比之下有进一步的完善,在形成电路大致模块下又进一步尽可能的减小成本,知道最终电路以自己最理想的形式出现。
在本次设计的过程中,我发现很多的问题,单片机课程设计的重点就在于软件算法的设计,需要有很巧妙的程序算法,虽然以前写过几次程序,但我觉得写好一个程序不是一件简单的事情。
通过这次实习,我真正学到了不少东西,真正体会到了理论联系实际的重要性。
课堂教学考虑到大多数同学的需求,主要强调基本知识,基本理论,基本方法,基本技能。
而这次设计正是为我们提供了一个深入学习、探索的机会,成为课堂教学的有益补充。
参考文献
[1]、《微型计算机原理及应用》许立梓编机械工业出版社2002
[2]、《微型计算机接口技术及应用》刘乐善编华中理工大学出版社2000
[3]、《计算机硬件技术基础试验教程》邹逢兴编高等教育出版社2000
[4]、《16位微型计算机原理接口及其应用》周佩玲编中国科学技术大学出版社2000
[5]、《微型计算机原理与接口技术》吴秀清编中国科学技术出版社2001
[6]、《微型计算机接口技术》邓亚平编清华大学出版社2001
[7]、《单片机原理及及应用》王迎旭编机械工业出版社2001
[8]、《单片机应用程序设计技术》周航慈著北京航空航天大学出版社2002
[9]、《单片机实用技术问答》谢宜仁主编人民邮电出版社2002
附录1系统硬件电路图
附录2程序清单
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitok=P3^3;
sbiter=P3^2;
sbitsu=P3^4;
ucharcodetable[]={
0x40,0x79,0x24,0x30,
0x19,0x12,0x02,0x78,
0x00,0x10,0x08,0x03,
0x46,0x21,0x06,0x0e,0};
ucharcodeHELLO[]={
0x09,0x06,0x47,0x47,0x40};
ucharcodeCD[]={0xc6,0xa1};
ucharnum,temp,num1,i;
voiddelay(uintz)//延时程序//
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
ucharkeyscan()//键盘扫描
{
P1=0xfe;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xee:
num=0;break;
case0xde:
num=11;break;
case0xbe:
num=12;break;
case0x7e:
num=14;break;
default:
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfd;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xed:
num=7;break;
case0xdd:
num=8;break;
case0xbd:
num=9;break;
case0x7d:
num=13;break;
default:
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xfb;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xeb:
num=4;break;
case0xdb:
num=5;break;
case0xbb:
num=6;break;
case0x7b:
num=10;break;
default:
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
P1=0xf7;
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
delay(20);
temp=P1;
temp=temp&0xf0;
while(temp!
=0xf0)
{
temp=P1;
switch(temp)
{
case0xe7:
num=1;break;
case0xd7:
num=2;break;
case0xb7:
num=3;break;
case0x77:
num=15;break;
default:
break;
}
while(temp!
=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
returnnum;
}
voidhel()//初始化
{
num=0;
while(num!
=11)
{
P2=0x01;
for(i=0;i<5;i++)
{
P0=HELLO[i];
delay(10);
P2=_crol_(P2,1);
}
num=keyscan();
}
}
voiddisp(ucharz)//输入界面
{
num1=z;
while(num1==z)
{
num1=keyscan();
if(num1==z)
{
ok=1;//熄灭指示灯
er=1;
su=1;
if(z==11||z==13)
{
for(i=0;i<2;i++)
{
P0=CD[i];
delay(10);
P2=0X80;
P2=_crol_(P2,1);
}
}
}
}
/*else
{
if(z==14)
{
for(i=0;i<14;i++)
w_data(old_key[i]);
}
else
{
if(z==15)
{
for(i=0;i<14;i++)
w_data(new_key[i]);
strcpy(min,min1);
}}
}
num1=0;
}
elsenum1=z;
}*/
}
voidmain()
{
num=18;
hel();
disp(11);
/*while
(1)
{
P2=0x80;
num=keyscan();
P0=table[num];
}*/
}