1、课程设计实验报告竞赛抢答器计科 0201 班第五小组 张国成 7 号- 1 -竞赛抢答器一、需求分析本实验要求大家了解微机化竞赛抢答器的基本原理,进一步学习使用并行接口 8255 芯片,以及 8253 定时计数器的六种工作方式,中断的基本概念,中断服务子程序的编写。二、功能描述基本功能:在主持人按下抢答开关后,各位选手即可开始抢答,并在数码管上显示最先抢答选手的号码。扩展功能:在主持人按下抢答开关后,计数器开始 9 秒倒计时,若倒计时结束后没有人抢答,则本轮抢答无效,进入下一轮。三、概要设计 由于本次实验要用到数码显示、中断控制、倒计时等功能,故初步分析需要 8255、8259、8253 等芯
2、片。下图为竞赛抢答器(模拟)的原理图,逻辑开关 K0K7 代表竞赛抢答器按钮 07 号,当某个逻辑电平开关置“1”时,相当某组抢答按钮按下,在七段数码管上将其组号(07)显示出来。- 2 -四、方案论证在计数器每次计数结束后,对于全局变量 counter 的减一操作有两种方式,一个是通过不断扫描计数器是否计数结束,另一种是通过 8253 芯片计数结束产生中断。 方案一:通过对 8253 计数器的控制端口写控制字进行锁存,然后用一个读命令读出计数器中的数放寄存器 ax 中,通过比较ax 中的数是否为零来判断这次计数是否结束。若为零,就使 counter 减一。方案二:将 8253 的输出接到 8
3、259 的中断输入端,通过 8253 计数结束产生中断来控制,在中断服务子程序中对 counter 减一操作。方案比较:方案一采用扫描,没有用到 8259,程序编制简单,但是cpu 耗费了更多的时间在扫描,效率相对来说较低。方案二采用中断,程序结构化更为清晰,且 cpu 少了循环扫描的时间,效率较高。但是多用了一个 8259 中断控制芯片,程序编制上涉及到中断服务子程序的编写,稍显复杂。可见两种方案各有优劣。方案选择:经过小组讨论,先采用方案二,完成基本和扩展功能。若有时间,再采用方案一完成实验。五、模块划分由于本次课程设计采用团队合作的形式,故要将本次实验进行模块划分,小组成员要了解全部程序
4、流程,但是主要是完成自己负责的功能模块。组长负责协调监督指导小组成员,并完成最后的程序的连调工作。具体划分如下:尚海涛、王祁远:负责 8253 计数张国成、吴小龙:负责 8259 中断杨德娜、唐益文:负责 8255 并行接口每天的文档工作由各自详细记录自己今天的工作进度以及程序调试的过程和心得体会,并附上自己开发模块的文档说明,最后交由组长整合在一起,构成当天的开发文档。六、详细设计 1)8255 芯片简介8255,是一个典型的可编程并行接口芯片。8255 具有三个相互应独立的 8 位并行输入输出端口,即端口 A,端口 B 和端口 C,其中端口 C 分为两个 4 位来配合端口 A 和端口 B
5、工作,它为INTEL 系列 CPU 与外设之间提供 TTL 电平兼容的接口。- 3 -8255A 可以工作在方式 0,方式 1,方式 2 三种方式,其中端口A 可以工作在这 3 种不同的方式下,而端口 B 只能工作在方式 0 和方式 1,端口 C 配合 A 口和 B 口工作。8255A 没有设置专门的联络信号线,但是可以使用端口中的某些端口中的某些位来的担任。端口 A、B 和 C 可以配合使用,来构成所需的单线,双线或三线联络信号的并行接口。8255 的内部结构与 CPU 接口部分8255 与 CPU 的接口部分通过数据总线缓冲器和读/ 写控制逻辑。 数据总线缓冲器;这是一个 8 位双向三态缓
6、冲器,8255A 通过它与 CPU 的系统数据总线连接。CPU 所有的输入 /输出数据,CPU 通过输出指令发给8255A 的控制字和用输入指令读入的外设的当前状态信息,都是通过这个数据缓冲器传送的。读/写控制逻辑电路读/写控制逻辑电路通过 6 根控制线与 CPU 连接,它负责对8255A 的数据传送过程进行控制。它接收到来自 CPU 控制总线的RESET、WR、RD和来自地址总线的 A1,A 0 后,将这些信号进行组合,得到对 A 组控制部件和 B 组控制部件的相应控制命令,再用这些控制命令去控制这两个部件按初始化编程的要求,去完成对数据的输入/输出,对状态信息的读取和控制命令的传送。、与外
7、设接口部分8255A 与外设的接口是通过 3 个输入/输出数据端口来实现的。每个端口都是 8 位的数据端口,即端口 A、端口 B 和端口 C,它们都可以用软件编程来来设置成输入口或输出口,这 3 个端口在功能上有各自的特点。 端口 A端口 A 有一个 8 位的数据输入锁存器和一个 8 位的数据输入/输出锁存器/缓冲器,因此,端口 A 在进行输入或输出时,其数据都受到锁存。端口 B端口 B 有一个 8 位的数据输入缓冲器和 1 个 8 位的数据输出锁存器/缓冲器。因此,端口 B 只有在进行输出时,才能对数据进行锁存。端口 C端口 C 有一个 8 位数据输入缓冲器和一个 8 位的数据输出锁存器/缓
8、冲器。端口 C 也只能在作输出口时,才能对数据进行锁存。- 4 -、内部控制逻辑8255A 的内部控制逻辑由 A 组控制电路和 B 组控制电路组成。这两组控制电路根据 CPU 写如的控制命令字和读/写命令分别去控制两组端口的工作方式和读/写操作。其中 A 组控制电路控制端口 A 和端口 C 的高 4 位,B 组控制电路控制端口 B 和端口 C 低 4 位。2)8253 芯片8253 的工作方式:.方式 0这种方式又称计数结束中断方式。当 CPU 写入控制字后,使其 OUT端变低,在 GATE 信号保持高电平时,则写入计数初值后,下一个CLK 脉冲下降沿开始计数。在计数过程中 OUT 端一直保持
9、低电平,直到计数值减到 0 时(即计数结束)OUT 端输出变为高,完成一次计数过程。.方式 1方式 1 又称为可编程单脉冲形成器。当写入控制字以后,OUT 输出端将保持高电平。在 CPU 写入计数初值后,计数器并不开始计数,只有在门控信号 GATE 由低变高的上升沿之后的一个 CLK 脉冲的上升沿才开始计数,并且输出端 OUT 变低。在计数过程中 OUT 端一直保持低电平,直到计数结束才变高,这样,在 OUT 输出端得到一个单脉冲,该脉冲信号的宽度为 OUT 端的低电平。.方式 2这个方式又可称为频率发生器。当 CPU 写入控制字后,输出端 OUT将变高,在写入计数初值以后的下一个 CLI 脉
10、冲的下降沿开始计数。计数过程中 OUT 端始终保持高电平,当计数值减至 1 时 OUT 端变为低电平,而计数值减至 0 时 OUT 端又变为高电平,同时会自动将计数值送到执行部件继续进行减法计数,形成连续工作,重复计数,从而输出固定频率的脉冲。.方式 3方式 3 又称为方波发生器,它的工作方式与方式 2 很相似,都是输出周期性的波形,门控信号的控制作用和自动重复计数的功能与方式 2 一样,只是 OUT 端输出的波形不同。这种方式中写入控制字以后,OUT 端将为高,写完计数初值后便可自动开始计数。在计数过程中不断输出一系列方波,其方波的占空比随计数初值的不同而不同,即占空比可以相等也可以不相等。
11、.方式 4方式 4 又称为软件脉冲触发。这种方式中,CPU 写入控制字和计数值后,OUT 端变为高电平,一旦写入计数值后,下一个 CLK 脉冲的下降沿立即开始计数(相当于软件触发),当计数结束后 OUT 端由- 5 -高变低,并维持一个 CLK 的低电平后再变高,计数器停止计数后,只有重新写入新的计数值,才能重新进行新的计数过程,因此这种计数方式也是一次性的。写入计数初值后,计数器不会开始计数,而是要等 GATE 端出现一个上升沿来触发启动,并在下一个时钟沿才开始减法计数。计数至 0 时,OUT 端会变低,并维持一个 CLK 周期的低电平后再变高。因此,在 N1 个 CLK 脉冲后,在 OUT
12、 端输出一个 CLK 周期的负脉冲。.方式 5方式 5 又称为硬件脉冲触发。在这种方式中,CPU 写入控制字和计数值以后,OUT 端变为高电平。写入计数初值后,计数器不会开始计数,而是要等 GATE 端出现一个上升沿来触发启动,并在下一个时钟沿才开始减法计数。计数至 0 时,OUT 端会变低,并维持一个 CLK周期的低电平后再变高。因此,在 N1 个 CLK 脉冲后,在 OUT 端输出一个 CLK 周期的负脉冲。3)8259 芯片8259 是一个可编程的中断控制器。PC 机中断控制器 8259 的地址为20H、21H,编程时要根据中断类型号设置中断矢量,8259 中断屏蔽寄存器 IMR 对应位
13、要清零(允许中断),中断服务结束返回前要使用中断结束命令: MOV AL, 20H OUT 20H, AL中断结束返回 DOS 时应将 IMR 对应位置 1,以关闭中断。中断服务子程序的设计:中断服务程序的一般结构如下图所示:关中断保护现场开中断恢复现场中断返回中断服务用户在设计中断服务子程序时要预先确定一个中断类型号,不论是采用软件中断还是硬件中断,都只能在系统预留给用户的类型号中- 6 -选择。以下是 DOS 系统功能调用法将中断服务程序入口地址置入中断向量表:功能号:(AH) = 25h入口参数:(AL) = 中断类型号(DS) = 中断服务程序入口地址的段地址(DX) = 中断服务程序
14、入口地址的偏移地址4)七段数码管.实验台上的七段数码管为共阴型,段码采用同相驱动,输入端加高电平,选中的数码管亮,位码加反相驱动器,位码输入端高电平选中。.七段数码管的字型代码表如下表:af bge cd5)了解了基本芯片后, 经过小组成员详细讨论,各个芯片的工作方式设置如下:8255 设置为 C 口输入,连接到 8 个抢答开关,A 口输出接到七段数码管.由于系统要求产生 1s 钟的时间间隔,基于实验箱上提供的是 1M的时钟脉冲,所以计数初值为 1M 才能满足要求,由于 1M216,故我们采用两个计数器的级连,每个计数器的初值为 1000.8253 中的计数器0 的 OUT0 接到 CLK1
15、上,CLK0 接 1MHZ 时钟.OUT1 接中断输入IRQ,GATE0 和 GATE1 都接 5V 高电平.两个计数器都工作在方式 2(频率发生器)下.8259 保持系统默认的工作方式,系统已设定中断请求信号为边沿触发,普通结束方式.实验箱上默认将 IRQ7 引到实验台上的 IRQ 插座上.6)本程序流程图如下:显示字形 g f e d c b a 段码0 0 1 1 1 1 1 1 3fh1 0 0 0 0 1 1 0 06h2 1 0 1 1 0 1 1 5bh3 1 0 0 1 1 1 1 4fh4 1 1 0 0 1 1 0 66h5 1 1 0 1 1 0 1 6dh6 1 1 1
16、 1 1 0 1 7dh7 0 0 0 0 1 1 1 07h8 1 1 1 1 1 1 1 7fh9 1 1 0 1 1 1 1 6fh- 7 -七、调试分析8255 并行接口模块:本模块可以完成本课程设计的基本功能即抢答功能.模块编好后进行运行,发现能抢答,发现数码管上显示的是乱码,经过多方测试,问题没有解决,没有办法,从程序头开始,对准书上的例子,一句一句的检查,结果发现没有将数据段的段地址放到 DX寄存器中,改后,本模块单独调试完成.8253 倒计时模块:由于本模块没有涉及到 8259 中断控制器,所以在计数结束后只能通过查询,首先我们采用的方式是两个计数器都工作在方式 0,后来发现就
17、是不计数,后来发现,方式 0 是计数结束中断,只计数一次,再改为方式 3 方波发生器方式,发现计数比预想的要快的多,难道还是 8253 的工作方式设置的不对,看来还要仔细阅读一下,8253 的六种工作方式,结果发现工作方式二频率发生器适合本题- 8 -的要求,改后发现问题真的解决了.8255 中断控制器模块:由于上个学期做过中断的实验,所以本模块进行的比较顺利.八、心得体会在这一周的微机原理课程设计里,我们小组完成了抢答器控制实验。第一天小组集体讨论方案的可行性问题,通过这次讨论,增加了大家的团队合作意识和完成整个课程设计的信心,并把整个程序的模块划分到每个小组成员。第二天小组成员完成各自负责
18、的模块设计,进展比较顺利。第三天主要完成整个程序的初步连调工作并在下午向全体同学汇报了我们组的进展情况,由于时间仓促,初步连调工作出现的问题并没有得到有效的解决。第四天,在整个小组成员的共同努力下,整个程序连调过程中出现的问题一个个都得到了解决,程序的所有功能按预期目标得到实现。最后一天,各个小组成员交付自己的开发文档,并进行总结、归纳成最终文档报告。通过这短短一周的实践,我感觉到自己在课本上学到的理论知识和实践仍有一定的差距。有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。就拿 8253 定时计数器来说吧,由于没有弄明白其各个工作方式的具体工作情况,在倒计时时走了不少弯
19、路。原以为自己的程序流程有问题,没有想到是小小的初始化出现了问题。类似这样的问题,我们还遇到了不少,花费了很多的时间。这让我们重新反思我们的学习,觉得这与自己当时不注意实验课是分不开的。这次的课程设计,在刘军老师的带领下,让我学到了很多书本上学不到的东西,我们首次采用了团队合作的方式,并且由我担任小组组长,所以这次我有过以前课程设计从未有过的压力,因为这不是个人,若我没有做好,会影响整个团队。这是绝对不容许的。令人欣慰的是这次课程设计如期按质按量完成了。经管我们的实验很简单,但是我们至少基本按照了目前社会企业中怎样解决一个大项目的基本流程走下来的。所以,我想,本次课程设计对我们每个人都是影响很大的,尤其对我们这些即将走向工作岗位的同学来说。最后,我要忠心的感谢刘老师给我这次锻炼的机会,感谢我们小组的每一位成员,因为成功是离不开他们的。