测试反应时间模拟系统(精编版)_第1页
测试反应时间模拟系统(精编版)_第2页
测试反应时间模拟系统(精编版)_第3页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、i 测试反响时间模拟系统摘要随着电子技术的飞速开展,微型计算机已经全面渗透了人类生活各领域,并革命性地改变着人们的生活。 因此,可以说了解微型计算机的根本工作原理对于每个人都十分必要。而对于即将从事电子行业的工作者来说,熟悉掌握微机原理并在其上进行软硬件的开发设计那么是一项必须掌握的根本技能。为此,在学习微型计算机技术以及其应用的过程中,我设计了一个能测试人体反响时间的模拟系统。该系统以 8088 微处理器为核心,结合 8255可编程并行通信接口、 8253可编程定时 / 计数器、 8259 中断控制器等芯片以及led等辅助电路,来测试人的反响时间,并将其反映在数码管上。通过此仪器不仅能够真实

2、地测试出人的反响时间,而且还可以锻炼和提高个人对外界突发事件的处理能力。关键词: 反响时间、 8086/8088、汇编、 8255ii simulation system of testing reaction time abstract with the rapid development of electronic technology, the micro-computer has impacted on almost every area of human life and makes the people s lives changing revolutionary. so, its

3、very necessary to understand the base working principle of micro-computer. computer principle and how to do some hardware and software development on the computer should be mastered by the people that will work in the field of electronics industry. for this reason, during studying micro-computer tec

4、hnology and its application, a system used to test a person s reaction time is developed. the system takes the 8088 microprocessor as a core and combines integrated circuits such as 8255 programmable parallel interface,8253 programmable interval timer,8259a programmable interrupt controller and etc,

5、 which tests the reaction time and displays it on the led. this equipment can not only test the reaction time correctly, but also improve the handling capacity of sudden events of the outside world by training. keywords: reaction time; 8086/8088 、assemble language 、8255 iii 目录摘要i abstractii 目录iii 1.

6、 前言1 2 2.1 概述2 2.2 本设计使用的设备介绍2 2.2.1 tdn86/88+ 系统简介2 2.3 设计原理和方法3 2.3.1 设计原理3 2.3.2 设计方法4 2.3.3 程序流程图及其问题4 13 3.1 本设计中8255a 芯片的工作原理13 3.1.1 8255a的内部结构13 3.1.2 8255a的控制字及工作方式14 3.1.3 本设计中 8255a的应用编程14 3.2 本设计中 8259a芯片的编程结构和应用编程15 3.2.1 8259a的编程结构15 3.2.2 8259a初始化流程图16 3.2.3 本设计中 8259a的应用编程17 3.3 本设计中

7、 8253a芯片的工作方式和应用编程18 3.3.1 8253 的工作方式18 3.3.2 本设计中8253 的应用编程19 2 0 4.1 程序的调试过程20 4.2 硬件的调试过程28 4.3 总结29 致谢30 参考资料31 附录一:测试反响时间模拟系统总电路图32 附录二:测试反响时间模拟系统程序33 附录三:硬件实物图及实物与tdn86/88+ 系统的连接图45 4 1. 前言近几十年来,微型计算机的应用已经全面渗透进人类生活的各个角落,大到航空航天领域,小至嵌入式家庭用器,无处不见其踪影,无处不让人深刻感受到其对人类生活的革命性变革。本设计是一个能测试人体反响时间的系统,该系统可以

8、应用于体育训练、医疗和娱乐等领域。5 2. 设计方案论证概述本设计采用 8088 微处理器,结合 8255a 可编程并行通信接口、 8259 中断控制器、8253定时/计时器以及键盘等局部外设电路, 利用汇编为程序设计语言实现一个能测试人体反响时间的模拟系统。具体任务:设计一个能测试人的反响( 响应) 时间的仪器。按启动钮,测试开始, 一旦看到灯亮,立即按测试钮,用4 位八段码显示从看到灯亮到按下测试钮的反响时间xx.xx秒。具有以下功能:(1) 编制一个随机数产生子程序,由随机数决定从按启动钮到四个led亮的时间如在 3 秒15 秒之间内任意变动 ,使被测试者对 led亮的时间无法预见 ,

9、以确保测试结果的可信;(2) 必须在见到 led亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效;(3) 反响时间显示 xx.xx秒, 准确到百分之一秒。(4) 修改以上设计使进一步能测试人对不同事物的反响响应时间。如功能为:按启动钮,测试开始,一旦红灯亮,立即按红灯测试钮,一旦绿灯亮,立即按绿测试钮,八段码显示反响时间xx.xx 秒。假设按错钮 , 那么显示出错并响“嘟一声。要求编制二个随机数产生子程序,一个决定从按启动钮到led亮的时间,另一个决定亮何种颜色灯;同样要求在见到 led亮时按测试钮才有效。本设计使用的设备介绍为研究方便,本设计采用tdn86/88+ 微机实验系统来辅助开发

10、此系统,即首先将程序在该系统上调试,调试完成后再将最终的程序加载到所设计的硬件系统上。另外,硬件方面还需用到普通 pc机一台,用来作为开发主机,以提供界面编辑、编译程序,并将程序加载到目标系统中。 tdn86/88+系统简介(1) 系统总线系统总线信号定义如表2-1 所示。6 表 2-1 8088微机系统总线定义信号线说明信号线说明xa0-xa7 系统地址总线xior i/o 读( 输出)信号线xa8-xa15 xmer 存储器读 ( 输出) 信号线xa16-xa19 xmew 存储器写 ( 输出) 信号线opclk 时钟信号线 (1.193mhz) hold 总线请求 ( 输入) 信号线pc

11、lk 时钟信号线 (2.386mhz) hlda 总线请求应答 ( 输出)信号线(2) 系统内存分配情况系统内存分配如下列图所示:图 2-1 系统内存分配情况本设计需要用到8255、8253、8259等芯片,它们各自的端口地址如下表所示:表 2-2 输入/ 输出接口编码表电路名称信号线存放器编址电路名称信号线存放器编址8253 ioy2 0#计数器40h 8255 ioy3 a口60h 1#计数器41h b口61h 2#计数器42h c口62h 3#计数器43h 控制口63h 8259 ioy1 - 20h - 21h 2.3 设计原理和方法设计原理本设计中可以划分为键盘扫描和键命令的识别和处

12、理局部。从宏观上看,这两局部程序应当不停地并行、 地在执行,这样才能保证既使led 的数字显示稳定, 又不遗漏对闭合键的识别和处理。7 设计方法设计中采用的方案是将键盘扫描程序、 键命令的识别和处理程序及led 显示程序等作为主程序, 而将显示程序、 延时程序以及随机数产生程序等作为子程序调用。在主程序中,对 8255a、8259 进行初始化,接着检测启动键的信号,在启动信号到来后产生随机数,再初始化 8253,使它工作在方式2,每 10ms 产生一上升沿作为中断请求信号给8259,使得程序每 10ms 便进入中断处理子程序,从而实现时间上的累加。设计的总框图如下列图所示。图 2-2 设计总框

13、图大致工作过程为: 8088 微处理器根据 ram 中的程序不断探测启动键是否按下,假设启动键按下,那么产生一随机时间给8253 进行延时处理,使8253 完成 315 秒的工作。延时结束后,通过 ram 的随机数产生子程序产生一随机数,以决定亮 8 个 led 中的哪个led。此后程序对键盘进行扫描,假设按错键那么响蜂鸣器,假设按下正确的键那么将利用 8255 b 口所连接的四位数码管显示时间的数据。程序流程图及其问题(1) 程序流程图基于以上设计任务可以画出图2-3 所示的简易流程图。(2) 程序流程图里的相关问题当按着流程图去试着写程序,会遇到以下几个问题:1)长时间延时为解决这个问题,

14、应首先了解8253 定时/ 计数器的内部结构及工作原理。intel 8253 是 nmos 工艺制成的可编程定时 /计数器。它既可以用来定时, 也可以用来计数。其实,定时功能也是通过计数来完成的,因为当计数器用作定时器时,其输入的时钟信号为周期性脉冲信号,而对周期性信号的计数即实现了延时的目的,延时时间为输入时钟信号的周期与计数初值n 的乘积。8253 的编程结构框图如图2-4 所示。8 图 2-3 简易流程图图 2-4 8253 定时 / 计数器编程结构图8253 内部有三个计数器,分别称为计数器0、计数器 1 和计数器 2,它们的结构完全9 相同。每个的输入和输出都决定于设置在控制存放器中

15、的控制字,互相之间工作完全独立。每个通过三个引脚和外部联系,一个为时钟输入端clk ,一个为门控信号输入端gate ,另一个为输出端 out 。每个内部有一个8 位的控制存放器,还有一个16 位的初值存放器 cr 、一个执行部件 ce和一个输出锁存器ol 。执行部件实际上是一个16 位的减法计数器, 它的起始值就是初值存放器的值,而初值存放器的值是通过程序设置的。输出锁存器ol用来锁存执行部件ce的内容,从而使cpu可以对此进行读操作。因此,如果在系统时钟为 1.193mhz 的情况下,需要利用 8253定时/ 计数器延时 0.01秒,只需将初始值 11930赋给初值存放器,再将 8253的相

16、应 clk 端接上系统时钟引脚即可。至于控制存放器,它的格式如下表所示:表 2-3 8253控制存放器格式sc1 sc0 rl1 rl0 m2 m1 m0 bcd 各位所表示的意义简要解释如下:sc1,sc0 :通道选择位。为00、01、10 分别表示选择计数器0、1、2。rl1,rl0 :读 / 写操作位。 00 表示锁存数据 , 可随时读取计数器中的计数值; 01 表示只读/ 写低 8 位, 高 8 位自动置为 0; 10 表示只读 / 写高 8 位, 低 8 位自动置为 0; 11 表示读/ 写 16 位数据 , 先低 8 位, 后高 8 位。m2,m1,m0 :工作方式选择位。具体选择

17、关系如下表:表 2-4 工作方式选择关系表0 0 0 模式 0 0 0 1 模式 1 x 1 0 模式 2 x 1 1 模式 3 1 0 0 模式 4 1 0 1 模式 5 bcd :用来设置计数值格式。为1 时表示计数值为bcd码格式;为 0 时表示为二进制格式。另外, 8253定时/ 计数器里各计数器都有六种工作方式,分别为方式0至方式 5,在这里为方便编程先说明一下方式2。方式 2又称频率发生器工作方式。当程序将工作方式控制字写入控制字存放器时 , 计数器的输出端 out 立即变为高电平。在写入计数初值后, 计数器对输入时钟 clk 计数。在计数过程中 out 保持不变 , 直到计数器从

18、初值减为 1时, 输出out 将变低, 再经过一个 clk 周期,out 恢复为高电平 , 并按已设定的计数初值重新开始计数。其时序图如下列图所示:10 图 2-5 8253方式 2 时序图由时序图可见,每当计数器计数完成时便在输出端输出一负脉冲。由于 8253 定时/ 计数器是 16 位的,而系统总线中的时钟信号只有两种: s=0.0549s。那么,如何来实现长达 315 秒的延时呢?其实, 可以通过计数器的串联来解决这个问题。例如,可以将系统时钟接到clk0上,使 gate0 有效( 高电平 )并将 out0 输出接到 clk1上作为计数器 1 的计数时钟, 并使 gate1 为高电平。这

19、就使得计数器0和计数器 1 串联在一起。可使计数器 0 工作在方式 2 或方式 3,使其输出连续的脉冲;使计数器1 工作在方式 0。计数值方面可使计数器0 为 11930, 计数器 1 为 1500, 这样就可使得总计数值为11930*1500,即实现了延时 15 秒的目的。但由于系统中计数器0 和计数器 1 已作其它用途,故只能采用计数器2 来实现长时间延时的目的。为了实现单个计数器延时长时间的目的,须想方法实现计时时间的累加。本设计采用计时器结合中断的方法来解决这个问题。即将8253 的工作方式设置为方式 2,计数初值设为11930,此时每过 0.01 秒便在 8253 的 out2 引脚

20、上输出一上升沿作为8259的中断请求信号, 而 cpu 通过接收中断类型码进入中断处理子程序,并在此子程序里的对某一计数变量加1 从而实现时间的累加,到达长时间延时的目的。8259a是 intel系列的可编程中断控制器。中断控制器的功能就是在有多个中断源的系统中,接收外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请求送到 cpu 的 intr端;当 cpu 响应中断并进入中断子程序的处理过程后,中断控制器仍然负责对外部中断请求的管理。8259编程结构图 2-6 所示。由图可见, 8259a 内部由两大局部组成,上半局部包括中断请求存放器irr,优先级别器 pr和中断效劳存放器

21、isr,它们构成 8259a的中断处理局部称为处理部件。这局部的功能是接收和处理从ir1ir0 引脚进入的外部中断,其工作过程表达了8259a 本身的工作原理。即接收中断请求,进行中断判优,记录当前正在处理的中断优先级,实现中断嵌套,向 cpu发出中断申请,当cpu 响应中断时,接收cpu 的两个连续中断响应信号将控制转移到中断效劳程序中去。11 图 2-6 8259a 的编程结构综上所述,如果要求实现时间的累加, 可以将 8253定时/ 计数器的 out 输出端接到 8259中断控制器的 iri 端,并通过相应的程序代码编程实现。mov cx,100 ; 延时时间由 cx值决定mov al,

22、0b4h out 43h,al mov ax,bx ;bx 存放计数初值out 42h,al ; 先写计数值低 8位mov al,ah out 42h,al ; 再写计数值高 8位irq7:dec cx ; 中断处理子程序mov al,20h ; 中断结束处理out 20h,al iret 以上程序代码的第二条和第三条两条指令表示选择定时/ 计数器 2; 给计数器赋初值时先读写低 8 位,再读写高 8 位;工作方式选择方式2。第四至七行用于对初值存放器赋初值,而后面的语句那么为中断处理子程序。程序中,方式2 表示每经过 clk2上的一个时钟脉冲便对计数值减一,直至计数值减至1 时在 out2

23、输出端一负脉冲并再次实现初值的自动重装工作。而输出的负脉冲将作为8259 的中断请求信号从引脚ir7 引入,假设此时12 8259未屏蔽该引脚上的中断请求,那么8259将向 cpu 发出中断请求。此后程序进入中断处理子程序进行中断处理。由于每次计数结束时便进入中断处理过程中对cx减一,相当于实现了统计负脉冲个数的功能,因而实现了时间的累加。解决了长时间延时的问题后,接着考虑如何延时315 秒内的一个随机时间。假设计时器 t 位数足够多,可以赋任意大的初值,那么对于1.193mhz的系统时钟来说,要延时3秒,那么应对其赋的初值为11930*300;要延时 15秒,那么应赋的初值为11930*15

24、00。所以,以上问题实际上要解决的是如何产生一个3001500 内的随机数。2) 随机数的产生如何产生一个随机数,以便亮一个随机led ?对于这个问题,一般是通过读取微机上的时间信息来实现的。通过查阅参考文献4可知,在普通的 pc机中,有一个由主板电池供电的cmos ram 芯片,一般简称 cmos,其容量比拟小,大多为128 个存储单元。在这128 个存储单元中, 0-0dh单元是用来保存时间信息的,而且存储形式采用bcd码形式。在这假设干个存储时间信息的存储单元中,当前的时间信息存放位置一般如下:秒:0 分:2 时:4 日:7 月:8 年:9 比方当前时间的秒数为26 秒,那么第 0 个存

25、储单元的内容为00100110。cmos ram芯片内部有两个端口,端口地址为70h和 71h 。cpu 通过这两个端口实现对cmos ram芯片的读写。但是,tdn86/88+ 实验系统中并没有由纽扣电池供电的ram 芯片,因此假设系统关闭电源时,一切信息都将消失,也就是说实验系统中并不存在与普通pc 机类似的系统时间存储机制。因此,需要采用其它方法来实现随机数的产生。通过查阅相关文献,在本设计中将采用以下方法来实现随机数的产生利用此方法产生随机数的效果请参阅调试局部:首先产生一个随机的ax ,再通过对 n进行求余运算得到0n-1 内的随机数。比方要产生一个 07 内的随机数,将采用以下代码

26、完成:call rnd_ax ; 产生随机 ax mov ah,03h ; 防止溢出 mov dl,8 div dl ; 产生 07 之间一随机数至ah mov rnd,ah ;ax 除 dl,商放 al,余数放 ah rnd_ax proc near ; 子过程,用于产生随机的ax mov ax,0c49h imul seed add ax,05e1h mov seed,ax ; 保存种子13 push cx mov cl,8 ror ax,cl ; 对 ax进行移位 pop cx rnd_ax endp其中 seed 、rnd 是在数据段定义的变量, seed 初始化时可以任意赋值,本设计

27、中置初值为 1。此段代码最终产生一个07内的随机数至变量rnd 。上面所说的产生一个3001500 内的随机数问题也可以类似地解决,程序中先用一个随机数子程序产生100 个随机数, 对其求和并将所得的和存放到变量rndsum,那么根据统计平均规律, rndsum约为 255*100/2 12750,将此值作为计数器t 的初始值。如此一来,欲 表 示 一 个3 15 秒 的 区 间 , 那 么 需 确 定 两 个 变 量num1和num2( 其 中num1=11930*300/rndsum,num2=11930*1500/rndsum),这样区间 (num1 num2) 就对应 315 秒。具体

28、代码如下:mov dx,0036h ;11930*300=36 9c78 h mov ax,9c78h mov bx,rndsum ;rndsum 为 100 个 rnd 之和div bx mov num1,ax mov dx,0111h ;11930*1500=111 0e58 h mov ax,0e58h div bx mov num2,ax call rnd_ax ; 产生随机 ax mov dx,0 mov cx,num2 sub cx,num1 div cx ;cx 存放 0num2-num1之间的随机数mov cx,dx add cx,num1 ;cx存放 num1-num2之间的

29、随机3)键盘扫描通常使用的键盘是矩阵结构的,如下列图所示:14 图 2-7 键盘的矩阵式结构识别键盘上的闭合键通常有两种方法:行反转法和行扫描法。行反转法的原理:行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式,程序使cpu 通过输出端口往各行线上全部送低电平,然后读入列线的值。如果此时有某一个键被按下,那么必定会使某一列线值为零,然后,程序再对两个并行端口进行方式设置,使行线工作在输入方式,列线工作在输出方式,并且将刚刚读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为零。这样,当一个

30、键被按下时,必定可以读得一对唯一的行值和列值。行扫描法的原理:首先先快速检查键盘中是否有某个键已被按下,然后,再确定具体按下了哪一个键。为此,可以先使所有各行同时为低电平,再检查是否有列线也处于低电平。这时,如果列线上有一位为0, 那么说明必有键被按下,不过,还不能确定所闭合的键处在哪一行上,于是再用扫描法来确定具体位置。具体为:先使第1 行接地,其余行接高电平,然后看是否有哪条列线变成低电平。如果有某条列线为低电平,那么该列与第1 行相交位置上的键被按下; 如果没有任何一条为低电平, 遇说明第 1 行上的键均没有被按下。用同样的方法判别其它各行的情况,最终确定所按下的键。本键盘扫描程序将采用

31、行扫描法来实现键盘的扫描。4)用数码管显示时间数据下列图是 8 段共阴数码管的结构图:图 2-8 数码管内部结构及外观引脚15 由上图可知,要想选通数码管, 应将第 3 管脚接低电平作为选择数码管的位,而将 8255 b口的 pb7 pb0分别接数码管的 dp a作为选择数码管的段。对于数码管数据的显示,一般都是用查表指令来完成显示工作的,即先把 09 的显示码放到一个数据表中, 并将存放器 bx指向表的首地址, 在 al存放数码管所要显示的数字, 再利用 xlat这条换码指令即可完成换码操作。至此,简易流程图的问题都大致解决了。考虑其它各方面因素,作出如图2-9 所示的完整流程图。图 2-9

32、 完整流程图16 3. 本设计中各芯片的工作原理及编程3.1本设计中8255a芯片的工作原理8255a是 intel系统的并行接口芯片。 由于它是可编程的, 可以通过软件来设置芯片的工作方式,所以,用8255a连接外部设备时,通常不需要再附加外部电路,给使用带来很大的方便。3. 8255a 的内部结构参阅参考书 1 ,8255a的内部结构框图如下列图所示:图 3-1 8255a 的内部结构图8255a由以下几局部组成。1数据端口 a、b、c 8255 具有三个相互应独立的8 位并行输入输出端口,即端口a,端口 b和端口 c 。端口 a:端口 a对应 1 个 8 位数据输入器和1 个 8 位数据

33、输出锁存 / 缓冲器。端口 b: 端口 b对应 1 个 8 位数据输入缓冲锁存器和1 个 8 位数据输出锁存器 / 缓冲器。端口 c :端口 c对应 1 个 8 位数据输入缓冲器和1 个 8 位数据输出锁存器 / 缓冲器。在使用中,端口a 和端口 b常常作为独立的输入端口或者输出端口,而端口c常常通过控制命令被分成2 个 4 位端口,分别用来为端口a和端口 b提供控制信号和状态信号。2a组控制和 b组控制a组控制电路控制端口a和端口 c的高 4 位(pc7pc4)的工作方式和读写操作。b组控制电路控制端口b和端口 c的低 4 位(pc3pc0)的工作方式和读写操作。3读写控制逻辑电路17 读写

34、控制逻辑电路负责管理8255a的数据传输过程。4数据总线缓冲器这是一个双向三态的8 位数据缓冲器, 80255a正是通过它与系统数据总线相连。输入数据、输出数据以及cpu发给 8255a的控制字都是通过这个缓冲器传递的。3.1.2 8255a 的控制字及工作方式(1)8255a 的控制字8255a 可以通过指令在控制端口中设置控制字来决定它的工作。控制字分为两类:方式选择控制字和端口c置 1/ 置 0 控制字,两者通过最高位的值相互区别:如最高位d7为1 表求控制字为方式选择控制字,否那么那么为c口置 1/ 置 0 控制字。(2)8255a 的工作方式8255a有三种工作方式:方式0、方式 1

35、 和方式 2。以下介绍方式 0。方式 0 也叫根本输入输出方式。在这种方式下,端口a和端口 b可以通过方式选择规定为输入口或者输出口,端口c分为两个 4 位端口,高 4 位和低 4 位各为一个端口。概括地说,方式 0 的根本特点如下:1任何一个端口可作为输入口,也可作为输出口,各端口之间没有规定必然的关系。2各个端口的输入或输出, 可以有 16 种不同的组合, 所以可以适用于多种使用场合。本设计中 8255a的 a、b端口均采用方式 0。本设计只采用方式0。本设计中 8255a的应用编程假设用 8255a的端口地址如下表所示:表 3-1 8255a 的端口地址分配表a口60h b口61h c口

36、62h 控制口63h 假设有以下指令将控制字写入控制端口中:mov al,81h out 63h,al 其中 81h 的二进制形式为 10000001,最高位 d71 表示此控制字为方式选择控制字。根据 8255 方式选择控制字格式,那么d6d500 表示 a 口工作于方式 0,d40 表示 a口工作于输出状态, d30 表示 c 口高 4 位为输出口, d20 表示 b 口工作于方式 0,d10表示 b 口为输出口, d01 表示 c 口低 4位为输入口。此后假设要求 b 口输出 1的显示码 06h,那么只需执行以下代码:18 mov al,06h out 61h,al 而假设要求对 pc2

37、 置 1 以驱动蜂鸣器,那么可执行以下代码:mov al,05h out 63h,al 其中 05h的二进制形式为00000101,最高位 d70 表示此控制字为c 口置 1/置 0 控制字。根据其格式, d3d2d1010表示对 pc2进行操作, d00 表示对 pc2置 1。3.2 本设计中 8259a芯片的编程结构和应用编程参阅参考文献 1 ,8259a是 intel系列的可编程中断控制器。它具有以下特点:11 片 8259a能管理 8 级中断;2由于 8259a 是可编程的,所以使用起来非常灵活。实际系统中,可以通过编程使8259a工作在多种不同的方式。38259a用 nmos 工艺制

38、造,只需要一组5v电源。3.2.1 8259a 的编程结构编程结构如图 3-2 所示。各存放器的工作原理表述如下:1中断请求存放器irr。此存放器用来存放外部输入的中断请求信号ir7 ir0。每一位对应一个外部中断请求信号ir,当某个 ir 端有中断请求时,其相应位置“1”。 2中断屏蔽存放器imr 。imr是一个 8 位存放器,用来存放对各级中断请求的屏蔽信息,如果某一位 imr置“0”,表示对应的中断ir 被允许, imr的某一位 imr置“1”,表示对应的中断 ir 被屏蔽。3中断效劳存放器isr。isr 是 8 位存放器,与 8 级中断 ir7ir0 相对应,用来记录正在处理的中断请求

39、,如果某一级中断被响应,那么isr中的相应位置“ 1”。4优先级判别器pr 。pr用来管理和识别各中断请求信号的优先级别。当出现多重中断时, pr将新出现的中断请求和正在被效劳的中断优先级进行比拟,确定新的优先级是否高于正在处理的中断级。高级中断允许中止低级中断。而 8259a的下半部有 7 个 8 位存放器。这些存放器可分为两组:icw1icw4 为一组,称为初始化命令字 (icw)存放器,用来接收 cpu 向 8259a发出的初始化命令以决定8259a的工作方式。而 ocw1ocw3为一组,称为操作命令字 (ocw) 存放器,用来存放 cpu向 8259a发出的操作命令。19 图 3-2

40、8259a 的编程结构3.2.2 8259a 初始化流程图在 8259a进入正常运行之前,必须将系统中的每一片8259a进行初始化。初始化就是将上述的初始化命令字按固定的次序写入8259a的指定端口。 8259a的初始化流程图如图3-3 所示。图 3-3 8255a 的初始化流程图20 本设计中 8259a的应用编程系统中的 8259a的偶端口地址为 20h ,端口地址为 21h 。假设系统只有一片8259a,且系统开放 irq7 ,那么可用以下代码对其进行初始化:mov al,13h ; 初始化 8259 out 20h,al ;icw1 mov al,08h ;icw2 out 21h,a

41、l mov al,09h ;icw4 out 21h,al in al,21h ;ocw1 and al,7fh out 21h,al 以上代码中,写入icw1存放器的数值为 13h ,其二进制形式为00010011。根据 8259初始化命令字 icw1的格式, d3 0 表示中断请求为边沿触发方式; d1=1表示采用单片 8259;d01 表示采用 icw4 。写入 icw2存放器的数值为 08h ,其二进制形式为 10000000。根据 icw2的格式及含义,表示中断类型码的前5 位为 10000, 而后 3 位那么由中断请求信号进入8259 时的输入引脚所确定。假设中断请求信号从ir7

42、引脚输入,那么中断类型码的低3 位为 111。写入 icw4存放器的数值为 09h ,其二进制形式为10000001。根据 icw4的格式, d4 0 表示中断嵌套方式为完全嵌套方式; d30 表示 8259不通过总线驱动器与数据总线相连;d10 表示中断结束方式为非自动结束方式,此时需要发出一般的中断结束命令来结束中断过程。in al,21h表示将 ocw1 的数值读入 al,and al ,7fh表示对最高位清零,清零后再通过 out 21h ,al将修改后的 al值写入 ocw1。整个过程表示开放8259的 ir7,允许此引脚上的中断请求。而要使得 cpu 进入中断处理子程序irq7 ,

43、 那么应使用以下代码, 以便产生中断时, cpu进行正确的跳转:push ds mov ax,0h mov ds,ax mov bx,003ch mov ax,offset irq7 ; 获取 irq7的偏移地址add ax,2000h mov bx,ax 21 mov ax,0000h mov bx,003eh mov bx,ax pop ds 因为在 8259a的 ir7 引脚产生中断时, cpu 通过总线获得 8259a传来的中断类型码0fh(即 00001 111),此时 cpu 将对此码进行乘 4 操作而获得一数值,再将以此数值为内存地址的内容读出送至cs 、ip,也就是进行了跳转。

44、以上代码就是更改了相应内存单元的内容,从而使得 cpu可以进行正确的跳转而转至中断处理子程序irq7。进入中断处理子程序后最终需要进行中断结束处理,这时可采用以下代码:mov al,20h out 20h,al 此代码将 20h 写到 ocw2 中,其中 eoi=1,r=0,sl=0,这是一个一般的中断结束命令,它使当前中断处理子程序对应的isn 位被去除,从而结束中断,使得可以再次引发ir7 中断。3.3 本设计中 8253a芯片的工作方式和应用编程intel 8253 是 nmos 工艺制成的可编程定时 /计数器,它既可以用于定时也可以用于计数,其。 8253 内部包含三个结构完全相同但又

45、相互独立的定时/计数器,并通过控制端口对各个定时 /计数器进行操作控制。3. 8253 的工作方式8253作为一个可编程的定时 / 计数器,可以用 6种模式工作, 本设计中只用到方式 0和方式2,由于方式 2前面已经介绍,故以下只介绍方式0的工作原理。方式0 : 又称计数结束产生中断工作方式。当程序将工作方式控制字写入控制字存放器时, 计数器的输出端 out 立即变为低电平。在计数初值写入该计数器后, 输出仍将保持为低电平。当门控信号 gate 为高电平时 , 计数器对输入端 clk 的输入脉冲开始作减一计数, 当计数器从初值减为 0 时, 输出端 out 由低电平变为高电平 , 该输出信号可

46、作为向 cpu 发出的中断请求信号。时序图如下:图 3-4 8253方式 0 时序图22 本设计中 8253 的应用编程假设系统中 8253 各计数器的端口地址如下表所示:表 3-2 8253定时 /计数器各端口地址计数器 0 40h 计数器 1 41h 计数器 2 42h 控制存放器43h 如果采用 opclk=1.193mhz 的系统时钟,假设要求计数器0 计时 0.01 秒,那么可采用以下代码:mov al,0b4h out 43h,al mov ax,11930 out 42h,al mov al,ah out 42h,al 其中第一、二行表示设置计数器0 的工作方式为方式2,先读写低

47、 8 位,再读写高8位。接着第三至六行把计数初值放至16 位的初值存放器中。这样的话每次计数完毕后都会在输出端输出一负脉冲。23 4. 调试过程与总结4.1 程序的调试过程程序的调试是一个艰难的过程,因为程序如果隐藏着微小错误,就会使得实验结果与预期结果大相径庭,甚至程序运行不了。而要挖掘出这些深藏着的错误,必须花费足够多的时间与耐心,对每一程序模块、模块与模块间的联系(比方参数传递问题 )、甚至每一语句进行再三的思考。(1) 芯片的测试为了测试 8253 定时/ 计数器与 8259a中断控制器共同作用后的工作情况,可将8253的 out2 连接到 8259a的 ir7 端,具体连接情况如下:

48、8253-gate2-+5v 8253-clk2-kk1 8253-out2-8259a-ir7 此时,将以下代码编译加载到系统中测试:code segment assume cs:code start:push ds ;修改中断向量mov ax,0h mov ds,ax mov bx,003ch mov ax,offset irq7 add ax,2000h mov bx,ax mov ax,0000h mov bx,003eh mov bx,ax pop ds ;初始化 8259- mov al,13h ;icw1 out 20h,al mov al,08h ;icw2 out 21h,a

49、l mov al,09h ;icw4 out 21h,al in al,21h ;ocw1,开放 irq7 and al,7fh out 21h,al 24 ;初始化 8253- mov al,90h ;控制字写入控制存放器out 43h,al mov al,5 ;对 t2 赋初值 5”out 42h,al sti ;开中断here: jmp here ;等待中断irq7: mov ah,01h mov al,4dh ;显示字母 mint 10h mov al,20h ;去除中断标志out 20h,al ;重新对计数器赋初值mov al,90h ;控制字写入控制存放器out 43h,al mo

50、v al,5h ; 对 t2 赋初值 5”out 42h,al iret code ends end start 程序加载运行后,每按一次启动键kk1 ,便产生一个正脉冲作为8253 计数器 t2 的clk 时钟信号。 程序中对计数器 t2 赋予初值 5” ,当按下 6 次启动键 kk1 后在显示终端显示一个字母 m。之所以要按下6 次而不是 5 次启动键,是因为计数器t2 采用的是方式 0,该方式规定写入计数初值后需等待一个时钟脉冲计数初值才会送到计数执行部件进行减一操作,因此需按6 下启动键 kk1 。通过以上程序,确定8253 定时/计数器及 8259a 中断控制器工作正常。 (2) 本

51、系统在程序调试过程中所遇到的几个问题1)随机数的产生刚开始时,本设计想利用读系统时钟的方法来产生随机数。使用的功能调用为: ah=02,int 1ah 。执行后 ch:cl= 时: 分;dh= 秒( 均为 bcd 格式)。比方可以通过以下程序读取系统时钟,这在普通 pc机上可以得到正确结果:data segment hour db ? ; 变量 hour 用于存放时min db ? ; 变量 min 用于存放分25 sec db ? ; 变量 sec 用于存放秒pcsec db ? data ends code segment assume cs:code,ds:data start:mov

52、ax,data mov ds,ax sti mov ah,02h ;执行 int1ah 功能调用int 1ah mov hour,ch ;将功能调用所得到的数据赋值给各变量mov min,cl mov sec,dh mov pcsec,dl mov ah,4ch int 21h code ends end start比方当前时 23:44:09 秒,那么执行以上程序后,会得到数据段内的数据为:23 44 09 00 00 00 00 00-00 00 00 00 00 00 00 00 程序的执行过程为,在执行int 1ah功能调用后, ch=0010 0011b(23 的 bcd码) ,将其

53、赋值给变量 hour 后,hour 便以 23h的形式存放在内存中。但将此程序放至 tdn86/88系统中运行,就得到不一样的结果了。我试验过两次,一次是系统刚上电后运行此程序,此时变量得到的结果为 :hour=0cch,min=0cch ,sec=0cch 。另一次是先运行其它程序,然后再运行此程序,此时得到的结果为hour=18h,min=86h ,sec=00h。无论哪一种情况,都不能得到正确的结果。为此,此程序采用了其它方法来实现随机数的产生,也就是第2 章所述的方法。但这种方法生成随机的效果怎样呢?可以用以下程序来统计:data segment seed dw 1 ;定义种子i db

54、 ? ;定义一变量,用来存放07 以判断所产生的随机数的值xtable dd routine0 ;定义表存放各跳转路径的段地址和偏移地址dd routine1 dd routine2 dd routine3 dd routine4 26 dd routine5 dd routine6 dd routine7 times0 db 0 ;定义变量统计 07 的出现次数times1 db 0 times2 db 0 times3 db 0 times4 db 0 times5 db 0 times6 db 0 times7 db 0 rndbuf db 100 dup(?) data ends ;*

55、 stack segment stkbuf db 80 dup(?) stack ends ;* code segment assume cs:code,ds:data start:mov ax,data mov ds,ax ;- mov bx,0 mov si,offset rndbuf mov cx,100 ;产生 100个 07 的随机数rndgnt: mov ax,0c49h imul seed add ax,05e1h mov seed,ax push cx mov cl,8 ror ax,cl mov dx,0 mov cx,8 div cx ;除数为 8,余数为 07 27 po

56、p cx mov si,dl mov di,0 mov i,0 kkk: cmp dl,i ;利用变量 i 判断产生的随机数的值jnz not_yet call xtabledi ;判断出随机数的值后调用子程序对相应的统计变量加1 jmp nextrnd not_yet:add di,type xtable inc i jmp kkk nextrnd:inc si loop rndgnt jmp codeend ;- routine0:inc times0 ;对相应的统计变量加1 ret routine1:inc times1 ret routine2:inc times2 ret routi

57、ne3:inc times3 ret routine4:inc times4 ret routine5:inc times5 ret routine6:inc times6 ret routine7:inc times7 ret ;- codeend: mov ah,4ch int 21h code ends end start28 ,并编译链接后用debug 程序调试,具体过程如下:图 4-1 dos 下的调试图1 由图可见,执行两步单步运行后,数据段段地址变为ds 0b69 ,根据数据段变量的定义情况知道从 0b69:0023 开始存放 100 个 07 的随机数,利用g 命令全速运行程序

58、后再用 d命令查看得到以下结果:图 4-2 dos 下的调试图2 由上图可见,产生的100 个随机数从第 1 行的倒数第五个数字02 开始至倒数第二行的倒数第二个数字02 结束;而第一行的第四个数字0e 到第一行的倒数第六个数字09 为0007在这 100 个随机数中的统计次数。为了明确,在此重新写一次各随机数的统计次数:表 4-1 随机数次数统计表随机数00 01 02 03 04 05 06 07 次数 (十六进制0e 0e 0c 0c 0d 0e 0c 09 次数 (十进制 ) 14 14 12 12 13 14 12 09 可见,用上述方法来产生随机数是可行的。2)响蜂鸣器设计要求当按

59、错键时响蜂鸣器一声。因为系统采用的是有源蜂鸣器,因此,当按错按29 键时只需把蜂鸣器接高电平即可。但是在调试的实际情况出现了一些问题,因为当我把整个设计的根本功能做出来后, 8255 就只剩下一个引脚pc2了,此时其它引脚的连接关系如下:pa7 pa0 d7d0 ;pb7 pb0 dp a;pc7 pc4 x1x4;pc3 kk1 ;pc1 pc0 y1y0(具体情况可看附带的电路图)。于是很自然地把pc2接到电子发声单元的spk端,当按错键时,只要把pc2置为高电平就可以了。那么如何将pc2置为高电平呢?显然最简单的方法便是利用端口c置 1/ 置 0 方式字,即在要响蜂鸣器的地方执行以下代码

60、:mov al,05h ;0000 010 1,即置 pc2为 1 out 63h,al 但是将以上代码连同程序的其它局部加载到tnd86/88+ 系统后测试时,却发现即使按错了键,蜂鸣器依旧不会响!这是怎么回事呢?难道蜂鸣器坏掉了?试着把系统上的+5v电源接至 spk端,蜂鸣器却响了。因此可以断定是程序出了问题。于是进入单步调试,发现执行以上代码时能正常通过,蜂鸣器就是不会响,也就是说在执行out 63h,al后并不能使得 pc2为高电平。在对 8255 进行初始化的时候规定了a、b口为输出口, c口高 4 位为输出口,低4 位为输入口。 这样一来, 想利用 c口置 1/ 置 0 方式字来置

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论