电子密码锁的设计Word文件下载.docx
《电子密码锁的设计Word文件下载.docx》由会员分享,可在线阅读,更多相关《电子密码锁的设计Word文件下载.docx(19页珍藏版)》请在冰豆网上搜索。
本系统共有两部分构成,即硬件部分与软件部分。
其中硬件部分由键盘输入部分、密码存储部分、显示部分、开锁部分组成,软件部分对应的由主程序、初始化程序、键盘扫描程序、启动程序、关闭程序、密码设置程序等组成。
具体原理框图如附录图所示。
AT90C52
键盘输入
电源
显示电路
开锁电路
【五】实验结果
在keil软件上输入完成程序之后运行逻辑没有错误,然后将程序下载如开发板。
完成之后,依次输入5个数字密码,由于程序中设有原始密码,输入后将与设定好的密码对比,若5个数字相同进入in界面,说明密码正确。
若5个数字不与设定密码相同,系统返回help界面,说明密码不正确。
最后用户在3次内都没能输入正确的密码,则蜂鸣器长时间报警,结束之后开始60秒倒计时,在这一分钟之内用户不能在键盘上进行任何操作,直至60S结束才能重新进行操作。
在输入密码的时候,输入的数字不显示,密码只有操作者自己知道。
在一段时间确认没有键盘输入时,*键上锁或者一段时间后自动上锁,时间由确定的j的大小决定,自动上锁的时间不会很长。
修改密码的时候,密码输入成功之后进入in界面之后才能修改。
【六】设计中遇到的问题及解决方法
这次密码锁设计遇到的最大的两个问题一个是错误三次锁死无法实现,一个是定时器功能无法实现。
一个问题产生的主要原因是因为早期将键盘扫描程序mat_keyget()写在了错误是否小于3次的判断语句之前,导致即使错误3次仍然能执行键盘扫描,未能达到锁死键盘的效果。
后来将mat_keyget()写在了主程序判断错误语句的里面,这样一旦错满3次,自动跳到外面,脱离了键盘扫描,从而达到了锁死键盘的效果。
实习中还遇到了其他些许问题,如定时12s,使用户若未能在12s内输入完密码并且按下确认键,即使密码输入正确也会被判为无效,即错误一次。
在实际操作过程中,t自加一次用时50ms,所以定时12s应为:
50*20*12。
而在实际操作过程中,由于晶振误差和操作误差,实际时间长于12s,因此最后将数值设为200,在循环内进行操作,减小了误差。
【七】总结
实践是检验真理的唯一标准,当然也是检验学习成果的标准。
在经过一段时间的学习之后,我们需要了解自己的所学应该如何应用在实践中,因为任何知识都源于实践,归于实践,所以要将所学的知识在实践中来检验。
从这次试验如果要一个人来做,我想也是做不了这么快的,因此我们不得不归功于集体的力量,分配合作对于这种近乎于模块化设计的东西来说是非常有利的,当然我们也碰到过问题,这在调试错误这一节中也说得很是明白了,但是我们也并没有灰心丧气,也是把问题一点一点地克服了下来.在这个之中我也是深切的感受到了理论知识的重要性,不能光是从手头上从硬件上找问题,我们也要从软的例如程序上或是设计思路上思考这样的解决方案是不是有较大的缺陷.
通过这个不难也不是很简单的实验我们认识到了团结协作,互帮互助的好处,这次课程设计也可以说是考完试后通过实践检验真理的一次宝贵机会,我们都为能够顺利完成本次实验感到无比的骄傲和自豪。
附录:
主要源程序以及原理实现框图
程序代码:
main.c
#include"
reg52.h"
string.h"
display.h"
mat_keyget.h"
24c02.h"
status.h"
unsignedchardigital_display[]={16,16,16,16,16,16,16,16};
unsignedchare2prom_addr[]={0x00,0x01,0x02,0x03,0x04};
unsignedcharcodecipher[]={2,2,3,4,5};
unsignedcharcipher_temp[6],password[5];
unsignedcharerror_num=0;
unsignedcharcodedigital_lock[]={26,26,17,18,19,26,26,26};
//--OUT---
unsignedcharcodedigital_open[]={26,26,20,21,22,23,26,26};
//--OPEN--
unsignedcharcodedigital_help[]={26,26,20,22,25,21,26,26};
//--HELP--
unsignedcharcodedigital_in[]={26,26,26,24,25,26,26,26};
//---IN---
voidlock(void)//关锁
{
unsignedchari;
for(i=0;
i<
8;
i++)
digital_display[i]=digital_lock[i];
buzzer_on();
delay_500us(200);
buzzer_off();
}
voidopen(void)//开锁
{
digital_display[i]=digital_open[i];
}
voidcipher_change()//修改密码
unsignedchari=0;
unsignedcharj;
digital_display[0]=26;
digital_display[1]=26;
digital_display[2]=26;
digital_display[3]=26;
digital_display[4]=26;
digital_display[5]=16;
digital_display[6]=16;
digital_display[7]=16;
while(i!
=5)
{
if(mat_keyget()!
=10)
{
j=mat_keyget();
delay_500us(20);
if(mat_keyget()==j)
{
if(j==11)//*键删除,
{
if(i>
0){
i--;
digital_display[i]=23;
}
}
else{
if(j==12);
//#键无效
else{
cipher_temp[i]=j;
digital_display[i]=27;
//隐藏密码
i++;
}
}
while(mat_keyget()!
=10)digital_tube(digital_display);
//松手检测
}
digital_tube(digital_display);
}
while(mat_keyget()!
=12)digital_tube(digital_display);
for(j=0;
j<
5;
j++)
wrbyte_24c02(e2prom_addr[j],cipher_temp[j]);
for(j=0;
password[j]=rdbyte_24c02(e2prom_addr[j]);
//读取密码
j++)//显示成功界面
digital_display[j]=digital_in[j];
while(j<
200)//*键上锁或者一段时间后自动上锁,时间有I的大小决定;
if(mat_keyget()==11)//*键上锁
{
digital_tube(digital_display);
if(mat_keyget()==11)
{lock();
break;
digital_tube(digital_display);
voidcipher_input()
unsignedintj;
{
if(j==11)//*键删除
if(i>
0)
i--;
digital_display[i]=23;
//无效按键
//隐藏密码
if(memcmp(cipher_temp,password,5)==0)//密码相同,开锁
open();
j=0;
while(j<
500)
if(mat_keyget()==11)//*键上锁
}//#键修改密码
if(mat_keyget()==12)
if(mat_keyget()==12)
while(mat_keyget()!
cipher_change();
break;
digital_tube(digital_display);
//界面显示
j++;
//一段时间后自动上锁
lock();
else//错误报警
for(j=0;
j++)//显示错误界面
digital_display[j]=digital_help[j];
250;
error_num++;
if(error_num==3)//错误超过三次长报警
error_num=0;
buzzer_on();
digital_display[j]=digital_help[j];
buzzer_off();
j=60;
i=0;
//显示倒计时
digital_display[0]=16;
digital_display[1]=16;
digital_display[2]=16;
digital_display[3]=16;
digital_display[4]=16;
while(j>
{
digital_display[6]=j/10;
digital_display[7]=j%10;
for(i=0;
150;
j--;
lock();
voidinit(void)
password[i]=rdbyte_24c02(e2prom_addr[i]);
lock();
voidmain(void)
{
init();
while
(1)
if(mat_keyget()==12)//#键开始密码输入
{
if(mat_keyget()==12)
while(mat_keyget()!
=10)//松手检测
cipher_input();
//输入密码
}
//待机界面
键盘扫描模块:
//3×
4键盘矩阵扫描函数
unsignedcharmat_keyget(void)
unsignedchartemp=10;
P1=0xfe;
switch(P1)
case0xee:
temp=1;
//对应显示"
1"
case0xde:
temp=2;
2"
case0xbe:
temp=3;
3"
default:
P1=0xfd;
switch(P1)
case0xed:
temp=4;
4"
case0xdd:
temp=5;
5"
case0xbd:
temp=6;
6"
P1=0xfb;
case0xeb:
temp=7;
7"
case0xdb:
temp=8;
8"
case0xbb:
temp=9;
9"
P1=0xf7;
{
case0xe7:
temp=11;
*"
case0xd7:
temp=0;
0"
case0xb7:
temp=12;
#"
default:
return(temp);
#ifndef_DISPLAY_H
#ifndef_MAT_KEYGET_H
#define_MAT_KEYGET_H
unsignedcharmat_keyget();
#endif
数码管显示模块:
unsignedchardigital_duan[]={
0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,
0xc6,0xa1,0x86,0x8e,
0xff,0xC0,0xC1,0xCE,//16:
全灭17:
018:
U19:
T
0x89,0x8C,0x86,0xC8,//20:
H21:
P22:
E23:
N
0XCF,0XC7,0xBF,0x00,//24:
I25:
L26:
-27:
全亮
};
//全灭;
0xff全亮:
0x00;
//OPENO:
0XC0;
P:
0X8C;
E:
0X86;
N:
0XC8-:
0XBF
unsignedchardigital_wei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
//延时nms
voiddelay_500us(unsignedintnms)
unsignedinti,j;
for(i=nms;
i>
0;
i--)
for(j=110;
j>
j--);
voiddigital_tube(unsignedchardisplay[])
for(i=0;
P2=digital_wei[i];
//打开第i个COM口
P0=digital_duan[display[i]];
//送入显示数据
delay_500us
(1);
#define_DISPLAY_H
#include"
voiddelay_500us(unsignedintnms);
voiddigital_tube(unsignedchardisplay[]);
蜂鸣器模块:
sbitbuzzer=P3^7;
voidbuzzer_off(void)//蜂鸣器打开
buzzer=1;
voidbuzzer_on(void)//蜂鸣器关闭
buzzer=0;
#ifndef_STATUS_H
#define_STATUS_H
voidbuzzer_on(void);
voidbuzzer_off(void);
24c02存储模块:
voidiic_start(void)
SDA=1;
_nop_();
SCL=1;
somenop;
SDA=0;
SCL=0;
voidiic_stop(void)
voidiic_ack(bitackbit)
if(ackbit)
else
bitiic_waitack(void)
if(SDA)
iic_