资源描述
计算机学院2006级硬件课程设计硬件课程设计报告竞赛抢答器设计与制作学院:计算机科学与技术学院班级:信息安全06-2班成员:XXX(总体思想的确立和方案流程的设计) XXX(键盘扫描程序的编程和实现)XXX(定时和延时程序的实现)2008年7月目录1、需求分析2、总体方案与说明2-1抢答器的基本组成及原理2-2指标要求2-3实现的原理与电路3、电路原理图与说明 3-1-1 8255A的原理及键盘接线图3-1-2 8255A的三种工作方式3-2-1 8253的原理图及接线图3-2-2 8253A的工作方式4、软件主要模块流程图4-1-1 主流程图4-1-2 8255A流程图4-1-3函数WAIT14-1-4函数WAIT25、源程序清单与注释6、问题分析与解决方案7、结论与体会8、参考资料课程设计指导教师评阅书指导教师评语:成 绩: 指导教师签字: 年 月 日抢答器的设计与制作1. 需求分析可显示性抢答器可使用于各种抢答竞赛中,作为判断抢答先后的重要工具。抢答器是为智力竞赛参赛者答题时进行抢答而设计的一种优先判决器电路,竞赛者可以分为若干组,抢答时各组对主持人提出的问题要在最短的时间内做出判断,并按下抢答按键回答问题。当第一个人按下按键后,则在显示器上显示该组的号码。回答完问题后,由主持人将所有按键恢复,重新开始下一轮抢答。因此要完成抢答器的逻辑功能,该电路至少应包括按键输入、数字显示、计数。2总体方案与说明2-1抢答器的基本组成及原理1、基本组成:可编程外围接口芯片8255,定时器8253,七段数码管,小键盘2、工作原理:选用8个键盘按键作为按钮,每个按键对应一个数字,在有效时间内按下按键则显示该选手的号码。键盘采用行列式,2行4列共8个键,由8255C口低四位读列,B口PB0、PB1送行,行线同时接到PC4、PC5上,这样读C口状态就可以同时读取键盘的行列信号。A口做输出,输出信号由七段数码管显示,B口,C口均输入。为了体现抢答功能,键盘采用动态扫描的方法。利用8259中断,先将扫描的状态读入8259并用锁存器74LS244将其锁存,根据锁存的状态判断最先按下的是哪个键。将由8255的C口最高位接一个开关作为控制开关S,执行时先对8255的PC7进行检查,如果为1则启动8253开始计时,否则继续检查等待。数码管可以动态显示所有按下的键的号码。选用8253定时20秒,并将倒计时的时间由屏幕显示出来。并将8253的输出接到8255的PC6口,以便检测定时是否结束。计时开始的同时对键盘进行扫描,20秒内有键按下则抢答成功,无键按下则抢答无效。2-2指标要求1基本功能:(1) 抢答器同时供8名选手或8个代表队比赛,分别用8个按钮S0 至S7表示。(2) 设置一个系统清除和抢答控制开关S,该开关由主持人控制。(3) 抢答器具有显示功能。即选手按动按钮,并在DPY_7-SEG七段数码管上显示选手号码。(4) 参赛选手在设定的时间内进行抢答,抢答有效,显示器上显示选手的编号。如果定时时间已到,无人抢答,本次抢答无效并进行报警。2扩展功能:(1) 抢答器具有定时抢答功能,且一次抢答的时间由主持人设定(如20秒)。当主持人启动开始键后,定时器进行减计时,并且倒计时可以由屏幕显示出来。(2) 数码管动态显示。数码管可以动态的显示所有按下的键的序号。2-3实现的原理与电路1数字抢答器总体方框图如图1所示为总体方框图。其工作原理为:接通电源后,主持人将开关拨到清零状态,抢答器处于禁止状态,编号显示器灭灯,定时器显示设定时间;主持人将开关置;开始状态,宣布开始抢答器工作。定时器倒计时。选手在定时时间内抢答时,抢答器完成:优先判断、编号显示。当一轮抢答之后,定时器停止、禁止二次抢答。如果再次抢答必须由主持人再次操作清除和开始状态开关.图1 总体框图2键盘扫描的原理我们所设计的键盘是一个8位键的,分别为16进制数字0-7,其中,键盘的排列,连线及接口电路如下图所示,8个键排成2行4列的矩阵,接到微机的一对端口上。端口由8255A构成,其中端口B作输入,端口C口作为输入。矩阵4条列线到输入端口C口的PC3PC0,用程序能改变这4条线上的电平。2条行线连到B口的PB0PB1.行线同时接在C口的PC4,PC5端,这样,用输入指令读取C口状态时,可同时读取键盘的行列信息。在无键压下时,由于接到+5V上的上拉电阻的作用,列线和行线接通。这时,如果向下键所在的行线上输出一个低电平信号,则对应的列线也呈现低电平。当从B口读取列线信号时,便能检测到该列线的低电平。读取B口的状态时,还能确定哪个键被按下了。 识别键盘上哪个键被压下的过程称为键盘扫描,上述键盘的扫描包含以下几步:1 测是否所有键都松开了,若没有则反复检测。2 当所有键都松开了,再检测是否有键压下,若无键压下则反复检测。3 若有键压下,要消除键抖动,确认有键压下。4 对压下的键进行编码,将该键行列的信号转换16进制码,由此确定哪一个键被压下了。如出现多键重按的情况,只有在其他键均释放后,仅剩下一个键闭合时,才把此键当作本次压下的键。5 该键释放后,再回到2。6 检测矩阵中是否有键压下的一种简单方法,自输出口向所有列线输出0电平,检测B口的低两位读取行值,若其中有0值,便是有键压下了。 在开始一次扫描时,先应确认上一次压下的键是否已松开。既先向所有行线输出低电平,再读入各列线值,只有当所有的行线和列线均为高电平,表示以前压下的键都已释放,才开始检测是否有键压下。 当检测到有键压下后,必须消除键抖动(DEBANCE)。即当检测到有键按下后,延长一定时间(通常延迟20MS),再检查该键是否仍被压者。若是,才认定该键确实被按下后,而不是其他的振动干扰。确认有键按下后,再确定被压下键所在的行号。为获取行列信息,先从B口输出一个低电平到一列线上,再从C口读入各行的值,若没有一列为低电平,说明压下的键不在此行。于是,再向下一行输出一个低电平,再检测各列线上是否有低电平,依次对每一行重复这个过程,直至查到某一列线上出现低电平为止。被置成低电平的行和读到该低电平的列,便是被压下键所在的行列值。3、电路原理图与说明3-1-1 8255A的原理及键盘接线图8255是一种通用可变成并行输入输出接口芯片,通过对它进行编程,芯片可工作于不同的工作方式,用8255作接口时,通常不需要附加外部逻辑电路就可直接为CPU与外设之间提供数据通道,8255内部包含3个8位输入输出端口A,B,C,通过外部24跟输入输出线与外设交换数据或进行通信联络。端口A和端口B都可以用作一个8位的输入口或8位的输出口,出口既可作8位输入输出口又可分为两个4位输入输出口,还常常用来配合A口和B口工作,用来产生A口和B口的端口状态信号,8255A有两类控制字,一类控制字用来定义各端口的工作方式,称为方式选择控制字,另一类控制字用于对C端口的任一位置进行置位或者复位操作,称为置位复位控制字对8255A进行编程时这两种控制字都要写入控制字寄存器中,但方式选择控制字的D7位总是1,而置位复位控制字的D7位总是0。+5V10K PB0PB1 D0D7 745610K01238255APC5PC4PC3PC2PC1PC08255A图2 键盘接口电路3-1-2 8255A的三种工作方式及控制字格式方式0 基本输入输出方式方式1 选通输入输出方式方式2 双向总线I/O方式通过用输出指令对8255A的控制字寄存器编程,写入设定工作方式的控制字,可以让3个数据口以不同的方式工作,端口A可工作于3种方式的任一种,端口B只能工作于方式0和方式1,端口C除了用于输入输出端口外,还能配合A口和B口工作,为这两个端口的输入输出操作提供联系信号。3-2-1 8253的原理图及接线图8253有6种工作方式,对它们的操作遵守以下3条基本原则: (1)当控制字写入8253时,所有的控制逻辑电路自动复位,这时输出端OUT进入初始态。(2)当初始值写入计数器以后,要经过一个时钟周期,减法计数器才开始工作,时钟脉冲的下降沿使计数器进行减1计数。计数器的最大初始值是0,用二进制计数时0相当于216,用BCD码时,0相当于104。 (3)对于一般情况下,在时钟脉冲CLK的上升沿时,采样门控信号。对门控信号(GATE)的触发方式是有具体规定的: 门控信号为电平触发的有:方式0,方式4。 门控信号为上升沿触发的有:方式1,方式5。 门控信号可为电平触发也可为上升沿触发的有:方式2,方式3。 计数方式的有:方式0,方式1,方式4,方式5 定时方式的有:方式2,方式3。3-2-2 8253A的工作方式对8253A的工作方式只介绍本实验中用到的两种:(1)方式0(计数结束产生中断的计数器)写入方式控制字后,输出端OUT为低电平;写入计数常数后,开始计数。计数器减为0之前,输出端OUT维持低电平。当计数值为0时,输出端OUT才变为高电平,向CPU发出中断请求,直到CPU写入新的控制字或者写入新的计数值为止。方式0可由门控信号控制暂停,GATE为低电平时,计数器暂停,GATE信号变高后,就接着计数。(2)方式3 (方波发生器)写入方式3的控制字后,OUT变高,设GATE为高先到,计数器对CLK计数,设计数初值为N。当写入的计数初值为偶数,则计数时,每输入一个计数脉冲,均使计数值减2。计数值减为0时,OUT由高变低,同时自动装入计数初值,继续进行计数。当计数值尖为0时,OUT又回到高电平,同时再次装入计数值,开始下一轮循环计数。如果写入的计数值为奇数,则当输出端为高电平时,第一个输出脉冲使计数器减1,以后来的每一个时钟脉冲,都使计数器减2,计数值为0时,OUT由高电平变为低电平,同时自动重新装入计数初值进行计数。这时第一个时钟脉冲使计数器减3,以后每个计数脉冲都使计数器减2,计数值为0时,OUT端又回到高电平,并重新装入计数初值,开始下一轮循环计数。 3-2-3 8253控制字格式4、软件主要模块流程图4-1-1 主流程图开始检测PC0是否为1是“开始”口令落下进入抢答定时20秒判断是否有键按下否犯规灯亮超过20s是延时,判断键号确定第一个按下的键号同时按下出错,输出0送入数码管显示口令未完有键按下抢答结束开 始4-1-2 8255A流程图初始化8255AC口低四位读列,PB0,PB1送行,A口输出读键盘若有被按下,继续检测WAIT_1检测是否所有键都松开若均松开若没有则继续等待若松开则继续检测WAIT_2检测是否有键按下有按下延时20ms,消抖动仍按着仍被压着,确定哪一个键被压下,查表确定按键编码转换成数码管显示编码显示该按键结 束4-1-3函数WAIT1: 说明: 检测是否有键仍被按下,若仍有键按下,继续等待该键被松开,若未检测到有键按下,继续进行检测是否有键被按下转到WAIT2. 进 入向PC0,PC1输出0检测C口低四位即四列的值WAIT2检测是否全为1若不全为1,即有键仍被按下若是,即说明无键按下4-1-4函数WAIT2: 说明: 检测是否有键按下,若有,则去抖动,排除外界干扰的可能,进一步确认是否有键按下,否则,继续等待.WAIT1确认各键均松开 进 入检测C口低4为的状态与0FH比较?不等延迟20MS,去抖动查是否有键按下相等说明有键被按下5、源程序清单与注释源程序:DATA SEGMENTTABLE1 DB 03h,9FH,25H,0DH,99H,49H,41H,1FHTABLE2 DB 40H,79H,24H,30H,19H,12H,02H,78HDATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA;主程序START: MOV AX,DATA MOV DS,AX MOV DX,30BH;8255初始化 MOV AL,10001001B;B口要输出,C输入 OUT DX,AL OPEN: MOV DX,30AH;C口 IN AL,DX TEST AL,80H;检查C口最高位是否为1 JZ OPEN;不为1重新检查 CALL TIME ;为1,调用定时 CALL SAOMIAO;键盘扫描 CALL XIANSHI;显示程序;定时20秒TIME PROC NEAR MOV AL,00110111B;通道0控制字,先读低字节后高字节,方式3,BCD计数 MOV DX,303H OUT DX,AL MOV AL,00H;计数初值低字节 MOV DX,300H OUT DX,AL MOV AL,50H;计数初值高字节 OUT DX,AL MOV DX,303H MOV AL,01110001B;通道1制字,先读低字节后高字节,方式0,BCD计数 OUT DX,AL MOV DX,301H MOV AL,00H;计数初值低字节 OUT DX,AL MOV AL,80H;计数初值高字节 OUT DX,AL RETTIME ENDP;键盘扫描SAOMIAO PROC NEAR MOV DX,309H;B口 MOV AL,00H OUT DX,AL;向B口即行送0 CALL IEND ;判断定时是否结束;检测是否所有键都松开WAIT1: MOV DX,30AH;C口 IN AL,DX ;读入C口状态 CALL IEND AND AL,0FH;只查低四位 CMP AL,0FH;是否都为1 JNE WAIT1 ;否,继续查;检测是否有键按下WAIT2: IN AL,DX;读B口 CALL IEND AND AL,0FH;只查低四位 CMP AL,0FH;是否有键按下 JE WAIT2 ;无,等待 ;有键按下,延时消除抖动 MOV CX,16EAHDELAY: LOOP DELAY CALL IEND;再查列,看键是否还被压下 IN AL,DX AND AL,0FH CMP AL,0FH JE WAIT2 CALL IENDMOV AL,0FEH MOV CL,AL ;CL11111110BNEXT: MOV DX,309H ;B口 OUT DX,AL ;向行输入低电平 MOV DX,30AH ;C口 IN AL,DX ;读入C口状态 CALL IEND AND AL,0FH ;取列值 CMP AL,0FH ;是否均为1 JNE ENCODE ;否,表示有键按下,转去编码 ROL CL,01 ;均为1,使下一行输出0 MOV AL,CL JMP NEXT ;查看下一行 CALL IENDENCODE:MOV BX,0007H ;建立地址指针,先指向7键对应的地址 CALL IEND MOV DX,309H IN AL,DX ;从B口读入行列值NEXT2: CMP AL,TABLE1BX;读入的行列值与表中查得的相等吗? JE DONE ;相等,转出 CALL IEND DEC BX ;不等,指向下一个地址 JNS NEXT2 ;若地址尚末减为负值,继续查 CALL IEND MOV AH,01 ;若减为负值,置出错码01给AH中 JMP EXIT ;退出 CALL IENDDONE: MOV AL,BL ;BL中存有键的16进制代码 MOV AH,00 ;AH0,读到有效键值EXIT:HLTRETSAOMIAO ENDP;检查定时是否结束结束IEND PROC NEARMOV DX,30AHIN,AL,DX ;读入C品状态 TEXT AL,40H ;检测PC6是否为1JNZ S ;为1,定时结束,从新开始S:JMP OPEN RETIEND ENDP;显示键号XIANSHI PROC NEAR MOV BX,OFFSET TABLE2;表格首地址给BX XLAT TABLE2 ;查表 MOV DX,308H OUT DX,AL ;A口输出RETXIANSHI ENDPCODE ENDS END6、问题分析与解决方案 1、直接的键盘扫描不能很好的体现抢答的效果,因为逐行逐列的扫描会有先后的时间问题,这样先扫描的一行会比较有优势。利用8259中断和锁存器进行键盘的动态的扫描和数码管的动态显示能很好的解决这个问题,但这个步骤较为的麻烦和困难,所以该步骤没有实现。 2、通过软件程序不断的检测定时是否结束虽然容易实现但是参赛者不容易知道,为了更好的表现定时并且很好的显示出来,可以从定时开始就将时间倒计时的显示出来。 7、结论与体会 1、通过本次的设计,使我们对整个设计的原理有比较深刻的理解,在设计的过程中,我们遇到了很多的困难,特别在刚开始时,由于是第一次,我们对有关设计方面的知识非常的缺乏,对如何设计仍是一个问号,但也正是由于这样要求我们需要很强的自学的能力,通过图书馆查阅相关的知识和利用网络搜索有关的资料,同时在老师的指导下,让我们从未知渐渐变的清晰,而且有了一定的设计的思路。经过我们多次的尝试与改变,终于获得了满意的结果。我们也因此深刻体会到自己动手获得劳动成果的喜悦。2、在设计过程中,我觉的团队的合作精神是非常重要的,在设计过程中,我们肯定要遇到许多我们以前未曾遇到过的一些难题,没有我们的共同的努力是很难很好地完成的,在这次的硬件课程设计中的确让我们知道有许多知识需要我们自己去获取,去领悟,去消化的,而不是等着老师来喂的,在设计中,更让学习了如何与别人进行合作,而这正是我们以前所欠缺的,无论是自学能力还是团队的合作精神,相信对我们以后无论是学习还是工作都将有着非常重要的意义的。8、参考资料 1 微型计算机原理与接口技术 中国科学技术大学出版社 吴秀清 编著2 微型计算机技术及应用 清华大学出版社 戴梅萼 编著 3 80X86汇编语言程序设计教程 清华大学出版社 杨季文 编著4 汇编语言程序设计案例精编 中国水利水电出版社 李珍香 编著21
展开阅读全文