微机接口课程设计报告.docx
- 文档编号:8884139
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:15
- 大小:156.04KB
微机接口课程设计报告.docx
《微机接口课程设计报告.docx》由会员分享,可在线阅读,更多相关《微机接口课程设计报告.docx(15页珍藏版)》请在冰点文库上搜索。
微机接口课程设计报告
微机接口课程设计报告
题目:
简易密码锁的设计
专业:
电子信息工程专业
班级:
电信2013
学号:
2013508227
2013508254
2013508281
学生姓名:
张雪、高子懿、刘磊
指导教师:
农峰
2015年7月13日
目录
一、设计任务1
二、设计思路2
三、设计过程3
3.1系统方案论证3
3.2硬件电路设计5
3.2.18255A接口模块5
3.2.2行列式键盘模块6
3.3软件系统设计7
3.3.1程序主流程设计7
3.3.2行扫描法识别按键8
3.3.3按键转码及数据处理10
3.3.4循环队列存储数据11
3.3.5密码验证及信息显示11
四、系统调试与结果13
五、主要元器件与设备14
六、结论15
七、参考文献16
一、设计任务
基于PROTEUS实现简易密码锁的设计(3人)
要求:
1.密码由0-9数字组成,密码位数4位;
2.开机上电后系统复位,处于准备接收密码的状态;
3.每次输入密码后必须按下确认键,若输入密码位数超过4位,取后4位;
4.若与规定密码相同则在点亮一只发光二极管,显示正确,否则点亮另一只发光
二极管,显示错误。
(正确和错误显示的发光二极管为两个)
5.在实验系统TDN86/88上实现。
二、设计思路
密码由0-9数字组成,同时要有确认键,共11个键,可以用3X4行列式键盘实现,由于后来考虑到用一个字节表示按键对应编码,高低四位分别表示行和列,4X4行列式键盘更方便,而且键盘的布局也更为宽松,以后想再加几个键的话也方便,最终确定了用后者。
设计要求密码位数为4位,超过4位,取后4位,这个要求恰好体现了一种队列的思想。
可以在程序中开辟4个字节的数组空间,设计出循环队列的数据结构。
依据先进先出的原则,保证数组里保留的永远是按键的后4位。
用两个发光二极管分别表示密码正确和错误,为方便区分,可以用绿色表示正确,红色表示错误。
行列式键盘使用8255A通用并行接口芯片实现,可以用其一个端口的引脚连接行线(或列线)作为控制线,另一个端口的引脚作检测线。
本次课程设计使用了其A端口的PA0-PA3引脚连接键盘行线,作为控制线,B端口的PB0-PB3引脚连接键盘列线,作为检测线,同时利用C端口的PC0和PC1引脚分别控制显示密码正确和错误的发光二极管。
另外,测试程序时,发现很难确定按下的键是否被有效地识别,导致密码很难输入正确。
于是,又添加了一个黄色的发光二极管,作为按键被有效识别时的提示信号。
三、设计过程
3.1系统方案论证
按照本课程设计的设计思路,系统总体框架大致如下图1,使用8086CPU芯片,通过74HC373锁存器与8255A并行接口相连。
之后,将行列式键盘和LED灯连接到8255A的端口上。
由程序实现通过8255A并行接口扫描键盘,判断密码正误,并通过8255A控制LED灯的信息显示。
图1简易密码锁系统框图
在protues中画出的系统原理图如图2所示
图2系统原理图
3.2硬件电路设计
3.2.18255A接口模块
8086CPU芯片通过74HC373锁存器与8255A并行接口相连,其电路如图4所示,由图可以计算出接口地址为0000H,即A、B、C端口及控制端口的地址分别是0000H、0002H、0004H、0006H。
图48086芯片与8255A的连接
3.2.2行列式键盘模块
行列式键盘电路图如图5所示,后来去掉几个电阻,并略微美化一下原理图的视觉效果,电路图如图6所示
图5行列式键盘电路图
3.3软件系统设计
3.3.1程序主流程设计
程序主流程图如图所示,程序开始运行,首先初始化8255A,随后进入键盘扫描子程序,首先快速检测是否有按键。
如果有,则延时20ms后转入查找按键位置子程序,否则,继续检测。
当按键位置(即该按键所在行列值)确定后,转入查找按键对应编码。
若能找到对应编码,则为有效按键,延时亮一段时间黄灯作为提示信号,否则,返回快速按键检测流程。
对于有效的按键,延时结束后,判断其是否为Enter键,若是,则进入密码验证子程序,密码正确亮绿灯,错误亮红灯,否则,说明是输入的数据,将其存入到输入数据队列中。
按键处理完毕后,转回快速按键检测流程,等待下一次输入。
3.3.2行扫描法识别按键
程序使用行扫描法识别按键,其主要流程如图8所示(其中S8255A、S8255B分别代表8255A芯片的A、B端口)。
图8行扫描发识别按键流程图
该流程可大致分为三步。
第一步进行快速按键检测,代码如下:
NOKEY:
MOVAL,0
OUTS8255A,AL;往端口A输出0
INAL,S8255B;读入键盘列状态
ANDAL,0FH;只查低四位
CMPAL,0FH;列是否全为1
JZNOKEY;全为1,说明无按键
CALLDELAY1;延时20ms,防抖动
8255A芯片的端口A连接键盘行线,并作为控制线,将行线全部置低电平“0”,然后,读取列线状态。
如果没有按键被按下,则读取到的列状态(即AL的低四位)全为高电平“1”,而有按键被按下时,它对应的列线将会是低电平“0”,但此时还不能确定按键所在行。
第二步确定按键位置,即其行列号。
代码如下:
MOVCX,4;共四行
MOVAH,0FEH;第0行的行扫描值
FINDKEY:
MOVAL,AH
OUTS8255A,AL;输出行扫描值
INAL,S8255B;读入列值
ANDAL,0FH;只查低四位
CMPAL,0FH;判断有无低电平的列线
JNZKEY2NUM;有,则转向下一步处理,将键盘行列信息转化为相应的数字编码
ROLAH,1;无,准备下一行扫描
LOOPFINDKEY
JMPNOKEY;由于是按键抖动或其它原因,可能没有按键(即所有行都没有低电平列线)
这一步是通过逐行扫描的方法确定按键行列值的,在第一步检测到有按键被按下后,将延时20ms,然后进入这一步。
先使第0行接低电平,其余行为高电平,然后用同第一步一样的方法查看该行是否有按键被按下。
若无,则将AH循环左移,使得下一行接低电平,其余行仍为高电平,进行下一行扫描,如此循环,直至最后一行扫描结束。
如果扫描过程中发现某行有按键被按下,则在扫描中途退出,转向下一步处理。
而如果直至循环结束,仍没有检测到有按键被按下,则说明之前第一步检测到的可能是按键抖动或其它异常情况,此时,转回第一步继续快速检测按键。
第三步转向识别按键对应编码及对相关数据的处理子程序,将在3.3.3节讲到。
3.3.3按键转码及数据处理
所谓按键转码,即根据行扫描法检测到的按键行列值,在按键编码表里,查找按键被赋予的实际意义(如:
程序中第0行第3列的按键是密码输入后的确认键,对应的编码是数字10),然后转入对数据的处理,如果键盘表中没有相应的行列值,则返回按键扫描子程序。
代码如下:
KEY2NUM:
MOVCL,4
ROLAH,CL;将AH低四位放到高四位上
ORAL,AH;将行列信息全部放入AL中
MOVCX,11;查键盘表
MOVSI,0
FINDNUM:
CMPAL,keytable[SI]
JZDEALNUM
INCSI
LOOPFINDNUM
JMPNOKEY;没有在键盘表中找到相应行列状态,说明按键无效
数据处理子程序,先通过延时亮黄灯提示已经检测到有效按键的输入,然后判断按键类别,是确认键,则转入密码验证子程序。
否则为数字键,将数字存储至循环队列里。
DEALNUM:
CALLYES;有效按键,亮黄灯提示
MOVAX,SI;此时,SI即为键盘行列状态对应的数字,而Enter键用数字10表示
CMPAX,10;是否为ENTER键
JZPASSWORD;是,转入密码验证
CALLSTORE;否,转入存储数字
JMPNOKEY;继续读键盘
3.3.4循环队列存储数据
该子程序主要用到了两个变量,head和bool,它们的初始值都是0,head用于记录循环队列的队首下标,bool用来表示输入的密码个数是否足够6位。
其实在输入密码位数不足6位时,head的值并不是队列的队首值,但此时bool值为0,这样在密码验证阶段,由于输入密码位数不足6位,可直接进入密码错误提示。
而对于输入密码位数达到或超过6位的情况,此时head值确实是队首的下标值,从head对应地址数据开始验证密码逻辑上是完全正确的。
代码如下:
STORE:
;循环队列存储数据
MOVSI,head
MOVbuffer[SI],AL
INChead
CMPhead,4
JNZRETURN
MOVhead,0;head等于6时,在循环队列里下标转为0
MOVbool,1;输入的密码一定达到或超过6位,bool值置1
RETURN:
RET
3.3.5密码验证及信息显示
密码验证及相关信息显示内容很简单,对于输入的不足6位的密码,肯定是错误的,直接给出错误信息显示,密码位数足够,则通过循环逐个数字验证密码是否正确,发现错误,立即转入错误提示。
最终,正常结束循环说明密码是正确的。
要注意的是,每次验证密码结束后,不要忘记将head和bool清0,以等待下次密码输入。
代码如下:
PASSWORD:
CMPbool,1
JNZWRONG;输入密码位数不足6位,直接转入密码错误处理,亮红灯
MOVCX,4;输入密码位数足够,验证密码是否正确
MOVSI,OFFSETpasswd
MOVDI,head
COMPARE:
;依次比较密码每位数字是否正确
MOVAL,buffer[DI]
CMPAL,[SI]
JNZWRONG;发现某一位数字不同,立即转入密码错误处理,亮红灯
INCSI
INCDI
CMPDI,6
JNENEXT
MOVDI,0;循环队列,DI为6,下标转为0
NEXT:
LOOPCOMPARE
MOVhead,0
MOVbool,0;每次密码验证结束,都将队列循环清空,等待下次输入密码
MOVAL,1;绿灯连PC0,因此,密码正确对应于00000001b
OUTS8255C,AL;密码正确,绿灯亮
JMPNOKEY;返回按键检测子程序,等待下次输入密码
WRONG:
MOVhead,0
MOVbool,0 ;每次密码验证结束,都将队列循环清空,等待下次输入密码
MOVAL,2;红灯连PC1,对应于00000010b
OUTS8255C,AL;密码错误,红灯亮
JMPNOKEY;返回按键检测子程序
四、系统调试与结果
最初系统没有加进按键有效的提示信息灯,由于不能确保每次按键都是有效按键,结果很难输入正确密码,后来加入了D3,密码输入方便了许多。
图9 密码正确,绿灯亮
图10 密码错误,红灯亮
五、主要元器件与设备
本次课程设计使用PROTUES进行仿真,不需使用实际的器件和设备,仿真中用到的元器件列表如下:
8086CPU芯片一个
74HC373锁存器一个
8255A通用并行接口芯片一个
LED发光二极管3个,颜色分别为红、黄、绿
10K电阻开始为8个,现为4个
按键16个
电源2个
导线若干
六、结论
本次课程设计基于PROTEUS仿真,实现了简易密码锁的要求。
为实现本次课程设计,查阅资料,了解了简易键盘的工作原理,并学习了行列式键盘按键识别的两种常用方法,即行扫描法和行反转法,最终决定使用行扫描法完成键盘设计,本次课程设计的代码并不难写,开始的代码编写和正确编译只用了1个多小时的时间,可由于当时没有设计按键有效的提示,密码很难输入正确,为此耗费了一上午时间,一直检查不到代码的逻辑错误,最后才想到是按键的问题。
本次课程设计实现的任务比较简单,可以说没什么难点,非要说重难点的话那就是行列式键盘的实现和循环队列的应用。
键盘的电路设计和行扫描法的代码实现是参考图书馆里的书籍资料完成的;循环队列最初的代码设计队首和队尾两个变量都设计了,后来想想队尾变量没有必要,就去掉了,这样代码也得到了简化。
七、参考文献
[1]康华光.电子技术基础.北京:
高等教育出版社,1999年;
[2]彭华林等编.数字电子技术.长沙:
湖南大学出版社,2004年;
[3]金唯香等编.电子测试技术.长沙:
湖南大学出版社,2004年;
[4]侯建军.数字电路实验一体化教程.北京:
清华大学出版社,北京交通大学出版社,2005年;
[5]阎石.数字电子技术基础.北京:
高等教育出版社,2001年;
[6]赵春华、张学军.电子技术基础仿真实验.北京:
机械工业出版社出版社,2007年;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 微机 接口 课程设计 报告