竞赛抢答器课程设计-微机接口课程设计报告sw

合肥学院

计算机科学与技术系

微机原理与接口技术

课程设计报告

20##~20##学年第2学期

课程:微机原理与接口技术

课程设计名称:竞赛抢答器

专业班级:计算机科学与技术专业(06网工2)

20##  年  2月

一、题义分析及解决方案

1.题义需求分析

题目要求利用8086系统接口电路设计一个可供八人竞赛使用的抢答器,并显示竞答者编号(1~8)。

根据题义可知:本设计是要设计一个能够提供给8个人使用的竞赛抢答装置,能够使得抢答者的编号,显示的装置。首先是主持人发出抢答允许信号,当抢答者收到信号后,便立刻进行抢答,然后通过装置,将最先抢答者的编号显示出来。

根据以上分析,提出以下几个问题:

①主持人如何发出抢答的信息?

②竞赛者如何进行抢答?

③如何将分辨抢答的顺序,谁是最先抢答的?

④如何显示抢答者的编号?

⑤抢答的总体规则是什么?怎样控制?

2.解决问题的思路及其方法

1)硬件部分

(1)主控装置,由主持人控制决定抢答有效与无效,共两个量,因而考虑到逻辑开关、微动开关和小键盘,主控完成的是保持有效与无效两种状态,而微动开关是输入一个脉冲,故不符合要求,小键盘虽然可以实现,但相对复杂,不便于实现。逻辑开关能很好地符合要求,优点是简单、易操作。本实验使用新实验箱,芯片8255的A、B、C口均被使用,故不能实现该主控功能,但设计思想中应包含此方面,以便设计完备。

(2)抢答装置,由竞赛选手抢答使用,每一个选手在抢答时均有两种选择情况,抢答或不抢答,同主控装置道理一样,“1”表示抢答动作发生,“0”表示不抢答,可见,逻辑开关可方便实现,微动开关同样满足要求。然而现实生活中,更合理的应采用微动开关按键式完成抢答动作,以符合现实要求。

(3)显示装置,可选择LCD或LED,由于这里的输出结果是选手编号,比较简单,用LED即可实现,用LCD也可以实现,但相对复杂,且LCD价格高,故选LED。实现时可采用一人一个发光二极管,但这样在抢答时不便于观察与先后比较,所以选用七段LED数码显示最后竟比较先后处理过的数字编号。

(4)规则设定,对于规则要用到可编程芯片,因为抢答结果的多种情况需要作不同的处理,要有硬件实现。由于是八位选手在同一个时间段均可抢答,输入抢答信号,所以应并行而不是串行。可编程芯片有8253、8251A以及8255等,8253主要用于定势和计时器用,它的6种工作方式多以触发方式,故不适用。8251A用于通信借口,并且是串行的,也不可用。而8255恰很好的满足需求,是并行接口芯片,所以选用8255。

(5)接口实现,8086CPU与8255之间的数据总线经数据总线收发器相连,地址线经地址锁存器相连,八个逻辑开关K0~K7分别连接到8255的输入口PA0~PA7,输出口PB0~PB7连接到七段LED显示器。在8255与LED连接时,要留心参数是否匹配,能否成功驱动LED显示,LED的标准编码及显示数字如下表所示:

表1-1 LED的标准编码

       通过上表,我们需要用到的编码是0、1、2、3、4、5、6、7、8、E, LED完全符合要求,每一位选手的编号,显示装置采用七段LED二极管显示八位选手的编号,即为抢答结果。

2)软件部分

对于设计中的抢答规则由软件来实现,考虑到8位选手的各自按下抢答装置与自己的编号间的对应关系,8个信号有可能在同一时间段内有两个或以上信号输入,各自之间在时间上不会牵制,即涉及并行的方式输入,后要对输入的开关量进行处理、输出,连接至LED显示,其中需有一主控装置,据此结合课程的所学的相关知识可知,使用可编程并行接口芯片8255能够满足要求,实现相关功能。实现时,可设置8255的A口作为八个输入信号,用逻辑电平开关K0—K7代表抢答装置的抢答开关1—8号。当某个微动开关置“0”时,显示有效,当有两个或以上选手同时按下抢答器时,信号无效,显示“E”。将B口输出信号与7段LED的a—dp连接,即可用LED显示器输出抢答结果。在实验中需设置C口位控制选用新实验箱的八个LED显示中的一个。

二、硬件设计

1) 8255芯片

(1) 8255引脚图

8255是可编程并行接口,内部有3个相互独立的8位数据端口,即A口B口和C口。三个端口都可以作为输入端口或输出端口。A口有三种工作方式:即方式0、方式1和方式2,而B口只能工作在方式0或方式1下,而C口通常作为联络信号使用。8255的工作只有当片选CS有效时才能进行。而控制逻辑端口实现对其他端口的控制。

(2) CPU接口

1.数据总线缓冲器

这是一个8位双向三态缓冲器,三态是由读/写控制逻辑控制的。这个缓冲器是8255A与CPU数据总线的接口。

2.读/写控制逻辑

它与CPU的6根控制线相连,控制8255A内部的各种操作。控制线RESET用来使8255A复位。和地址线A1及A0用于芯片选择和通道寻址。控制线用来决定8位内部和外部数据总线上信息传送的方向,即控制把CPU的控制命令或输出的数据送到相应的通道,或把状态信息或输入数据送到CPU。8255A的读/写控制逻辑的作用,是从CPU的地址和控制总线上接受输入的信号,转变成各种命令送到A组或B组控制电路进行相应的操作。

(3) 8255A的引脚信号

1.与外设相连的

PA7~PA0:A口数据信号线。

PB7~PB0:B口数据信号线。

PC7~PC0:C口数据信号线。

2.与CPU相连的

RESET:复位信号。当此信号来时,所有寄存器都被清除。同时三个数据端口被自动置为输入端口。

D7~D0:它们是8255A的数据线和系统总线相连。

CS:片选信号。在系统中,一般根据全部接口芯片来分配若于低位地址组成各种芯片选择码,当这几位地址组成某一个低电平,于8255A被选中。只有当有效时,读信号写才对8255进行读写。

RD:读信号。当此信号有效时,CPU可从8255A中读取数据。

WR:写信号。当此信号有效时,CPU可向8255A中写入数据。

A1、A0:端口选择信号。8255A内部有3个数据端口和1个控制端口,共4个端口。规定当A1、A0:为00时,选中A端口;为01时,选中B端口;为10时,选中C端口;为11时,选中控制口。

表2-1 8255A的技术参数

输入最低电压:min -0.5V,max 0.8 V,输入最高电压:2.0 V。输出最低电压:0.45 V,输出最高电压:2.4 V。

(3)8255A的方式控制字

图2-1 8255A的方式控制字

方式0的工作特点是通常不用联络信号,不使用中断,三个通道中的每一个都有可以由程序选定为输入或输出。其功能为:

①两个8位通道:通道A、B。两个四位通道:通道C高四位和低四位;

②任何一个通道可以作输入/输出;

③输出是锁存的;

④输入是不锁存的;

⑤在方式0时各个通道的输入/输出可有16种不同的组合。

2)显示器件LED

(1) LED在本设计中的作用

LED功能分析如下:

1.  物理构造:LED发光二级管,采用砷化镓、镓铝砷、和磷化镓等材料制成,其内部结构为一个PN结,具有单向导电性。

2.  工作原理:当在发光二极管PN结上加正向电压时,PN结势垒降低,载流子的扩散运动大于漂移运动,致使P区的空穴注入到N区,N区的电子注入到P区,这样相互注入的空穴与电子相遇后会产生复合,复合时产生的能量大部分以光的形式出现。

3.  数字成像:将七个发光管进行组合,排列成数字图形8,再根据需要控制七个管的亮与灭,即可显示出定义数字。

LED技术参数如下:

1.发光二极管的压降一般为1.5~2.0 V,其工作电流一般取10~20 mA为宜。

2.发光二极管的发光颜色有:红色光、黄色光、绿色光、红外光等。

3.发光二极管应用电路有四种,即直流驱动电路、交流驱动电路、脉冲驱动电路、变色发光驱动电路。

表2-2  LED显示管段选码编码表

图2-2  LED数码管及其框图

上面两图分别为外形图和原理图,当七段数码管点亮其中几段可显示数字和简单的字符,将七段数码管负极连接到一起称为公共端,而发光二极管的正极则分别由引脚引出,便于控制哪个发光二极管点亮。

由于将8个发光二极管负极全部连接在一起,称为共阴极数码管,还有将8个发光二极管的正极连接在一起,故称之为共阳极数码管。

本次实验用的数码管需动态扫描显示,其接口电路将所有数码管的笔画控制段与a~h同名端连在一起,接到一个并行端口,每个公共极COM端由独立的I/O线控制,CPU向字模输出口送出字形码时,所有数码管接收到相同的字形码,究竟哪个数码管显示,取决于每个LED的COM端,所谓动态扫描,就是显示一位信息时,其他位不能显示,必须采用分时方法,轮流控制COM端。

3) 微动开关

(1)微动开关及其编码

开关高电平:+5V、低电平:0V

表2-4微动开关及其编码


4) 硬件总逻辑图及其说明

图2-3 硬件电路图

说明:8086的数据线接8255A的数据线,8086的地址线形成地址通过译码器与8255A的片选信号相连。8086的分别接8255A的A0,A1。PA0—PA7接微动开关K0—K7。PB0—PB7接显示管的a—dp,PC0—PC7接LED显示装置,用于位选择。

3、控制程序说明

3.1控制程序设计思路说明

1)定义十六进制数字符的七段代码表。

2)初始化8255A的工作方式。

3)置LED灯全灭。

4)输出显示零表示等待抢答。

5)读A口状态,若有两个或两个以上的抢答信号,显示输出E。若只有一个抢答信号,则查询输出其编号。

6)继续观察LED是否输出显示零,若为0,进行下一次抢答。

3.2程序流程图

图3-1 程序流程图

3.3控制程序

.MODEL      TINY   

PCIBAR3           EQU      1CH      ;8位I/O空间基地址(它就是实验仪的基地址, 也为DMA & 32 BIT RAM板卡上的8237提供基地址)

Vendor_ID   EQU     10EBH  ;厂商ID号

Device_ID   EQU      8376      ;设备ID号

.STACK       100

.DATA         

IO_Bit8_BaseAddress     DW ?    

msg0             DB        'BIOS不支持访问PCI      $'

msg1             DB '找不到Star PCI9052板卡 $'

msg2             DB        '读8位I/O空间基地址时出错$'

COM_ADD         DW     00F3H   ;控制口偏移量

PA_ADD            DW 00F0H   ;PA口偏移量

PB_ADD            DW 00F1H   ;PB口偏移量

PC_ADD            DW 00F2H   ;PC口偏移量

.CODE        

START: MOV AX,@DATA   

       MOV DS,AX    

NOP

CALL InitPCI   

CALL ModifyAddress     ;根据PCI提供的基地址,将偏移地址转化为实地址

mov dx,COM_ADD          ;控制口地址  

mov ax,90h   ;10010000

out dx,ax 

      

step0:mov ax,00h  ;禁止显示LED全灭

mov dx,PB_ADD       ;B口地址输出

out dx,ax

step3:mov dx,PB_ADD

mov ax,3fh         ;输出显示0表示允许抢答

out dx,ax       

mov dx,PC_ADD            ;设置数码管位选码

mov al,7Fh            ;只使用最左边一位

out dx,al

step2:mov dx,PA_ADD     ;通过A口地址读输入信号

in ax,dx          ;读A口状态

not ax            ;取反,因为微动开关按下为低电平有效

cmp al,00h      ;检测是否有输入

jz step2          ;没有则继续检测

mov dl,al

mov bl,00h        ;bl用于记录有几人同时按键

mov cx,8h         ;循环次数

test1:ror dl,1   ;循环右移一位,末位进CF

jnc test2         ;若没有进位,即CF=0则跳转retest继续测试

inc bl               ;有进位,bl自加记录同时抢答人数

test2:     loop test1;循环测试8次

cmp bl,1

ja error         ;有一人以上同时抢答,则报错

mov bl,00h         ;bl清零

next:ror al,1     ;有抢答信号

jc print         ;有则输出

inc bl                  ;bl用来记录是哪一位选手

jmp next

error:mov bl,8

print:mov al,bl

lea  bx,ssegment  ;查表

xlat              ;将BX的内容(代码表首地址)+AL的内容(表格偏移量)作为有效地

;址,最终内容存入AL中

mov dx,PB_ADD

out dx,al

mov dx,PC_ADD     ;设置数码管位选码一位显示

mov al,7Fh        ;只使用最左边一位

out dx,al

step5:mov dx,PA_ADD

in ax,dx    

cmp al,0ffh       ;检测开关是否已松开

jnz step5         ;没有松开继续检测

jmp step6

step6:mov al,cl

mov dx,PB_ADD

out dx,al

mov dx,PC_ADD     ;设置数码管位选码一位显示

mov al,0FEh       ;只使用最右边一位

out dx,al

call DL500ms      ;调用延迟程序

jmp step0        

ssegment:

db 06h

db 5bh

db 4fh

db 66h

db 6dh

db 7dh

db 07h

db 7fh

db 79h

DL500ms  PROC NEAR

push ax

push dx

mov  dx,500

mov  ah,0ffh

int  21h

pop dx

pop ax

RET

DL500ms ENDP

InitPCI  PROC   NEAR  

              MOV     AH,00H      

              MOV     AL,03H

              INT 10H                   ;清屏

              MOV     AH,0B1H   

              MOV     AL,01H

              INT 1AH     

              CMP      AH,0    

              JZ   InitPCI2      

              LEA      DX,msg0     

InitPCI1:      MOV     AH,09H      

              INT 21H      

              JMP       Exit

InitPCI2:      MOV     AH,0B1H   

              MOV     AL,02H

              MOV     CX,Device_ID   

              MOV     DX,Vendor_ID

              MOV     SI,0

              INT 1AH     

              JNC       InitPCI3       ;是否存在Star PCI9052板卡

              LEA      DX,msg1     

              JMP       InitPCI1      

InitPCI3:      MOV     DI,PCIBAR3     

              MOV     AH,0B1H   

              MOV     AL,09H

              INT 1AH                 ;读取该卡PCI9052基地址

JNC       InitPCI4      

              LEA      DX,msg2     

              JMP       InitPCI1      

InitPCI4:      AND     CX,0FFFCH      

              MOV     IO_Bit8_BaseAddress,CX

              RET             

InitPCI         ENDP

ModifyAddress  PROC   NEAR  

              ADD     COM_ADD,CX

              ADD     PA_ADD,CX    

              ADD     PB_ADD,CX    

              ADD     PC_ADD,CX    

              RET             

ModifyAddress  ENDP

Exit:             MOV     AH,4CH     

              INT 21H

              END      START        
4、上机调试过程

4.1硬件调试

 按照硬件连接图接好线后,运行程序,发现LED显示的不是0,经检查发现二进制编码是11000000而并不是0的编码00000011。后在老师提示下,原因是PB口的连接的并不是a-dp,而是dp-a。后采用将数据线反过来接,结果正确显示0。

4.2软件调试

  刚开始调试程序时,总是出现错误,后经老师提示,原因是新实验箱没有8086CPU,它采用的运行方式是上位机的CPU模拟实现下位机的8086CPU实现功能,所以加入了老师给的地址转换程序,得以实现。继而相应的删去了一些重复不必要的初始化程序。

4.3联机调试

在联机调试时出现了两个问题:

(1)起初一直坚守“1”有效,运行错误,后仔细阅读了实验箱使用说明,认识

微动开关按下时的状态为“0”,松开为“1”,于是在程序中读信号的代码段中入NOT  AX,将读取的微动开关按位取反,以使得开关按下“0”时有效,弹开“1”时无效,结果成功实现。

(2)程序反复调试并运行了多次,几经测试,起初都正确,可是后来同样正确的程序运行LED显示却出现故障,下位机重置仍然不行,后经老师指导,将上位机重启,问题被解决。

4.4调试结果及问题的提出

(1)数码管显示数字的笔画不对,尽管数码管编码正确无误,经检查原因是控制编码段的定位变化未能有效设置好,随着程序的运行,值变化混乱,后经单步调试,仔细分析并改正优化,成功解决。

(2)在联机调试结果正确后,全速运行情况下,LED显示始终会全部显示,后在老师的提示下,程序中显示代码段的位置出加入mov ax,00h ,mov dx,PB_ADD 以禁止显示,LED全灭,同时应考虑到人眼视网膜的分辨率,设置显示延迟时间,以便于观察。

(3) 在老师的要求下,应该能够观察到选手的编号。而微动开关按下是瞬间的且选手不能一直按着开关不放,对于观察结果不方便,故老师要求在最右边的一位LED上显示出选手编号。设计时在测试微动开关是否松开后,再加一个B口输出在LED上显示。开始的很多次,在单步调试中可以观察到在最右边的LED上显示了选手编号,而在全速运行中却看不到。经老师检查后,发现在显示程序后立刻执行了LED全灭,在人眼的能力内是看不到的,在老师的建议下,加入一个延迟程序即可解决问题。

5、设计结果分析及问题讨论

5.1 课程设计结果

在允许抢答信号发出后,七段LED显示器上会显示首先按下开关的选手编号。由于响应速度非常快,若有两人或两人以上同时拨下开关是,七段LED显示器上始终会灵敏的显示第一个按下开关的抢答者,当起初有两个或以上选手抢答,则显示“E”表示出错,抢答无效。

5.2设计结果分析

由于芯片8255的三个端口A、B、C全部都被使用,起初的主控思想便无法实现,从 8255A的A口读入输入信号,即为选手编号。然后从B口输出抢答结果到七段LED显示器上,C口控制LED数码管的位控制,采用最左边的一位LED显示,并设置延迟在最右边的一位LED上显示最终的抢答者号码,便于观察和比较。

5.3问题讨论

在考虑如何确定有几人同时拨下开关的问题中,用BL记下在A口的输入信号,将BL循环右移八次,看八位选手中有哪几位发出了抢答动作,即所在的位有效,有几个一被移出,就有多少个人同时按下开关。将BL与1比较,如果大于1,说明有多人同时抢答,七段LED显示器上显示E,表示抢答无效。否则,满足一位选手动作,LED显示器即会显示选手编号。

5.4 收获、体会和建议

5.4.1关于可编程芯片8255A

    通过本次课程设计我熟练掌握了可编程并行接口芯片8255A的内部结构,数据总线缓冲器,三个八位端口,A口、B口和C口的控制电路,读写控制逻辑,工作方式,分别有:方式0--基本输入输出方式,方式1—选通输入输出方式,方式2—双向选通输入输出方式,初始化,包括方式选择控制字,C口按位置位控制字及其应用。 8255A有三个八位的输入输出端口,由于内部电路原因,通常将A口 (PA0-PA7)作为输入用,B口(PB0-PB7)作为输出用,C口作为辅助用,本实验,在设计程序时,选取8255A的工作方式0,通过A口输入,B口输出LED段控制,C口输出LED位控制。

5.4.2七段LED显示器

通过这次课程设计我掌握了作为终端显示的七段LED显示器物理构造,明白了其工作原理,数字成象的原理及相关技术参数。

5.4.3汇编语言

通过这次课程设计,重新复习了汇编语言程序设计中的数据和程序的寻址方式,各个指令的作用和含义。通过整个程序的编写及后续的优化工作,使我对汇编语言有了更深层次的掌握,同时也对用汇编语言进行程有了进一步的理解。

       在为期二周的课程设计中, 我们能把课堂上学习到的理论知识,经过思考、揣摩,运用于实践中,逐步实现设计中的各种功能,心中有一种很大的欣慰感,以理论指导实践,反过来,我们在课堂上学到的理论知识,很多情况都不是很明白其中的道理,也不清楚这点具体可以用在什么方面。在逐步实验过程中,通过每一个功能的实现,通过上机实践,对理论知识也有了更为透彻的理解和认知。深刻认识到上机实践操作的重要性,觉得一周的时间太短,对于设计的优化方面的工作还有许多可以充实,总觉得能再多点时间会做到更好,希望在以后的学习中,更多地给我们安排一些动手操作的实验课,以更深入地了解计算机方方面面的知识。

通过这次设计实践使自己进一步加深了对专业知识和理论知识学习的认识和理解,使自己对于现实生活中的实际问题有了更贴切的整体把握和领会,并很好的将之与所学的相关知识达到了很好的联系与对接,同时对于所学知识的应用能力、分析问题和解决问题的能力都得到了全面的提高。

相关推荐