《微机接口课程设计报告报告.doc》由会员分享,可在线阅读,更多相关《微机接口课程设计报告报告.doc(15页珍藏版)》请在课桌文档上搜索。
1、-微机接口课程设计报告题 目:简易密码锁的设计目录一、设计任务1二、设计思路2三、设计过程33.1 系统方案论证33.2 硬件电路设计53.2.1 8255A接口模块53.2.2 行列式键盘模块63.3 软件系统设计73.3.1程序主流程设计73.3.2行扫描法识别按键8 按键转码及数据处理103.3.4 循环队列存储数据113.3.5 密码验证及信息显示11四、系统调试与结果13五、主要元器件与设备14六、结论15七、参考文献16. z.-一、设计任务基于PROTEUS实现简易密码锁的设计3人要求:1.密码由0-9数字组成,密码位数4位;2.开机上电后系统复位,处于准备接收密码的状态;3.每
2、次输入密码后必须按下确认键,假设输入密码位数超过4位,取后4位;4.假设与规定密码一样则在点亮一只发光二极管,显示正确,否则点亮另一只发光二极管,显示错误。(正确和错误显示的发光二极管为两个)5.在实验系统 TDN86/88 上实现。二、设计思路密码由0-9数字组成,同时要有确认键,共11个键,可以用3*4行列式键盘实现,由于后来考虑到用一个字节表示按键对应编码,上下四位分别表示行和列,4*4行列式键盘更方便,而且键盘的布局也更为宽松,以后想再加几个键的话也方便,最终确定了用后者。设计要求密码位数为4位,超过4位,取后4位,这个要求恰好表达了一种队列的思想。可以在程序中开辟4个字节的数组空间,
3、设计出循环队列的数据构造。依据先进先出的原则,保证数组里保存的永远是按键的后4位。用两个发光二极管分别表示密码正确和错误,为方便区分,可以用绿色表示正确,红色表示错误。行列式键盘使用8255A通用并行接口芯片实现,可以用其一个端口的引脚连接行线或列线作为控制线,另一个端口的引脚作检测线。本次课程设计使用了其A端口的PA0-PA3引脚连接键盘行线,作为控制线,B端口的PB0-PB3引脚连接键盘列线,作为检测线,同时利用C端口的PC0和PC1引脚分别控制显示密码正确和错误的发光二极管。另外,测试程序时,发现很难确定按下的键是否被有效地识别,导致密码很难输入正确。于是,又添加了一个黄色的发光二极管,
4、作为按键被有效识别时的提示信号。三、设计过程3.1 系统方案论证按照本课程设计的设计思路,系统总体框架大致如下列图1,使用8086 CPU芯片,通过74HC373锁存器与8255A并行接口相连。之后,将行列式键盘和LED灯连接到8255A的端口上。由程序实现通过8255A并行接口扫描键盘,判断密码正误,并通过8255A控制LED灯的信息显示。图1 简易密码锁系统框图在protues中画出的系统原理图如图2所示图2 系统原理图3.2 硬件电路设计3.2.1 8255A接口模块8086CPU芯片通过74HC373锁存器与8255A并行接口相连,其电路如图4所示,由图可以计算出接口地址为0000H,
5、即A、B、C端口及控制端口的地址分别是0000H、0002H、0004H、0006H。图4 8086芯片与8255A的连接3.2.2 行列式键盘模块行列式键盘电路图如图5所示,后来去掉几个电阻,并略微美化一下原理图的视觉效果,电路图如图6所示图5 行列式键盘电路图 3.3 软件系统设计3.3.1程序主流程设计程序主流程图如下图,程序开场运行,首先初始化8255A,随后进入键盘扫描子程序,首先快速检测是否有按键。如果有,则延时20ms后转入查找按键位置子程序,否则,继续检测。当按键位置即该按键所在行列值确定后,转入查找按键对应编码。假设能找到对应编码,则为有效按键,延时亮一段时间黄灯作为提示信号
6、,否则,返回快速按键检测流程。对于有效的按键,延时完毕后,判断其是否为Enter键,假设是,则进入密码验证子程序,密码正确亮绿灯,错误亮红灯,否则,说明是输入的数据,将其存入到输入数据队列中。按键处理完毕后,转回快速按键检测流程,等待下一次输入。3.3.2行扫描法识别按键程序使用行扫描法识别按键,其主要流程如图8所示其中S8255A、S8255B分别代表8255A芯片的A、B端口。图8 行扫描发识别按键流程图该流程可大致分为三步。第一步进展快速按键检测,代码如下:NOKEY: MOV AL, 0 OUT S8255A, AL ;往端口A输出0 IN AL, S8255B ;读入键盘列状态 AN
7、D AL, 0FH ;只查低四位 CMP AL, 0FH ;列是否全为1 JZ NOKEY ;全为1,说明无按键 CALL DELAY1 ;延时20ms,防抖动8255A芯片的端口A连接键盘行线,并作为控制线,将行线全部置低电平“0,然后,读取列线状态。如果没有按键被按下,则读取到的列状态即AL的低四位全为高电平“1,而有按键被按下时,它对应的列线将会是低电平“0,但此时还不能确定按键所在行。第二步确定按键位置,即其行列号。代码如下: MOV C*, 4 ;共四行 MOV AH, 0FEH ;第0行的行扫描值 FINDKEY: MOV AL, AH OUT S8255A, AL ;输出行扫描值
8、 IN AL, S8255B ;读入列值 AND AL, 0FH ;只查低四位 CMP AL, 0FH ;判断有无低电平的列线 JNZ KEY2NUM ;有,则转向下一步处理,将键盘行列信息转化为相应的数字编码 ROL AH, 1 ;无,准备下一行扫描 LOOP FINDKEYJMP NOKEY ;由于是按键抖动或其它原因,可能没有按键即所有行都没有低电平列线这一步是通过逐行扫描的方法确定按键行列值的,在第一步检测到有按键被按下后,将延时20ms,然后进入这一步。先使第0行接低电平,其余行为高电平,然后用同第一步一样的方法查看该行是否有按键被按下。假设无,则将AH循环左移,使得下一行接低电平,
9、其余行仍为高电平,进展下一行扫描,如此循环,直至最后一行扫描完毕。如果扫描过程中发现*行有按键被按下,则在扫描中途退出,转向下一步处理。而如果直至循环完毕,仍没有检测到有按键被按下,则说明之前第一步检测到的可能是按键抖动或其它异常情况,此时,转回第一步继续快速检测按键。第三步转向识别按键对应编码及对相关数据的处理子程序,将在3.3.3节讲到。 按键转码及数据处理 所谓按键转码,即根据行扫描法检测到的按键行列值,在按键编码表里,查找按键被赋予的实际意义(如:程序中第0行第3列的按键是密码输入后确实认键,对应的编码是数字10),然后转入对数据的处理,如果键盘表中没有相应的行列值,则返回按键扫描子程
10、序。代码如下: KEY2NUM:MOV CL, 4 ROL AH, CL ;将AH低四位放到高四位上 OR AL, AH ;将行列信息全部放入AL中 MOV C*, 11 ;查键盘表 MOV SI, 0 FINDNUM: CMP AL, keytableSI JZ DEALNUM INC SI LOOP FINDNUM JMP NOKEY ;没有在键盘表中找到相应行列状态,说明按键无效数据处理子程序,先通过延时亮黄灯提示已经检测到有效按键的输入,然后判断按键类别,是确认键,则转入密码验证子程序。否则为数字键,将数字存储至循环队列里。 DEALNUM: CALL YES ;有效按键,亮黄灯提示
11、MOV A*, SI ;此时,SI即为键盘行列状态对应的数字,而Enter键用数字10表示 CMP A*, 10 ;是否为ENTER键 JZ PASSWORD ;是,转入密码验证 CALL STORE ;否,转入存储数字 JMP NOKEY ;继续读键盘3.3.4 循环队列存储数据 该子程序主要用到了两个变量,head和bool,它们的初始值都是0,head用于记录循环队列的队首下标,bool用来表示输入的密码个数是否足够6位。其实在输入密码位数缺乏6位时,head的值并不是队列的队首值,但此时bool值为0,这样在密码验证阶段,由于输入密码位数缺乏6位,可直接进入密码错误提示。而对于输入密码
12、位数到达或超过6位的情况,此时head值确实是队首的下标值,从head对应地址数据开场验证密码逻辑上是完全正确的。代码如下: STORE: ;循环队列存储数据 MOV SI, head MOV bufferSI, AL INC head CMP head, 4 JNZ RETURN MOV head, 0 ;head等于6时,在循环队列里下标转为0 MOV bool, 1 ;输入的密码一定到达或超过6位,bool值置1 RETURN: RET3.3.5 密码验证及信息显示密码验证及相关信息显示容很简单,对于输入的缺乏6位的密码,肯定是错误的,直接给出错误信息显示,密码位数足够,则通过循环逐个数
13、字验证密码是否正确,发现错误,立即转入错误提示。最终,正常完毕循环说明密码是正确的。要注意的是,每次验证密码完毕后,不要忘记将head和bool清0,以等待下次密码输入。代码如下: PASSWORD: CMP bool,1 JNZ WRONG ;输入密码位数缺乏6位,直接转入密码错误处理,亮红灯 MOV C*, 4 ;输入密码位数足够,验证密码是否正确 MOV SI, OFFSET passwd MOV DI, head PARE: ;依次比拟密码每位数字是否正确 MOV AL, bufferDI CMP AL, SI JNZ WRONG ;发现*一位数字不同,立即转入密码错误处理,亮红灯 I
14、NC SI INC DI CMP DI, 6 JNE NE*T MOV DI, 0 ;循环队列,DI为6,下标转为0 NE*T: LOOP PARE MOV head, 0MOV bool, 0 ;每次密码验证完毕,都将队列循环清空,等待下次输入密码 MOV AL, 1 ;绿灯连PC0,因此,密码正确对应于00000001b OUT S8255C, AL ;密码正确,绿灯亮 JMP NOKEY ;返回按键检测子程序,等待下次输入密码 WRONG: MOV head, 0MOV bool, 0 ;每次密码验证完毕,都将队列循环清空,等待下次输入密码 MOV AL, 2 ;红灯连PC1,对应于00
15、000010b OUT S8255C, AL ;密码错误,红灯亮 JMP NOKEY ;返回按键检测子程序四、系统调试与结果最初系统没有加进按键有效的提示信息灯,由于不能确保每次按键都是有效按键,结果很难输入正确密码,后来参加了,密码输入方便了许多。图9密码正确,绿灯亮图10密码错误,红灯亮五、主要元器件与设备本次课程设计使用PROTUES进展仿真,不需使用实际的器件和设备,仿真中用到的元器件列表如下:8086CPU芯片一个74HC373锁存器一个8255A通用并行接口芯片一个LED发光二极管3个,颜色分别为红、黄、绿10K电阻开场为8个,现为4个按键16个电源2个导线假设干六、结论本次课程设
16、计基于PROTEUS仿真,实现了简易密码锁的要求。为实现本次课程设计,查阅资料,了解了简易键盘的工作原理,并学习了行列式键盘按键识别的两种常用方法,即行扫描法和行反转法,最终决定使用行扫描法完成键盘设计,本次课程设计的代码并不难写,开场的代码编写和正确编译只用了1个多小时的时间,可由于当时没有设计按键有效的提示,密码很难输入正确,为此消耗了一上午时间,一直检查不到代码的逻辑错误,最后才想到是按键的问题。本次课程设计实现的任务比拟简单,可以说没什么难点,非要说重难点的话那就是行列式键盘的实现和循环队列的应用。键盘的电路设计和行扫描法的代码实现是参考图书馆里的书籍资料完成的;循环队列最初的代码设计队首和队尾两个变量都设计了,后来想想队尾变量没有必要,就去掉了,这样代码也得到了简化。七、参考文献1 康华光. 电子技术根底. :高等教育,1999年;2 华林等编. 数字电子技术. :大学,2004年;3 金唯香等编. 电子测试技术. :大学,2004年;4 侯建军. 数字电路实验一体化教程. :清华大学,交通大学,2005年;5 阎石. 数字电子技术根底. :高等教育,2001年;6 春华、学军.电子技术根底仿真实验. :机械工业,2007年;. z.