汇编语言多功能密码锁Word格式.docx
《汇编语言多功能密码锁Word格式.docx》由会员分享,可在线阅读,更多相关《汇编语言多功能密码锁Word格式.docx(28页珍藏版)》请在冰豆网上搜索。
十、设计中的难点·
23
十一、收获及体会·
24
十二、参考文献·
25
多功能密码锁
一、目的
1、了解和掌握8086、8255及8253,等接口芯片以及LED显示器的原理和功能;
2、能用这些接口芯片构建一个简单的系统控制对象,
3、掌握接口电路的综合设计与使用;
4、通过自己动手,进一步了解计算机得工作原理,接口技术,提高计算机硬件,软件综合应用能力,即对微机原理,接口技术,汇编语言程序设计进行综合训练。
二、内容
密码锁在输入密码正确的条件下输出开锁电平,控制电控锁开启,同
显示00字样。
当输入密码错误时,发出错误警告声音,同时显示FF字样。
当六次误码输入的条件下,产生报警电平报警。
还可以实现对密码的修改,修改成功后,蜂鸣器发出确认音。
三、设计任务
1、选用8086和适当的存储器及接口芯片完成相应的功能。
2、用LED显示器显示电子锁的当前状态。
3、画出详细的硬件连接图。
4、给出程序设计思路、画出软件流程图。
5、给出地址分配表。
6、给出所有程序清单并加上必要注释。
7、完成设计说明书(列出参考文献,所用器件型号)。
四、方案选择及原理
这次的设计要求是在密码输入正确时输出开锁电平和显示“00”,密码错误时显示“FF”和蜂鸣器发出报警声音等,我们采用8255A的A口低四位和C口的低三位组成4x3的矩阵键盘,同时A口的低六位为选管;
B口作为显示器的输出;
C口高四位的PC4口输出开锁电平,对于6次密码错误输入,PC5口输出报警电平。
用8253计数器产生警告音和确认音。
用蜂鸣器发声次数来区分确认和警告声音,一声表示确认,三声表示警告。
采用Proteus自带的键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键,每次对键盘扫描,获得对应的键值。
五、所用器件
CPU8086、并行接口8255A、地址锁存器74LS273、4线-16线译码器74HCT154、石英晶振,可编程定时/计数器8253、共阴极数码管、各类逻辑门、蜂鸣器,电阻、键盘等。
主要器件简介
CPU8086
8086是Inter系列的16位微处理器,芯片上有2.9万个晶体管,采用HMOS工艺制造,用单一的+5V电源,时钟频率为5MHz~10MHz。
8086有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据。
可寻址的内存空间为1MB。
并行接口8255
Intel8086/8088系列的可编程外设接口电路(ProgrammablePeripheralInterface)简称PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。
它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。
8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。
可编程定时/计数器8253
8253可编程定时器/计数器是8086微机系统常用的定时/计数器芯片,它具有定时与计数两大功能。
8253可编程定时器/计数器具有3个独立的16位计数器通过编程可选择六种工作方式,可选择二进制或十进制计数,最高计数速率可达2.6MHz。
所有的输入、输出电平都与TTL兼容。
地址锁存器74LS273
地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。
8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。
4线-16线译码器74HCT154
74HCT154为4线-16线译码器,将4个二进制编码输入译成16个彼独立的输出之一,并能将数据从一个输入线分配到16个输出的任意一个而实现解调功能,与大部分TTL和DTL电路完全兼容。
其工作原理如下:
这种单片4线—16线译码器非常适合用于高性能存储器的译码器。
当两个选通输入G1和G2为低时,它可将4个二进制编码的输入译成16个互相独立的输出之一。
实现解调功能的办法是:
用4个输入线写出输出线的地址,使得在一个选通输入为低时数据通过另一个选通输入。
当任何一个选通输入是高时,所有输出都为高。
六、原理图
1、8086和8255A连接
8255A地址分配:
PA:
200HPB:
202HPC:
204H控制寄存器:
206H
为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。
2、8255A的A口、C口与矩阵键盘连接
键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键。
数字键1-9的键值为相应的数值,数字键0的键值为0BH,功能键*的键值为0AH,能键#的键值为0CH。
3、8255A的A口、B口与数码管的连接
8255A的B口输出数码管的段码,A口输出数码管的位码。
4、8086与8253连接
8253地址分配:
计数器0:
400H计数器1:
402H计数器2:
404H控制寄存器:
406H
5、完整电路图
七、软件设计思路
整个硬件设计,主要采用器件CPU8086、并行接口8255和可编程定时/计数器8253。
由并行接口8255控制键盘扫描、数码管显示、开锁电平以及报警电平,8255的工作方式是A口输出,B口输出,C口高四位输出,C口低四位输入。
通过键盘扫描获得对应的键值,通过对键值判断,判断按键是功能键或数字键,达到输入密码,修改密码,确认输入,返回等功能。
由可编程定时/计数器8253产生方波,控制蜂鸣器产生“滴”声。
8253工作在计数器0方式3,产生方波,通过延时,是蜂鸣器产生“滴”。
8253在每次调用发声子程序中初始化。
根据条件要求,程序首先需要实现的是输入密码。
为了区别输入密码和修改密码,当数码管显示都显示“—”,是输入密码。
当数码管全灭时,是修改密码。
当密码输入完且按下确认键,则输入数字与密码比对。
密码正确,则输出开锁电平(高电平有效)。
在此时,则可以通过功能键修改密码,密码修改成功发出“滴”声。
若不需要,按返回键返回。
若密码错误,则发出三声“滴”声,密码错误次数加1,并判断是否已经输入六次错误,是则输出报警电平(高电平有效),并置密码错误次数置0,等待返回键返回;
否则等待返回按键返回。
为了实现上述程序,首先要初始化8086、8255,接着进入键盘扫描。
每次有按键输入后,还应判断按键是否弹起,可以实现键盘消抖。
无论密码正确与否,均需要通过返回键才能返回,所以每次显示完后都要对键盘扫描,判断是否按下返回键,有则退出键盘扫描,没有则继续扫描。
开锁电平以及报警电平均在返回时置低电平。
八、流程图
主程序流程图
否
是
修改密码子程序流程图开锁子程序流程图
闭锁子程序流程图是
九、程序代码
IOY0EQU0200H;
8255片选端口始地址
MY8255_AEQUIOY0+00H*2;
8255的A口地址
MY8255_BEQUIOY0+01H*2;
8255的B口地址
MY8255_CEQUIOY0+02H*2;
8255的C口地址
MY8255_MODEEQUIOY0+03H*2;
8255的控制寄存器地址
IOY1EQU0400H;
8253片选端口始地址
MY8253_COUNT0EQUIOY1+00H*2;
8253计数器0端口地址
MY8253_COUNT1EQUIOY1+01H*2;
8253计数器1端口地址
MY8253_COUNT2EQUIOY1+02H*2;
8253计数器2端口地址
MY8253_MODEEQUIOY1+03H*2;
8253控制寄存器端口地址
DATASEGMENT
COUNT1DB00H
COUNT2DB00H;
错误密码次数
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,3FH,39H,5EH,79H,71H,00H,40H;
键值表,0~F对应的7段数码管的段位值
;
DTABLE[11]=3FH对应键值11,显示"
0"
DTABLE[16]=00H,数码管熄灭
DATABLE[17]=04H,显示数码管"
-"
STRINGDB01H,02H,03H,04H,05H,06H;
初始密码,密码内存空间
DATAENDS
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
START1:
MOVDX,MY8255_MODE;
初始化8255工作方式
MOVAL,81H;
方式0,A口、B口输出,C口高四位输出,C口低4位输入
OUTDX,AL
MOVDX,MY8255_C;
开锁电平、报警电平置0
MOVAL,00H
OUTDX,AL
MOVSI,0200H;
建立缓冲区,存放要显示的键值
MOVAL,11H;
先初始化键值为11H,显示“-”
MOV[SI],AL
MOV[SI+1],AL
MOV[SI+2],AL
MOV[SI+3],AL
MOV[SI+4],AL
MOV[SI+5],AL
MOVDI,0205H
BEGIN:
CALLKEYPAD;
键盘扫描
CMPAL,0CH;
确认键
JZRENZ
CMPAL,0AH;
修改密码键,此处不用,返回键盘扫描
JZBEGIN
CALLPUTBUF;
保存按键值
CALLKEYLS;
按键未弹起则继续循环等待弹起
JMPBEGIN
RENZ:
CALLKEYLS
CALLCRCMP;
密码比对
CMPCX,0FFH
JZSHOW1
JMPSHOW2
SHOW1:
CALLSHOWC;
密码错误
JMPSTART1
SHOW2:
CALLSHOWO;
密码正确
JMPSTART1
QUIT:
HLT
KEYPADPROCNEAR;
键盘扫描程序
BEGINk:
CALLDIS;
显示刷新
CALLCLEAR;
清屏
CALLCCSCAN;
扫描按键
JNZGETKEY1;
有键按下则跳置GETKEY1
GETKEY1:
CALLDIS;
显示刷新
再次扫描按键
JNZGETKEY2;
有键按下则跳置GETKEY2
JMPBEGINk;
否则跳回开始继续循环
GETKEY2:
MOVCH,0FEH
MOVCL,00H
COLUM:
MOVAL,CH;
选取一行
MOVDX,MY8255_A
读C口,用于判断是哪一列按键闭合
INAL,DX
L1:
TESTAL,01H;
是否为第1列
JNZL2;
不是则继续判断
MOVAL,01H;
设置第1行第1列的对应的键值
JMPKCODE
L2:
TESTAL,02H;
是否为第2列
JNZL3;
不是则继续判断
MOVAL,02H;
设置第1行第2列的对应的键值
L3:
TESTAL,04H;
是否为第3列
JNZNEXT;
MOVAL,03H;
设置第1行第3列的对应的键值
JMPKCODE
KCODE:
ADDAL,CL
JMPQUITk;
确定按键值
NEXT:
ADDCL,3
MOVAL,CH
TESTAL,08H;
检测是否扫描到第4行
JZKERR;
是则跳回到开始处
ROLAL,1;
没检测到第4行则准备检测下一列
MOVCH,AL
JMPCOLUM
KERR:
JMPBEGINk
QUITk:
RET
KEYPADENDP
CCSCANPROCNEAR;
扫描是否有按键闭合子程序
MOVAL,00H
MOVDX,MY8255_A;
将4行全选通,
MOVDX,MY8255_C
INAL,DX;
读C口
NOTAL
ANDAL,0FH;
取出C口值的反值
CCSCANENDP
KEYLSPROCNEAR;
按键是否弹起子程序
PUSHAX
KON:
扫描按键,判断按键是否弹起
JNZKON;
未弹起则继续循环等待弹起
POPAX
KEYLSENDP
CLEARPROCNEAR;
清除数码管显示子程序
MOVDX,MY8255_B;
段位置0即可清除数码管显示
CLEARENDP
DISPROCNEAR;
显示键值子程序
PUSHAX;
以缓冲区存放的键值为键值表偏移找到键值并显示
MOVSI,0200H
MOVDL,0DFH
MOVAL,DL
AGAIN:
PUSHDX
OUTDX,AL;
选通一个数码管
MOVAL,[SI];
取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
ANDAX,00FFH
ADDBX,AX
MOVAL,[BX];
将键值作为偏移和键值基地址相加得到相应的键值
MOVDX,MY8255_B
写入数码管A~Dp
CALLDALLY
INCSI;
取下一个键值
POPDX
判断是否显示完?
JZOUT1;
显示完,返回
RORAL,1
MOVDL,AL
JMPAGAIN;
未显示完,跳回继续
OUT1:
DISENDP
PUTBUFPROCNEAR;
保存键值子程序
MOVSI,DI
DECDI
CMPDI,01FFH
JNZGOBACK
MOVDI,0205H
GOBACK:
PUTBUFENDP
CRCMPPROCNEAR;
密码比对子程序
MOVSI,0205H
MOVDI,OFFSETSTRING
MOVCX,0;
密码正确,则输出CX=00H,为密码正确的标志
MOVAL,[SI]
MOVBL,[DI]
CMPAL,BL
JZNEXT1
JMPNEXT6
NEXT1:
MOVSI,0204H
MOVBL,[DI+1]
JZNEXT2
NEXT2:
MOVSI,0203H
MOVBL,[DI+2]
JZNEXT3
JMPNEXT6
NEXT3:
MOVSI,0202H
MOVBL,[DI+3]
JZNEXT4
NEXT4:
MOVSI,0201H
MOVBL,[DI+4]
JZNEXT5
NEXT5:
MOVSI,0200H
MOVBL,[DI+5]
JZQUITER
NEXT6:
MOVCX,0FFH;
密码错误,则CX=0FFH为密码错误的标志
QUITER:
RET
CRCMPENDP
SHOWOPROCNEAR;
开锁子程序
显示00
MOV[SI+1],AL
MOVAL,10H
MOV[SI+3],AL
输出开锁电平
MOVAL,010H
LOOP21:
CALLKEYPAD
返回键,退出开锁子程序
JZLOOP22
修改密码键
JZLOOP23
JMPLOOP21
LOOP22:
JMPQUITSHO
LOOP23:
修改密码,数码管全灭,用于与输入密码区别
MOVAL,10H
CALLCHANGECR;
调用修改密码子程序
QUITSHO:
开锁电平置0
SHOWOENDP
CHANGECRPROCNEAR;
修改密码子程序
CHG1:
CMPAL,0CH
JZCHG2
CALLPUTBUF
CALLPUTBUFCR
CALLKEYLS
JMPCHG1
CHG2:
CALLRING;
确认则发出“滴”的确认音
CALLDALLYS
CHANGECRENDP
PUTBUFCRPROCNEAR;
保存修改后的密码子程序
XORBX,BX
MOVBL,[COUNT1]
MOVSTRING[BX],AL;
放入密码内存空间STRING
INCBL
MOV[COUNT1],BL
CMPBL,06H
JNZGOBACKCR
MOVBL,0
MOV[COUNT1],BL
GOBACKCR:
PUTBUFCRENDP
SHOWCPROCNEAR;
闭锁子程序
显示FF
MOVAL,0FH
MOV[SI+5],AL
MOVAL,0CFH
MOVDX,MY8255_B
MOVAL,71H
发出三声“滴”声
CALLRING
CALLDALLYS
CALL