基于8086的电子密码锁技术报告Word文档下载推荐.docx
《基于8086的电子密码锁技术报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于8086的电子密码锁技术报告Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
若输入错误密码超过5次,警报会自动响起,只有再次输入正确密码后方可解除警报。
第2章硬件电路设计
2.1相关芯片简介
1.8255
第一片8255
定义A.B.C口都为输出状态,A.B口控制数码管的输入口,对应相应的段码表,来显示。
C口的PC0,PC1经过2-4译码器,来激活数码管1,2,3,4通道,并采用00,01,10,11,循环输出的方式,使数码管通道循环激活,实现动态显示。
第二片8255
定义A,B,C口都为输入状态,对应输入相应的按钮状态,对应相应的程序,实现相应功能。
2.8253
使用0通道,方式3,对输入的始终信号分频,当输入密码次数大于5次时,初始化8253,并发出警报提示声。
当输入密码正确后,激活1通道,警报提示声接触。
3.2-4译码器
由于8086运行速度过快,数码管动态显示出现显示不全的现象,因此PC0,PC1输出经过2-4译码器之后,再激活数码管,起到缓冲作用。
4.16位数码管
16位数码管的数码管,由16个引脚控制,低电平有效,其中A-H控制外圈0,
K-M控制内部*
S1-s4是通道控制,高电平有效。
2.2仿真电路总体设计
本实验设计中,硬件部分涉及到了8086CPU、可编程并行接口8255A,并配合74LS373锁存器、74LS245缓冲器、74LS138译码器等基本元器件,实现了设想的电子密码锁。
8255A:
如图2-6,8255A的D0~D7端口与CPU数据线ADO~AD7相接,CPU通过控制线的片选、读、写信号接口对8255A进行读、写与片选操作。
外设接口端的A0-A7八个开关连接245的A0-A7端口,将外设信息传送到245中,键入密码输入、密码确定、修改密码等多种功能。
图2-6开关功能
如图2-7,A口的PA0-PA7端口通过锁存器与数码管相连用于外圈显示,B口的PB0-PB7端口通过74LS373锁存器与数码管进行连接用于内部“米”字格的显示。
第3章软件编程设计
3.1系统概述
密码锁是一种通过密码输入来控制电路或芯片工作,从而控制机械的开关和闭合,完成开锁闭锁任务的电子产品。
它的种类很多,有简易的电路产品,也有基于芯片的性价比较高的产品。
现在运用较广的电子密码锁是以芯片为核心,通过编程来实现的,其性能和安全性已大大超过机械锁。
其特点是保密性好,随机开锁成功率几乎为零。
密码可变,用户可随时更改密码,防止密码被盗,同时也可以避免因人员的更替而使锁的密级下降。
无活动零件,不会磨损,寿命长。
使用灵活性好,不像机械锁必须佩带钥匙才能开锁。
3.2程序流程图设计
密码的输入与判定
位数+1
N
Y
N
Y
图3-1密码的输入与判定
密码的更改
图3-2密码的更改
3.3按键控制
(1)、控制字
给8255A输入端口控制字:
voidfun82531()
{
__asm
movdx,0x8006
moval,0x37
outdx,al
}
outp(GATE0,0x02);
outp(GATE0,0x00);
voidfun82532()
moval,0x77
outp(GATE0,0x99);
(2)、密码键入控制
整个过程中主要是对是否有按键信息输入进行扫描判断,并将所得信息与灯管编号进行比对,确定所选择要键入数字的灯管。
当目前的灯管数字被选出后,自动跳到下一个灯管,直到四位数字全部选择完毕。
3.4字符动态显示
四位密码选出后,显示四位选定数字,然后检测密码正确性,8255A通过端口A、B、C读取指令,根据检测结果,密码正确则输出代码显示*YES,错误则显示ERRO。
见附录:
检测密码正确性
更改密码,键入“更改密码”控制字后,与输入密码的流程相同,先选择灯管,待选定数字后跳至下一个,直到四位数字全部选定,然后键入“确认更改”指令,则密码更改成功。
密码更改
第4章系统实现
4.1proteus仿真实验
图4-1Proteus仿真图
如图4-1,为本实验的Proteus仿真模拟图,整个实验共用到8086CPU一个、74LS245一个、可编程并行接口8255A一个,74LS273锁存器三个、74LS138译码器一个、数码管一个、与非门两个、开关八个、电阻八个。
第5章与军事方面的联系
电子密码锁对于军事方面有很大意义,应用也十分广泛。
部队的许多地方都比较重要,比如弹药库、武器库,和一些存放有关于军事机密的地方等,除了要有人看管以外,还要上锁,而对于普通的锁来说,电子密码锁无疑是较为便捷和安全的。
用钥匙解锁的话,钥匙可能丢失,也可能被人偷去复制,安全性较低,而电子密码锁不用携带钥匙,只需要记住密码,也不用担心丢失和被他人窃取,在更换密码上电子密码比较方便;
在外面的只有密码输入装置,遇到暴力破解时也能保证物品的安全。
第6章结论
6.1设计总结
通过对电子密码锁的设计,从设计硬件电路到编写代码,再到对程序的调试,在整个的设计过程中学到了很多。
例如,我们用到了8255A的并行接口,将二进制的控制信息传入8086CPU中处理,选择对密码是否正确进行调整。
与此同时,我们又通过这次产品的设计加深了对硬件知识的理解以及常用芯片功能的掌握。
在使用8255A和8253的时候,要对其进行初始化,这初始化程序的编写,有助于对这些接口芯片的工作原理的理解。
总之,在实验中自己动手,把理论知识用于实践,从中能够学到很多。
6.2收获与体会
通过这一个多月以来对电子密码锁的硬件电路的设计,以及对软件程序的编写,我们又对计算机硬件技术基础这门课程有了更深一层的理解。
与此同时,我们还有如下收获:
首先,我们能熟练掌握计算机硬件技术知识,其中包括硬件电路设计和软件编程设计等内容。
计算机硬件技术基础是比较难学的科目,尤其是对那些没有过编程基础的学员来说,刚开始接触时感觉力不从心。
但是,通过设计这个电子密码锁,我组成员都能对硬件设计以及软件编程熟练掌握,并且能实现原计划的功能,效果比较显著。
其次,增强了我们组员之间的团结协作的能力。
通过实验,我们明白了团队力量的强大,只有一个团队能够齐心协力、合理分工,工作才能有条不紊的高效开展。
最后,我们能够将自己设计的东西应用于实际生活当中,充分体现了它的价值。
作为军校学员,我们有责任去开发设计有利于部队生活实际的东西,这也是我们每一个学员的义务所在。
6.3缺点与不足
虽然在这次电子密码锁的制作中我们收获了很多,但是也不乏问题存在。
首先,刚开始的时候分工不明确,导致制作进程比较缓慢。
由于刚接触一门全新的课程,再加上对程序的编写不是很熟悉,所以大家都不知道从何入手,没有明确的分工。
随着教员对硬件知识的讲解,再结合平时的小组讨论与自我学习,大家对C语言基本理解。
于是开始分配任务,有主攻硬件设计的,有软件编程的,也有PPT制作和论文编写的,以此提高了我们的效率。
其次,由于我们知识积累不足,导致大家在制作中遇到很多困难,期出现厌烦心理,抱怨声音较多,甚至出现了分歧与争吵。
当然,对于一个团队来说,出现矛盾是在所难免的,这时候作为组长更应该起到稳定军心的作用。
大家在一起,从头来过,寻找解决问题的办法,一起攻克难关。
最后,是制作时间比较少。
由于我们身处军校这个特殊的环境,平时白天进行文化课的学习,下午又有体能训练,所以自主时间比较少。
我们平时的制作也只能利用晚自习、晚加班的时间进行,这同样也是影响制作进程的原因之一。
程序:
#defineGATE00x8000
#defineGATE10x8002
#defineGATE20x8004
#defineGATECOM0x8006
#defineIOA10xc000
#defineIOB10xc002
#defineIOC10xc004
#defineIOCC10xc006
#defineIOA20xD000
#defineIOB20xD002
#defineIOC20xD004
#defineIOCC20xD006
charerr1[]={0CH,38H,38H,00H};
charerr2[]={77H,67H,67H,0FFH};
charcs[]={0b00000000,0b00000001,0b00000010,0b00000011};
charnum1[]={00H,0f3h,88h,0c0h,73h,44H,04H,0F0H,00H,40H};
charnum2[]={0ffh,0ffh,77h,77h,77h,77h,77h,0ffh,77h,77h};
charyes1[]={0FFH,0FFH,0CH,44h,};
charyes2[]={00H,0DAH,77H,77h};
voidoutp(unsignedintaddr,chardata)
//Outputbytetoport
{__asm
{movdx,addr
moval,data
charinp(unsignedintaddr)
//Inputbytefromport
{charresult;
inal,dx
movresult,al
returnresult;
/////////////////////////
voidfun82531()
voiddelay(ints)
{
unsignedinti,j;
for(i=0;
i<
s;
i++)
for(j=0;
j<
1000;
j++);
//大约s=20延时1s
}
//********************************************************
voidyes()
chartmp;
inti;
charyes1[]={0FFH,0FFH,0CH,44h,};
charyes2[]={00H,0DAH,77H,77h};
charcs[]={0b00000000,0b00000001,0b00000010,0b00000011};
tmp=inp(IOA2);
while(tmp==0xffed)
{tmp=inp(IOA2);
4;
outp(IOC1,cs[i]);
outp(IOA1,yes1[i]);
outp(IOB1,yes2[i]);
delay
(1);
//*************************************************************
voidfun82551()
movdx,0xc006
moval,0x80
voidfun82552()
movdx,0xD006
moval,0x9b
//**************************************************************
voiderr()//密码错误
charerr1[]={0CH,38H,38H,00H};
charerr2[]={77H,67H,67H,0FFH};
outp(IOA1,err1[i]);
outp(IOB1,err2[i]);
//***********************************************************************
voidchushihua(intr)//复位
if(r==1)
outp(IOA1,num1[0]);
outp(IOB1,num2[0]);
charxianshi()
charresult;
tmp=inp(IOB2);
if(tmp==0xfffe)//0
result=0;
if(tmp==0xfffd)//1
outp(IOA1,num1[1]);
outp(IOB1,num2[1]);
result=1;
if(tmp==0xfffb)
outp(IOA1,num1[2]);
outp(IOB1,num2[2]);
result=2;
if(tmp==0xfff7)
outp(IOA1,num1[3]);
outp(IOB1,num2[3]);
result=3;
if(tmp==0xffef)
outp(IOA1,num1[4]);
outp(IOB1,num2[4]);
result=4;
if(tmp==0xffdf)
outp(IOA1,num1[5]);
outp(IOB1,num2[5]);
result=5;
if(tmp==0xffbf)
outp(IOA1,num1[6]);
outp(IOB1,num2[6]);
result=6;
if(tmp==0xff7f)
outp(IOA1,num1[7]);
outp(IOB1,num2[7]);
result=7;
tmp=inp(IOC2);
if(tmp==0xfffe)
outp(IOA1,num1[8]);
outp(IOB1,num2[8]);
result=8;
if(tmp==0xfffd)
outp(IOA1,num1[9]);
outp(IOB1,num2[9]);
result=9;
//***************************************************************
charchange(intc)//单纯的更改密码的函数
outp(IOC1,cs[c]);
outp(IOA1,yes1[0]);
outp(IOB1,yes2[0]);
while(tmp!
=0xfff5)
result=xianshi();
//直接传出去改过之后的哪位数字,不管是更改密码还是输入密码,只管输出
}
//*****************************************************************
chargenggaimima()//更改密码
intc=0;
chari1;
i1=change(c);
returni1;
//要求更改密码,直接更改第一位,并输出更改之后的第一位密码是多少i=1,可以更改密码
//*********************************************************************
charhuanwei(charc)//换位
{
c++;
delay(50);
returnc;
//传出去换位之后的位
//***********************************************
//**********************************************
charshurumima()//第一位输入密码输入密码
chars1;
//输入的第一位密码
s1=change(c);
returns1;
//传出去第一位输入的密码
//////////////////////////////////////////////////////////////////////
voidquerengg(charshuru[])///显示输入之后的密码ffdf
inti,j,m;
7;
j++)
m=shuru[i];
outp(IOA1,num1[m]);
outp(IOB1,num2[m]);
}
intpanduan1(charshuru[],charmima[])//判断开锁I为1,可以更改密码I为0不允许更改密码
if(shuru[0]==mima[0]&
&
shuru[1]==mima[1]&
shuru[2]==mima[2]&
shuru[3]==mima[3])//判断输入的密码和更改的密码是否一样
yes();
i=1;
else
err();
i=0;
returni;
intpanduan2(charshuru[],charmima[],intt)//判断错误超过6次,警报t为错误密码次数
t=0;
else
t++;
returnt;
//////////////////////////////
voidmain(void)
inti1=0,i2=1,i3=2,i4=3;
ints1=0,s2=1,s3=2,s4=3;
intr=1;
//变量R非常重要,只有当R=1时,才可以修改密码,初始化密码,在判断密码中,会返回一个R,得知R=1or0.!
!
亮点