电子密码锁的设计.docx
《电子密码锁的设计.docx》由会员分享,可在线阅读,更多相关《电子密码锁的设计.docx(24页珍藏版)》请在冰豆网上搜索。
电子密码锁的设计
摘要
电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,我们采取的是单片机,它具有超大规模集成电路技术,有极强的数据处理能力,I/O口多以它为核心设计的密码锁,结构小,功能强,现在很多单位甚至家里的各个家用电器,还有保险箱都需要它。
介绍一种基于在系统可编程技术和C51编译器配有集成开发的新型电子密码锁的设计方法,阐述了其工作原理和软硬件设计。
在硬件上,用KEIL公司的C51大规模集成芯片对其外围电路进行集成,用1片8051实现了几十片分离元件才能实现的功能,几乎将整个系统下载于同一芯片中,实现了所谓的片上系统,从而大大简化了系统结构,增强了系统的可靠性和性价比。
该密码锁特别适用于宾馆、办公大楼、公寓等场所。
一种能防止多次试探密码的基于单片机的密码锁设计方案,根据基本要求规划单片机密码锁的硬件电路和软件程序,同时对单片机的型号选择、硬件设计、软件流程图、单片机存储单元的分配等都有注释。
我们知道现在很多行业都需要密码锁,电子密码锁的性能和安全性大大超过了机械锁,为了提高密码的保密性,可以经常更改密码,防止密码被盗;当密码输入错误多次时,报警系统可自动启动。
它们有很多扩展功能:
用户可以根据实际情况随意改变密码值或密码长度,按下“密码修改键”提示用户输入原密码,通过校验后提示输入新密码,一次写入CPU存储器中,另一次写入单片机内部RAM中,以便机器确认密码的正确性。
输入完毕后,按修改确认键,两次的密码完全一致时,密码修改完成。
我们这可以在输入的密码与程序中设定的密码相比,若失误,会有灯亮提示,但三次后都错误,系统可自动报警。
【关键字】AT89C51单片机I/O口接线LED显示(四位静态数码管)
复位电路键盘
目录
一、电子密码锁的主要功能3
(1)实验任务3
(2)基本设计3
(3)系统框图3
二、硬件设计4
(1)硬件工作接线口4
(2)LED显示器结构与原理4
(3)复位电路5
(4)晶振电路6
(5)按键方式7
(6)电路原理图7
(7)元器件清单8
三、软件设计流程9
(1)主要流程图9
(2)主函数流程图9
四、源程序代码12
五、系统调试22
六、课程设计体会23
七、参考文献24
一、电子密码锁的主要功能
(1)实验任务
根据设定好的密码,采用矩阵式按键实现密码的输入功能,开机时,数码管显示四根短横线,每输入一位密码,则显示一个F,当密码输入正确之后,锁就打开(即数码管显示good),如果输入错误,则数码管显示Erro,每次输完后,过5秒则又可以重新输入。
错误一次亮一盏灯,当输入的三次密码不正确时,亮三盏灯,且蜂鸣器发出报警声。
(2)基本设计
我们将密码程序存在EPROM中,用户通过单片机上P2.0口上的按键进行选择。
具体操作如下:
先打开电源,然后按下P2.0口上的任一按键,逐渐输入四位密码,最后按确认键即可。
设置显示初始符号“—”,为了帮助用户确认是否有键按下,并且防止密码外泄,在输入显示时,并不是显示用户按下的数字符号,而是以一个特定的字母符号提醒用户是否有键按下。
有键按下,就会显示字符“F”,没有键按下就是初始状态。
首先按下P2.0口上的按键,输入密码,正确则显示“good”,错误则显示“Erro”,并亮一盏灯,输入三次都不正确的则亮三盏灯并蜂鸣器响。
(3)系统框图
图1-1系统框图
二、硬件设计
(1)硬件工作接线口
P0口接数码管,用来显示按键是否按下,P1口接键盘,P1.0外接选择密码键,P2口按串行方式传送信号给数码管,P2.7口显示电磁锁开还是闭合状态。
把单片机系统区域中的P0口用导线连接“四路静态数码显示”的任一端口上,把单片机系统区域中的P1口上接独立式键盘。
(2)LED显示器结构与原理
LED显示块是由发光显示二极管显示字段的显示器件。
在单片机中我们通常用七段LED,这种显示共有共阴极和共阳极两种,本设计是用共阳极,是LED显示块的发光二极管与阳极并接,如图所示
图1-2数码管结构图
通常的七段显示块中共有8个发光二极管,其中7个发光二极管构成七笔字形“8”,一个发光二极管构成小数点。
七段显示块与单片机接口非常容易。
只要将一个8位并行输出与显示块的发光二极管引脚相连即可。
8位并行输出口输出不同的字节数据即可获得不同的数字或字符,通常将控制发光二极管的8位字节数据称为段选码。
显示字符
共阳极段选码
0
C0H
1
F9H
2
A4H
3
B0H
4
99H
5
92H
6
82H
7
F8H
8
80H
9
90H
-
BFH
g
90H
o
A3H
d
A1H
E
86H
r
AFH
F
8EH
表1-1字符段选表
(3)复位电路
如图所示为80C51型单片机上电复位电路。
RC构成微分电路,在接电瞬间,产生一个微分脉冲,其宽度若大于2个机器周期,80C51型单片机将复位,为保证微分脉冲宽度足够大,一般取10μF电容、8.2KΩ电阻。
图1-3复位电路图
(4)晶振电路
MC-51内部有一个用于构成振荡器的高增益反相放大器,输入端为引脚XTAL1,输出端为引脚XTAL2。
这两个引脚跨接石英晶体振荡器和微调电容,就构成一个自激振荡器,如图。
电路中C1和C2典型值通常选为30pF左右,对外接电容没有严格要求,但电容的大小会影响振荡器频率的高低、振荡器的稳定性和起振的快递性。
振荡器的频率范围在1.2MHz-12MHz之间。
30PF
30PF
图1-4晶振电路
(5)按键方式
按键方式有独立式和行列矩阵式两种,本设计是采用行列矩阵式,共设置三行四列12个按键。
当按键较多时,如果用独立式按键方式就需要较多的接品线,为节省资源,常用行列矩阵式按键盘。
矩阵式按键键盘是指按键排成行和列,按键在行列交叉处,两端分别与行线和列线相连,这样,i行j列可连i×j个按键,但只需要i+j条接口线。
12个按键分别代表数字0~9、确认和清除。
在没有键按下时,P2.0~P2.7都是高电平1,若某个数字键被按下,相应的接口线就变为低电平0。
开锁时必须先按确认键,判断从P2口读入的四个值与存储单元的设定值是否相同,相同才能开锁。
(6)电路原理图
图1-5电路原理图
图1-6实物图
(7)元器件清单
器件名称
规格
数量
电源
1
89C51单片机芯片
1
晶振
1
蜂鸣器
1
共阳数码显示管
1
复位按钮
1
开关
1
电容
22µF
1
电容
30PF
1
按键
12
三极管
NPN
5
发光二极管
4
电阻
51Ω
1
电阻
510Ω
12
电阻
1kΩ
8
表1-2元器件
三、软件设计流程
(1)主要流程图
图1-7主流程图
(2)主函数流程图
图1-8主函数流程图
四、源程序代码
#include"reg51.h"
#include
//数据类型定义
typedefunsignedcharuint8;
typedefunsignedintuint16;
typedefunsignedlonguint32;
typedefcharint8;
typedefintint16;
//芯片引脚定义
#defineLED_IOP0
sbitLED1=P1^0;//接com1
sbitLED2=P1^1;//接com2
sbitLED3=P1^2;//接com3
sbitLED4=P1^3;//接com4
sbitError_1=P1^4;//错误一次亮一盏灯
sbitError_2=P1^5;//错误两次再亮一盏灯
sbitError_3=P1^6;//错误三次再亮一盏灯
sbitKeyOut1=P2^0;//按键右数第一列
sbitKeyOut2=P2^1;//按键右数第二列
sbitKeyOut3=P2^2;//按键右数第三列
sbitKeyOut4=P2^3;//按键右数第四列
sbitKeyIn1=P2^4;//按键第一行
sbitKeyIn2=P2^5;//按键第二行
sbitKeyIn3=P2^6;//按键第三行
sbitBEEP=P1^7;//蜂鸣器
#defineCLEAR10
#defineENTER11
#defineNUL10//段选数组第十个,即显示“-”
#define_E11//段选数组第十一个,即显示“E”
#define_R12//段选数组第十二个,即显示“r”
#define_O13//段选数组第十三个,即显示“o”
#define_G14//段选数组第十四个,即显示“g”
#define_D15//段选数组第十五个,即显示“d”
#define_F16//段选数组第十六个,即显示“F”
voiddelay(uint16n);
voiddelay_ms(uint16n);//延时1ms
uint8Code[4]={1,0,6,8};//正确密码
codeuint8Ledcode[]=
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xBF,0x86,0xAF,0xA3,0x90,0xA1,0x8E};//段选总数组
uint8Led_buf[4],Code_tmp[4],Sit=0,Err_n=0;
//存放段选数组、存储输入密码、位选标志、错误次数标志
int8K_val;//存放返回的键值
//延时程序
voiddelay_ms(uint16n)
{
uint8m=120;//延时1ms
while(n--)
while(m--);
}
//清屏
voidclear(void)
{
Led_buf[0]=Ledcode[NUL];//把四个“-”段选送到Led_buf[]数组中
Led_buf[1]=Ledcode[NUL];
Led_buf[2]=Ledcode[NUL];
Led_buf[3]=Ledcode[NUL];
BEEP=0;//关闭蜂鸣器
}
//初始化IO
voidIO_init(void)
{
LED1=1;
LED2=1;
LED3=1;
LED4=1;
clear();
}
//按键扫描
int8scan_key(void)
{
int8val=-1;//键值
KeyOut1=0;//扫描右数第一列
KeyOut2=1;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)//扫描第一行
{
val=4;//键值为4
while(KeyIn1==0);//判断按键是否放开按键
}
elseif(KeyIn2==0)//扫描第二行
{
val=8;
while(KeyIn2==0);
}
elseif(KeyIn3==0)//扫描第三行
{
val=CLEAR;//键值为CLEAR
while(KeyIn3==0);
}
KeyOut1=1;//扫描右数第二列
KeyOut2=0;
KeyOut3=1;
KeyOut4=1;
if(KeyIn1==0)
{
val=3;
while(KeyIn1==0);
}
elseif(KeyIn2==0)
{
val=7;
while(KeyIn2==0);
}
elseif(KeyIn3==0)
{
val=ENTER;//键值为ENTER
while(KeyIn3==0);
}
KeyOut1=1;//扫描右数第三列
KeyOut2=1;
KeyOut3=0;
KeyOut4=1;
if(KeyIn1==0)
{
val=2;
while(KeyIn1==0);
}
elseif(KeyIn2==0)
{
val=6;
while(KeyIn2==0);
}
elseif(KeyIn3==0)
{
val=0;
while(KeyIn3==0);
}
KeyOut1=1;//扫描右数第四列
KeyOut2=1;
KeyOut3=1;
KeyOut4=0;
if(KeyIn1==0)
{
val=1;
while(KeyIn1==0);
}
elseif(KeyIn2==0)
{
val=5;
while(KeyIn2==0);
}
elseif(KeyIn3==0)
{
val=9;
while(KeyIn3==0);
}
returnval;返回键值
}
//数码管刷新
voidshow_flash(void)
{
LED_IO=Led_buf[0];//把段选送给P0口
LED1=0;//送给com1
delay_ms(4);
LED1=1;//位选1关闭
LED_IO=Led_buf[1];
LED2=0;
delay_ms(4);
LED2=1;
LED_IO=Led_buf[2];
LED3=0;
delay_ms(4);
LED3=1;
LED_IO=Led_buf[3];
LED4=0;
delay_ms(4);
LED4=1;
}
//蜂鸣器
voidbuzz(void)
{
BEEP=1;//蜂鸣器报警
LED_IO=Led_buf[0];//数码管显示Erro
LED1=0;
delay_ms
(1);
LED1=1;
LED_IO=Led_buf[1];
LED2=0;
delay_ms
(1);
LED2=1;
LED_IO=Led_buf[2];
LED3=0;
delay_ms
(1);
LED3=1;
LED_IO=Led_buf[3];
LED4=0;
delay_ms
(1);
LED4=1;
}
//显示GOOD
voidshow_good(void)
{//把good的段选值送给段选数组
Led_buf[0]=Ledcode[_G];
Led_buf[1]=Ledcode[_O];
Led_buf[2]=Ledcode[_O];
Led_buf[3]=Ledcode[_D];
}
//显示ERROR
voidshow_error(void)
{//把Erro的段选值送给段选数组
Led_buf[0]=Ledcode[_E];
Led_buf[1]=Ledcode[_R];
Led_buf[2]=Ledcode[_R];
Led_buf[3]=Ledcode[_O];
}
//比较密码
bitcode_cmp(uint8*code1,uint8*code2)
{
uint8i;
for(i=0;i<4;i++)
{
if(*code1++!
=*code2++)//输入的密码不对则返回1
return1;
}
return0;//正确则返回0
}
main()
{
uint16i;
IO_init();//初始化IO
while
(1)
{
if(Error_3==0)//如果第三盏灯亮则让三盏灯灭
{
Error_1=1;
Error_2=1;
Error_3=1;
}
K_val=scan_key();//扫描按键
if((K_val>=0)&&(K_val<=9))//判断键值是不是数字键
{
Led_buf[Sit]=Ledcode[_F];//显示F
Code_tmp[Sit]=K_val;//保存键值
if(Sit<3)//判断显示的位置
Sit++;
}
elseif(K_val==ENTER)//判断按键是否为确认键
{
if(code_cmp(Code,Code_tmp))//比较密码是否相同
{
show_error();//显示ERROR
Err_n++;//错误次数加一
}
else
show_good();//显示GOOD
if(Err_n==1)
Error_1=0;//错误一次亮一盏灯
if(Err_n==2)
Error_2=0;//错误两次再亮一盏灯
if(Err_n==3)
Error_3=0;//错误三次再亮一盏灯
if(Err_n==3)//错误累计3次
{
buzz();//蜂鸣器响
Err_n=0;//错误次数清零
}
for(i=0;i<140;i++)
show_flash();//刷新数码管
clear();//清除数码管显示
Sit=0;//位置置零
}
elseif(K_val==CLEAR)
{
clear();//清楚数码管显示
Sit=0;//位置清零
}
show_flash();//刷新数码管
}
}
五、系统调试
我们这次的设计课题看似简单,可其实实行起来并不容易。
一开始,我们根据我们所列的电子密码锁的功能不借助任何资料开始自己编写程序,并信心满满。
根据不同的功能,我们写了不同功能的子函数,最后把它们串起来,一个完整的程序就这样在我们眼前出现了。
紧接着我们就着手于在软件上的调试了。
我们用KeiluVision3调试程序进行了我们第一步的检查与调试。
在第一次的编译中发现了有几个语法错误和细节问题,但很快就得到了解决。
然后我们就根据我们接的硬件开始步进调试。
在经过一长串的步进调试检查后得出结论是我们的软件编写没有问题了。
接下来我们就到实验室去烧程序了。
可这时我们发现效果完全不如我们想象那般。
我们就再拿出程序仔细查找问题出自何处。
我们发现之所以在软件上调试成功而硬件上失败是因为我们忽略了是0有效还是1有效的问题了。
于是我们就结合程序和功能先判断每个元器件是0有效还是1有效。
可是当我们确定我们程序中设定的有效值已经正确时而硬件却依然乱七八糟,我们有些心浮气燥了。
在后来的很久时间中我们都纠结于这个问题。
通过老师的提点我们也进行了一个功能一个功能的分开检测,编写了几个小程序,但发现依然找不到原因。
后又请教同学,认为硬件和软件看起来都没有问题,觉得有可能是逻辑问题。
于是我们所幸抛开原来的,查找资料,从别人的程序中取经,根据规范的要求再编写一个程序。
再次软件调试,没有问题。
通过努力,最后我们终于成功了。
六、课程设计体会
作为一名测控专业的大三学生,我觉得做单片机课程设计是十分有意义的,而且是十分必要的。
在已度过的大学时间里,我们大多数接触的是专业课。
我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?
如何把我们所学的专业基础课理论知识运用到实践中去呢?
我想做类似的课程设计就为我们提供了良好的实践平台。
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。
两周周的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
七、参考文献
[1]李光飞,李良儿,楼然苗.单片机C程序设计实例指导.北京:
北京航空航天大学出版社.2005.53-61
[2]朱定华.单片机原理及接口技术实验.北京:
清华大学出版社.北方交通大学出版社.2002.01
[3]张毅刚,彭喜源,谭晓昀,曲春波.MCS-51单片机应用设计[M].哈尔滨:
哈尔滨工业大学出版社,1997.53-61.
[4]蔡明文,冯先成.单片机课程设计.武汉:
华中科技及大学出版社.2007.03