嵌入式电子密码锁设计报告.docx

上传人:b****5 文档编号:5938329 上传时间:2023-01-02 格式:DOCX 页数:25 大小:1.32MB
下载 相关 举报
嵌入式电子密码锁设计报告.docx_第1页
第1页 / 共25页
嵌入式电子密码锁设计报告.docx_第2页
第2页 / 共25页
嵌入式电子密码锁设计报告.docx_第3页
第3页 / 共25页
嵌入式电子密码锁设计报告.docx_第4页
第4页 / 共25页
嵌入式电子密码锁设计报告.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

嵌入式电子密码锁设计报告.docx

《嵌入式电子密码锁设计报告.docx》由会员分享,可在线阅读,更多相关《嵌入式电子密码锁设计报告.docx(25页珍藏版)》请在冰豆网上搜索。

嵌入式电子密码锁设计报告.docx

嵌入式电子密码锁设计报告

嵌入式-电子密码锁-设计报告

 

一、课题名称:

电子数码锁

二、课题功能描述:

随着电子技术的发展,具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。

电子密码锁与普通机械锁相比,具有许多独特的优点:

保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。

电子密码锁是一种通过密码输入来控制电路或是芯片工作,从而控制机械开关的闭合,完成开锁、闭锁任务的电子产品。

它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。

现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。

其性能和安全性已大大超过了机械锁,其特点如下:

1.保密性好,编码量多,远远大于弹子锁。

随机开锁成功率几乎为零。

2.密码可变。

用户可以经常更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。

3.误码输入保护。

当输入密码多次错误时,报警系统自动启动。

4.电子密码锁操作简单易行。

三、电路原理:

1.电原理图

2.电路各单元原理说明、理论计算结果

1.AT89C51引脚图

 

2.AT89C51引脚功能介绍

单片机芯片AT89C51为40引脚双列直插式封装。

其各个引脚功能介绍如下:

(1)VCC:

供电电压;

(2)GND:

接地;

(3)P0口——P0口为一个8位漏级开路双向I/O口,每个管脚可吸收8TTL门电流。

当P1口的管脚写”1”时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

(5)P2口——P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写”1”时,其管脚电位被内部上拉电阻拉高,且作为输入。

作为输入时,P2口的管脚电位被外部拉低,将输出电流,这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址”1”时,它利用内部上拉的优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

(6)P3口——P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入”1”后,它们被内部上拉为高电平,并用作输入。

作为输入时,由于外部下拉为低电平,P3口将输出电流(ILL)。

(7)RST:

复位输入端。

当振荡器复位时,要保持RST脚两个机器周期的高电平时间。

(8)ALE/PROG

当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

(9)PSEN

外部程序存储器的选通信号。

在由外部程序存储器取址期间,每个机器周期PSEN两次有效。

但在访问外部数据存储器时,这两次有效的PSEN信号将不出现。

(10)EA/VPP

当EA保持低电平时,访问外部ROM;注意加密方式1时,EA将内部锁定为RESET;当EA端保持高电平时,访问内部ROM。

(11)XTAL1:

反向振荡放大器的输入及内部时钟工作电路的输入。

(12)XTAL2:

来自反向振荡器的输出。

3.复位电路

复位电路采用手动复位与上电复位相结合的方式。

当按下按键时,VCC通过R2阻给复位输入端口一个高电平,实现复位功能,即手动复位。

上电复位就是VCC和电容C构成回路,该回路是一个对电容C充电和放电的电路,所以复位端口得到一个周期性变化的电压值,并且有一定时间的电压值高于CPU复位电压,实现上电复位功能。

4.晶振电路

XTAL1(X1)为反向振荡放大器的输入及内部时钟工作电路的输入。

XTAL2(X2)是来自反向振荡器的输出。

按照理论上AT89C51使用的是12MHz的晶振,但实测使用11.0592MHz。

所以设计者通常用的是11.0592MHz。

5.七段数码管

数码管使用条件:

a、段及小数点上加限流电阻

b、使用电压:

段:

根据发光颜色决定;小数点:

根据发光颜色决定

c、使用电流:

静态:

总电流80mA(每段10mA);动态:

平均电流4-5mA峰值电流100mA

上面这个只是七段数码管引脚图,其中共阳极数码管引脚图和共阴极的是一样的。

数码管使用注意事项说明:

(1)数码管表面不要用手触摸,不要用手去弄引角;

(2)焊接温度:

260度;焊接时间:

5S

(3)表面有保护膜的产品,可以在使用前撕下来。

这类数码管可以分为共阳极与共阴极两种,共阳极就是把所有LED的阳极连接到共同接点com,而每个LED的阴极分别为a、b、c、d、e、f、g及dp(小数点);共阴极则是把所有LED的阴极连接到共同接点com,而每个LED的阳极分别为a、b、c、d、e、f、g及dp(小数点),如下图所示。

图中的8个LED分别与上面那个图中的A~DP各段相对应,通过控制各个LED的亮灭来显示数字。

那么,实际的数码管的引脚是怎样排列的呢?

对于单个数码管来说,从它的正面看进去,左下角那个脚为1脚,以逆时针方向依次为1~10脚,左上角那个脚便是10脚了,上面两个图中的数字分别与这10个管脚一一对应。

注意,3脚和8脚是连通的,这两个都是公共脚。

还有一种比较常用的是四位数码管,内部的4个数码管共用a~dp这8根数据线,为人们的使用提供了方便,因为里面有4个数码管,所以它有4个公共端,加上a~dp,共有12个引脚,下面便是一个共阴的四位数码管的内部结构图(共阳的与之相反)。

引脚排列依然是从左下角的那个脚(1脚)开始,以逆时针方向依次为1~12脚,下图中的数字与之一一对应。

3.电路仿真结果与数据(单片机仿真电路截图、仿真结果截图)

单片机仿真电路

使用的程序

初始密码001输入

显示密码正确,七段数码管显示YES,绿灯亮

输入错误密码200

密码错误,七段数码管显示no,错误次数为1

4.软件框图、主程序流程图、关键子程序代码说明

图一:

软件框图

图二:

主程序流程图

关键子程序代码说明

charge():

比较密码

choose():

检测S11键,对值+1

Delay_1ms(uchari):

1ms延子程序

voiddisplay(m,n):

//显示子函数,m为显示的字数,n为相应显示的位选信号

voidend():

//密码错三次的状态

voidgive():

//赋予相应的比较密码值

voidshaomiao():

//比较密码时按位显示功能

voidTime0_Init():

//计数器0的初值

voidTime0_Int()interrupt1:

//设定中断产生时的状态

voidweixuan():

//检测S21按下,对原密码值位选择

voidxchoose()//检测S11键,检测到S11按下,对于修改密码的数+1;

voidxgive()//赋予相应修改后的密码值

voidxshaomiao()//比较密码修改后按位显示功能

voidxweixuan()//检测S21按下,对修改密码值位选择

四、电路调试与测试数据

1.调试过程发生问题及其解决

1)延时时间分配问题;

解决:

经过不断地计算、调试和实验验证得到了一个准确的延时时间分配。

2)状态跳转问题;

解决:

通过翻阅C语言教程和资料,以及在网络上不断地查找相关案例和程序语言,得到了一个相对理想的语言组合。

3)数组赋值问题(当程序已成功的在硬件上成功实现的情况下,发现七段数码管在仿真中因为是动态扫描,会产生以确定数值显示的数会跟随之后的其他数码管显示的数进行变化);

解决:

在通过对数码管的动态扫描时间进行修改范围从20us至20s,但发现不能解决;后来在经过老师的回答后了解了锁存器的作用,对于代码进行了修改。

4)检测问题;

解决:

首先通过肉眼进行检查对于电路板上硬件的焊接处是否存在虚焊和假焊,其次通过对万用表的使用以确定电子元器件性能和功能上可靠性。

2.参数测试记录

●9012放大器参数

9012结构:

PNP

集电极-发射极电压    -30V

集电极-基电压          -40V

射极-基极电压         -5V

集电极电流            0.5A

耗散功率             0.625W

结温                  150℃

特怔频率    最小   150MHZ

放大倍数:

D64-91E78-112F96-135G122-166H144-220I190-300

●七段数码管位选通信号

数码管动态扫描显示,是将所用数码管的相同段(a~g和p)并联在一起,通过选位通信号分时控制各个数码管的公共端,循环依次点亮各个数码管。

当切换速度足够快时,由于人眼的“视觉暂留”现象,LED灯会被全部点亮。

图5-4位选信号时序波形图数码管选通控制信号分别对应3个数码管的公共端,当某一位选通控制信号为高电平时,其对应的数码管被点亮,因此通过控制选通信号就可以控制数码管循环依次点亮。

一个数码管稳定显示要求的切换频率要大于50Hz,那么3个数码管则需要50×3=150Hz以上的切换频率才能看到不闪烁并且持续稳定显示的字符。

五、实验结论及改进方案

1.实验结论

我们组的电子密码锁实验是基于89C51芯片内的比较器模块以及RAM存储器的功能上实现的。

我们将初始密码001放入RAM,将其与输入密码进行比较,相同电子锁打开,不同电子锁不打开。

2.改进方案

因原始方案中没有设计结果显示,以至于输入密码后不易判断电子锁是否开启。

因此,我们在设计中加入了密码反馈的内容。

在输入密码正确时,绿灯亮,七段数码管显示出YES的字样;错误时,红灯亮,七段数码管显示NO的字样,蜂鸣器发出警报。

六、实验收获与体会

我们专业上学期开设了单片机课程,对单片机这门课程有了初步的了解,这次的单片机课程设计短学期给了我们进一步了解并掌握单片机的机会,我们都感到非常的兴奋。

学习的过程中,帮助最大之一无疑是来自网络。

很多时候,通过网络,我们都可以获取到所需要的学习资料。

但是,随着我们学习的深入,我们会发现,网络提供的东西是有限度的,好像大部分的资料都差不多,或者说是适合大部分的初学者所需,而当我们想进一步提高时,却发现能够获取到的资料越来越少,单片机资料中大部分不好使流水灯就是LED,液晶,而且只是功能性的演示。

因此,我们小组四人都非常珍惜这次的单片机设计短学期,因为小组我们四人都对单片机的学习产生了浓厚的兴趣,认为单片机对自己在电子技术方面的学习有很大的帮助。

虽然这次短学期只有短短的两周的时间,但是我想只要我们小组用心学习,认真准备,共同探讨,齐心协力,一定会有所收获,希望老师也能对我们有所期待。

以下是对这次单片机学习的总结:

(1)学习单片机没有捷径,不能指望两三天就学会,要坚持不懈,重在积累。

(2)单片机是一门应用性和实践性很强的学科,要多动手,多做实验。

(3)要学会参考别人的程序,减少自己琢磨的时间,迅速提高自己的编程能力。

(4)碰到问题可以借助网络来搜寻答案和对自己有帮助的问题,一定会有所收获。

(5)小组要团结,小组之间要多交流。

技术是靠不断的积累和交流才会进步的,封闭自守只会更加落后。

致谢:

感谢黄老师和余老师的细心指导

附录

1.参考资料

[1]陈梓城《实用电子电路设计与调试》;中国电力出版社2006

[2]高吉祥《全国大学生电子设计大赛培训教程》;电子工业出版社2007.5

[3]阎石《数字电子技术基础(第四版)》;高等教育出版社;1998

[4]高吉祥《模拟电子技术基础(第四版)》;电子工业出版社出版社;2007

2.程序代码(要有注释)

#include

#include

#defineuintunsignedint

#defineucharunsignedchar

ucharcodetable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};

sbitS11=P2^4;//选数字键

sbitS21=P2^5;//位选键

sbitRED=P1^0;//红灯

sbitLED=P1^6;//绿灯键

sbitBell=P1^7;//蜂鸣器

uchara=0;//类似汇编语言中的A寄存器功能

ucharc=0;//设定双键按下时的延时时间c=5秒;

ucharenter=0;//设定信号wrong

ucharV1,V2,V3;//输入的密码

ucharW1=0,W2=0,W3=1;//默认密码

ucharwrong=0;//设定信号wrong

ucharright=0;//设定信号right

ucharkeyi=0;//设定信号keyi

uintl=0;//设定延时循环值l

uinth=0;//设定延时循环值h

uintCount=0;//设定

voidTime0_Init()//计数器0的初值

{

TMOD=0x01;//设定计数器0工作方式1

TH0=0x4c;//TH=0x4c00;

TL0=0x00;

IE=0x82;//设定中断,EA=1;时钟中断

TR0=1;//开启计数器0

}

voidTime0_Int()interrupt1//设定中断产生时的状态

{

TH0=0x4c;

TL0=0x00;//TH值重新载入

Count++;//没计完一次载入,Count加一

if(Count==20)

{Count=0;c++;}//长度加1

}

voidDelay_1ms(uchari)//1ms延时函数

{

ucharx,j;

for(j=0;j

for(x=0;x<=148;x++);

}

voiddisplay(m,n)//显示子函数

{

P0=0xFF;

P2=0xFF;

P0=table[m];

P2=n;

Delay_1ms(5);

}

voidchoose()//检测S11键,检测到S11按下,变数

{

P2=0xF7;

if(!

S11&&S21)

{

Delay_1ms(20);

P2=0xF7;

if(!

S11&&S21)

{

Delay_1ms(20);

P2=0xF7;

if(!

S11&&S21)

{

Delay_1ms(20);

a++;

if(a==10){a=0;}

Delay_1ms(200);

}

}

}

}

voidxchoose()//检测S11键,检测到S11按下,变数

{

P2=0xF7;

if(!

S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S11)

{

Delay_1ms(20);

a++;

if(a==10){a=0;}

Delay_1ms(200);

}

}

}

}

voidweixuan()//检测S21,对原密码值位比较

{

P2=0xF7;

if(!

S21&&S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21&&S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21&&S11)

{

Delay_1ms(20);

enter++;keyi=1;

Delay_1ms(200);

}

}

}

}

voidxweixuan()//修改值位检测

{

P2=0xF7;

if(!

S21)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21)

{

Delay_1ms(20);

enter++;keyi=1;

Delay_1ms(200);

}

}

}

}

voidgive()//赋予相应的值

{

if(enter==1&&keyi==1){V1=a;keyi=0;a=0;}

if(enter==2&&keyi==1){V2=a;keyi=0;a=0;}

if(enter==3&&keyi==1){V3=a;keyi=0;a=0;}

}

voidxgive()//赋予相应的密码

{

if(enter==1&&keyi==1){W1=a;keyi=0;a=0;}

if(enter==2&&keyi==1){W2=a;keyi=0;a=0;}

if(enter==3&&keyi==1){W3=a;keyi=0;a=0;}

}

voidshaomiao()//显示功能

{

if(enter==0)

{

display(a,0xFE);

}

if(enter==1)

{

display(V1,0xFE);

display(a,0xFD);

}

if(enter==2)

{

display(V1,0xFE);

display(V2,0xFD);

display(a,0xBF);

}

if(enter==3)

{

display(V1,0xFE);

display(V2,0xFD);

display(V3,0xBF);

}

}

voidxshaomiao()//显示

{

if(enter==0)

{

display(a,0xFE);

}

if(enter==1)

{

display(W1,0xFE);

display(a,0xFD);

}

if(enter==2)

{

display(W1,0xFE);

display(W2,0xFD);

display(a,0xBF);

}

if(enter==3)

{

display(W1,0xFE);

display(W2,0xFD);

display(W3,0xBF);

}

}

voidend()//密码错三次的状态

{

while

(1)

{

P2=0xBC;

P1=0xF0;

P0=0xBF;

}

}

voidcharge()//比较密码

{

if(enter==4)

{

if(V1==W1&&V2==W2&&V3==W3)

{

right=1;a=0;wrong=0;

while(l<100)

{

P0=0x91;

P2=0xFE;

Delay_1ms(4);

P0=0x86;

P2=0xFD;

Delay_1ms(4);

P0=0x92;

P2=0xBF;

Delay_1ms(4);

l++;

}

l=0;

while(l<1000)

{

Delay_1ms(3);

l++;

LED=0;

P2=0xFF;

}

l=0;LED=1;

}

else

{

right=0;wrong++;

while(l<100)

{

P0=0xC8;

P2=0xFE;

Delay_1ms(5);

P0=0xC0;

P2=0xFD;

Delay_1ms(5);

P0=table[wrong];

P2=0xBF;

Delay_1ms(5);

l++;

}

RED=0;P2=0xFF;l=0;

while(l<1000)

{

Bell=!

Bell;

Delay_1ms(3);

l++;

}

l=0;RED=1;

if(wrong==3){end();}

}

enter=0;

}

}

voidmain()

{

start:

while

(1)

{

choose();

weixuan();

give();

shaomiao();

charge();

if(right==1)//修改密码键检测

{

P2=0xF7;

if(!

S21&&!

S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21&&!

S11)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21&&!

S11)

{

Delay_1ms(200);

Time0_Init();

if(c==5)

{

Delay_1ms(20);

P2=0xF7;

if(!

S21&&!

S11)

{c=0;TR0=0;P2=0xFF;P0=0xFF;gotonext;}

}

}

}

}

}

}

next:

while

(1)//进入修改界面

{

P2=0xF7;

while(!

S21&&!

S11)

{

Delay_1ms(20);

P2=0xF7;

while(!

S21&&!

S11)

{

a=0;enter=0;

}

Delay_1ms(200);

while(l<3)

{

while(h<100)

{

P0=0xC6;

P2=0xFE;

Delay_1ms(5);

P0=0xF0;

P2=0xFD;

Delay_1ms(5);h++;

}

h=0;

while(h<100)

{

P0=0xC6;

P2=0xFE;

Delay_1ms(5);

P0=0xF0;

P2=0xBF;

Delay_1ms(5);h++;

}

h=0;

l++;

}

l=0;

}

xchoose();

xweixuan();

xgive();

xshaomiao();

if(enter==4){right=0;a=0;enter=0;gotostart;}//输完密码

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 育儿知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1