测试反应时间模拟系统.docx

上传人:牧羊曲112 文档编号:1738333 上传时间:2022-12-16 格式:DOCX 页数:50 大小:837.96KB
返回 下载 相关 举报
测试反应时间模拟系统.docx_第1页
第1页 / 共50页
测试反应时间模拟系统.docx_第2页
第2页 / 共50页
测试反应时间模拟系统.docx_第3页
第3页 / 共50页
测试反应时间模拟系统.docx_第4页
第4页 / 共50页
测试反应时间模拟系统.docx_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《测试反应时间模拟系统.docx》由会员分享,可在线阅读,更多相关《测试反应时间模拟系统.docx(50页珍藏版)》请在三一办公上搜索。

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

2、而且还可以锻炼和提高个人对外界突发事件的处理能力。关键词:反应时间、8086/8088、汇编、8255simulation system of testing reaction timeAbstractWith the rapid development of electronic technology, the micro-computer has impacted on almost every area of human life and makes the peoples lives changing revolutionary. So, its very necessary to u

3、nderstand 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 technology and its app

4、lication, a system used to test a persons 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, which tests the rea

5、ction 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目 录摘要IAbstractII目录III1.前言12.设计方案论证22.1 概述22.2 本设计使用的设

6、备介绍22.2.1 TDN86/88+系统简介22.3 设计原理和方法32.3.1 设计原理32.3.2 设计方法42.3.3 程序流程图及其问题43.本设计中各芯片的工作原理及编程133.1 本设计中8255A芯片的工作原理133.1.1 8255A的内部结构133.1.2 8255A的控制字及工作方式143.1.3 本设计中8255A的应用编程143.2 本设计中8259A芯片的编程结构和应用编程153.2.1 8259A的编程结构153.2.2 8259A初始化流程图163.2.3 本设计中8259A的应用编程173.3 本设计中8253A芯片的工作方式和应用编程183.3.1 8253

7、的工作方式183.3.2 本设计中8253的应用编程194.调试过程与总结204.1 程序的调试过程204.2 硬件的调试过程284.3 总结29致谢30参考资料31附录一:测试反应时间模拟系统总电路图32附录二:测试反应时间模拟系统程序33附录三:硬件实物图及实物与TDN86/88+系统的连接图45461.前言近几十年来,微型计算机的应用已经全面渗透进人类生活的各个角落,大到航空航天领域,小至嵌入式家庭用器,无处不见其踪影,无处不让人深刻感受到其对人类生活的革命性变革。本设计是一个能测试人体反应时间的系统,该系统可以应用于体育训练、医疗和娱乐等领域。2.设计方案论证2.1 概述本设计采用80

8、88微处理器,结合8255A可编程并行通信接口、8259中断控制器、8253定时/计时器以及键盘等部分外设电路,利用汇编为程序设计语言实现一个能测试人体反应时间的模拟系统。具体任务:设计一个能测试人的反应(响应)时间的仪器。按启动钮,测试开始,一旦看到灯亮,立即按测试钮,用4位八段码显示从看到灯亮到按下测试钮的反应时间xx.xx秒。具有以下功能:(1) 编制一个随机数产生子程序,由随机数决定从按启动钮到四个LED亮的时间(如在3秒15秒之间内任意变动),使被测试者对LED亮的时间无法预见,以确保测试结果的可信; (2) 必须在见到LED亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效; (

9、3) 反应时间显示 xx.xx秒,准确到百分之一秒。 (4) 修改以上设计使进一步能测试人对不同事物的反应(响应)时间。如功能为:按启动钮,测试开始,一旦红灯亮,立即按红灯测试钮,一旦绿灯亮,立即按绿测试钮,八段码显示反应时间xx.xx秒。若按错钮,则显示出错并响“嘟”一声。要求编制二个随机数产生子程序,一个决定从按启动钮到LED亮的时间,另一个决定亮何种颜色灯;同样要求在见到 LED亮时按测试钮才有效。2.2 本设计使用的设备介绍为研究方便,本设计采用TDN86/88+微机实验系统来辅助开发此系统,即首先将程序在该系统上调试,调试完成后再将最终的程序加载到所设计的硬件系统上。另外,硬件方面还

10、需用到普通PC机一台,用来作为开发主机,以提供界面编辑、编译程序,并将程序加载到目标系统中。2.2.1 TDN86/88+系统简介(1)系统总线系统总线信号定义如表2-1所示。表2-1 8088微机系统总线定义信号线说明信号线说明XA0-XA7系统地址总线XIORI/O读(输出)信号线XA8-XA15XMER存储器读(输出)信号线XA16-XA19XMEW存储器写(输出)信号线OPCLK时钟信号线(1.193MHz)HOLD总线请求(输入)信号线PCLK时钟信号线(2.386MHz)HLDA总线请求应答(输出)信号线(2)系统内存分配情况系统内存分配如下图所示:图2-1 系统内存分配情况本设计

11、需要用到8255、8253、8259等芯片,它们各自的端口地址如下表所示:表2-2 输入/输出接口编码表电路名称信号线寄存器编址电路名称信号线寄存器编址8253IOY20#计数器40H8255IOY3A口60H1#计数器41HB口61H2#计数器42HC口62H3#计数器43H控制口63H8259IOY1-20H-21H2.3 设计原理和方法2.3.1 设计原理本设计中可以划分为键盘扫描和键命令的识别和处理部分。从宏观上看,这两部分程序应当不停地并行、地在执行,这样才能保证既使LED的数字显示稳定,又不遗漏对闭合键的识别和处理。2.3.2 设计方法设计中采用的方案是将键盘扫描程序、键命令的识别

12、和处理程序及LED显示程序等作为主程序,而将显示程序、延时程序以及随机数产生程序等作为子程序调用。在主程序中,对8255A、8259进行初始化,接着检测启动键的信号,在启动信号到来后产生随机数,再初始化8253,使它工作在方式2,每10ms产生一上升沿作为中断请求信号给8259,使得程序每10ms便进入中断处理子程序,从而实现时间上的累加。设计的总框图如下图所示。图2-2 设计总框图大致工作过程为:8088微处理器根据RAM中的程序不断探测启动键是否按下,若启动键按下,则产生一随机时间给8253进行延时处理,使8253完成315秒的工作。延时结束后,通过RAM的随机数产生子程序产生一随机数,以

13、决定亮8个LED中的哪个LED。此后程序对键盘进行扫描,若按错键则响蜂鸣器,若按下正确的键则将利用8255 B口所连接的四位数码管显示时间的数据。2.3.3 程序流程图及其问题 (1)程序流程图基于以上设计任务可以画出图2-3所示的简易流程图。 (2)程序流程图里的相关问题当按着流程图去试着写程序,会遇到以下几个问题:1)长时间延时为解决这个问题,应首先了解8253定时/计数器的内部结构及工作原理。Intel 8253 是NMOS工艺制成的可编程定时/计数器,最高速率为2.6MHz。它既可以用来定时,也可以用来计数。其实,定时功能也是通过计数来完成的,因为当计数器用作定时器时,其输入的时钟信号

14、为周期性脉冲信号,而对周期性信号的计数即实现了延时的目的,延时时间为输入时钟信号的周期与计数初值N的乘积。8253的编程结构框图如图2-4所示。图2-3 简易流程图图2-4 8253定时/计数器编程结构图8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,它们的结构完全相同。每个的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。每个内部有一个8位的控制寄存器,还有一个16位的初值寄存器CR、一个执行部件CE和一个输出锁存器OL。执行部件实际上是一个16位的减法

15、计数器,它的起始值就是初值寄存器的值,而初值寄存器的值是通过程序设置的。输出锁存器OL用来锁存执行部件CE的内容,从而使CPU可以对此进行读操作。因此,如果在系统时钟为1.193MHz的情况下,需要利用8253定时/计数器延时0.01秒,只需将初始值11930赋给初值寄存器,再将8253的相应CLK端接上系统时钟引脚即可。至于控制寄存器,它的格式如下表所示:表2-3 8253控制寄存器格式SC1SC0RL1RL0M2M1M0BCD各位所表示的意义简要解释如下:SC1,SC0:通道选择位。为00、01、10分别表示选择计数器0、1、2。RL1,RL0:读/写操作位。00 表示锁存数据,可随时读取

16、计数器中的计数值; 01 表示只读/写低8位,高8位自动置为0; 10表示只读/写高8位,低8位自动置为0; 11表示读/写16位数据,先低8位,后高8位。M2,M1,M0:工作方式选择位。具体选择关系如下表:表2-4 工作方式选择关系表000模式 0001模式 1X10模式 2X11模式 3100模式 4101模式 5BCD:用来设置计数值格式。为1时表示计数值为BCD码格式;为0时表示为二进制格式。另外,8253定时/计数器里各计数器都有六种工作方式,分别为方式0至方式5,在这里为方便编程先说明一下方式2。方式2又称频率发生器工作方式。当程序将工作方式控制字写入控制字寄存器时,计数器的输出

17、端OUT立即变为高电平。在写入计数初值后,计数器对输入时钟CLK计数。在计数过程中OUT 保持不变,直到计数器从初值减为1时,输出OUT将变低,再经过一个CLK周期,OUT恢复为高电平,并按已设定的计数初值重新开始计数。其时序图如下图所示:图2-5 8253方式2时序图由时序图可见,每当计数器计数完成时便在输出端输出一负脉冲。由于8253定时/计数器是16位的,而系统总线中的时钟信号只有两种:1.193M Hz和2.386MHz。这意味着单纯的16位计数器最多只能只时计时65535/1.193MS=0.0549S。那么,如何来实现长达315秒的延时呢?其实,可以通过计数器的串联来解决这个问题。

18、例如,可以将系统时钟接到CLK0上,使GATE0有效(高电平)并将OUT0输出接到CLK1上作为计数器1的计数时钟,并使GATE1为高电平。这就使得计数器0和计数器1串联在一起。可使计数器0工作在方式2或方式3,使其输出连续的脉冲;使计数器1工作在方式0。计数值方面可使计数器0为11930,计数器1为1500,这样就可使得总计数值为11930*1500,即实现了延时15秒的目的。但由于系统中计数器0和计数器1已作其它用途,故只能采用计数器2来实现长时间延时的目的。为了实现单个计数器延时长时间的目的,须想办法实现计时时间的累加。本设计采用计时器结合中断的方法来解决这个问题。即将8253的工作方式

19、设置为方式2,计数初值设为11930,此时每过0.01秒便在8253的OUT2引脚上输出一上升沿作为8259的中断请求信号,而CPU通过接收中断类型码进入中断处理子程序,并在此子程序里的对某一计数变量加1从而实现时间的累加,达到长时间延时的目的。8259A是Intel系列的可编程中断控制器。中断控制器的功能就是在有多个中断源的系统中,接收外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请求送到CPU的INTR端;当CPU响应中断并进入中断子程序的处理过程后,中断控制器仍然负责对外部中断请求的管理。8259编程结构图2-6所示。由图可见,8259A内部由两大部分组成,上半部分包括

20、中断请求寄存器IRR,优先级别器PR和中断服务寄存器ISR,它们构成8259A的中断处理部分称为处理部件。这部分的功能是接收和处理从IR1IR0引脚进入的外部中断,其工作过程体现了8259A本身的工作原理。即接收中断请求,进行中断判优,记录当前正在处理的中断优先级,实现中断嵌套,向CPU发出中断申请,当CPU响应中断时,接收CPU的两个连续中断响应信号将控制转移到中断服务程序中去。图2-6 8259A的编程结构综上所述,如果要求实现时间的累加,可以将8253定时/计数器的OUT输出端接到8259中断控制器的IRi端,并通过相应的程序代码编程实现。MOV CX,100;延时时间由CX值决定MOV

21、 AL,0B4H;初始化8253,计时0.01SOUT 43H,ALMOV AX,BX;BX存放计数初值OUT 42H,AL;先写计数值低8位MOV AL,AHOUT 42H,AL;再写计数值高8位IRQ7:DEC CX;中断处理子程序MOV AL,20H ;中断结束处理OUT 20H,ALIRET以上程序代码的第二条和第三条两条指令表示选择定时/计数器2;给计数器赋初值时先读写低8位,再读写高8位;工作方式选择方式2。第四至七行用于对初值寄存器赋初值,而后面的语句则为中断处理子程序。程序中,方式2表示每经过CLK2上的一个时钟脉冲便对计数值减一,直至计数值减至1时在OUT2输出端一负脉冲并再

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

23、3001500内的随机数。2)随机数的产生如何产生一个随机数,以便亮一个随机LED?对于这个问题,一般是通过读取微机上的时间信息来实现的。通过查阅参考文献4可知,在普通的PC机中,有一个由主板电池供电的CMOS RAM芯片,一般简称CMOS,其容量比较小,大多为128个存储单元。在这128个存储单元中,0-0DH单元是用来保存时间信息的,而且存储形式采用BCD码形式。在这若干个存储时间信息的存储单元中,当前的时间信息存放位置一般如下:秒:0分:2时:4日:7月:8年:9比如当前时间的秒数为26秒,则第0个存储单元的内容为00100110。CMOS RAM芯片内部有两个端口,端口地址为70H和7

24、1H。CPU通过这两个端口实现对CMOS RAM芯片的读写。但是,TDN86/88+实验系统中并没有由纽扣电池供电的RAM芯片,因此若系统关闭电源时,一切信息都将消失,也就是说实验系统中并不存在与普通PC机类似的系统时间存储机制。因此,需要采用其它方法来实现随机数的产生。通过查阅相关文献,在本设计中将采用以下方法来实现随机数的产生(利用此方法产生随机数的效果请参阅调试部分):首先产生一个随机的AX,再通过对N进行求余运算得到0N-1内的随机数。比如要产生一个07内的随机数,将采用以下代码完成: CALL RND_AX ;产生随机AX MOV AH,03H ;防止溢出 MOV DL,8 DIV

25、DL ;产生07之间一随机数至AH MOV RND,AH ;AX除DL,商放AL,余数放AH RND_AX PROC NEAR ;子过程,用于产生随机的AXMOV AX,0C49H IMUL SEED ADD AX,05E1H MOV SEED,AX;保存种子 PUSH CX MOV CL,8 ROR AX,CL;对AX进行移位 POP CXRND_AX ENDP其中SEED、RND是在数据段定义的变量,SEED初始化时可以任意赋值,本设计中置初值为1。此段代码最终产生一个07内的随机数至变量RND。上面所说的产生一个3001500内的随机数问题也可以类似地解决,程序中先用一个随机数子程序产生

26、100个随机数,对其求和并将所得的和存放到变量RNDSUM,则根据统计平均规律,RNDSUM约为255*100/212750,将此值作为计数器T的初始值。如此一来,欲表示一个315秒的区间,则需确定两个变量NUM1和NUM2(其中NUM1=11930*300/RNDSUM,NUM2=11930*1500/RNDSUM),这样区间(NUM1NUM2)就对应315秒。具体代码如下:MOV DX,0036H ;11930*300=36 9C78 HMOV AX,9C78HMOV BX,RNDSUM ;RNDSUM为100个RND之和DIV BXMOV NUM1,AXMOV DX,0111H ;119

27、30*1500=111 0E58 HMOV AX,0E58HDIV BXMOV NUM2,AXCALL RND_AX ;产生随机AXMOV DX,0MOV CX,NUM2SUB CX,NUM1DIV CX ;CX存放0NUM2-NUM1之间的随机数MOV CX,DXADD CX,NUM1 ;CX存放NUM1-NUM2之间的随机3)键盘扫描通常使用的键盘是矩阵结构的,如下图所示:图2-7 键盘的矩阵式结构识别键盘上的闭合键通常有两种方法:行反转法和行扫描法。行反转法的原理:行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式,程序使CPU

28、通过输出端口往各行线上全部送低电平,然后读入列线的值。如果此时有某一个键被按下,则必定会使某一列线值为零,然后,程序再对两个并行端口进行方式设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为零。这样,当一个键被按下时,必定可以读得一对唯一的行值和列值。行扫描法的原理:首先先快速检查键盘中是否有某个键已被按下,然后,再确定具体按下了哪一个键。为此,可以先使所有各行同时为低电平,再检查是否有列线也处于低电平。这时,如果列线上有一位为0,则说明必有键被按下,不过,还不能确定所闭合的键处在哪一行上,

29、于是再用扫描法来确定具体位置。具体为:先使第1行接地,其余行接高电平,然后看是否有哪条列线变成低电平。如果有某条列线为低电平,则该列与第1行相交位置上的键被按下;如果没有任何一条为低电平,遇说明第1行上的键均没有被按下。用同样的方法判别其它各行的情况,最终确定所按下的键。本键盘扫描程序将采用行扫描法来实现键盘的扫描。4)用数码管显示时间数据下图是8段共阴数码管的结构图:图2-8 数码管内部结构及外观引脚由上图可知,要想选通数码管,应将第3管脚接低电平作为选择数码管的位,而将8255 B口的PB7PB0分别接数码管的DPA作为选择数码管的段。对于数码管数据的显示,一般都是用查表指令来完成显示工作

30、的,即先把09的显示码放到一个数据表中,并将寄存器BX指向表的首地址,在AL存放数码管所要显示的数字,再利用XLAT这条换码指令即可完成换码操作。 至此,简易流程图的问题都大致解决了。考虑其它各方面因素,作出如图2-9所示的完整流程图。图2-9 完整流程图3.本设计中各芯片的工作原理及编程3.1本设计中8255A芯片的工作原理8255A是Intel系统的并行接口芯片。由于它是可编程的,可以通过软件来设置芯片的工作方式,所以,用8255A连接外部设备时,通常不需要再附加外部电路,给使用带来很大的方便。3.1.1 8255A的内部结构参阅参考书1,8255A的内部结构框图如下图所示:图3-1 82

31、55A的内部结构图8255A由以下几部分组成。1)数据端口A、B、C8255具有三个相互应独立的8位并行输入输出端口,即端口A,端口B和端口C。端口A:端口A对应1个8位数据输入器和1个8位数据输出锁存/缓冲器。端口B:端口B对应1个8位数据输入缓冲锁存器和1个8位数据输出锁存器/缓冲器。端口C:端口C对应1个8位数据输入缓冲器和1个8位数据输出锁存器/缓冲器。在使用中,端口A和端口B常常作为独立的输入端口或者输出端口,而端口C常常通过控制命令被分成2个4位端口,分别用来为端口A和端口B提供控制信号和状态信号。2)A组控制和B组控制A组控制电路控制端口A和端口C的高4位(PC7PC4)的工作方

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

33、置0控制字。(2)8255A的工作方式8255A有三种工作方式:方式0、方式1和方式2。以下介绍方式0。方式0也叫基本输入输出方式。在这种方式下,端口A和端口B可以通过方式选择规定为输入口或者输出口,端口C分为两个4位端口,高4位和低4位各为一个端口。概括地说,方式0的基本特点如下:1)任何一个端口可作为输入口,也可作为输出口,各端口之间没有规定必然的关系。2)各个端口的输入或输出,可以有16种不同的组合,所以可以适用于多种使用场合。本设计中8255A的A、B端口均采用方式0。本设计只采用方式0。3.1.3 本设计中8255A的应用编程假设用8255A的端口地址如下表所示:表3-1 8255A

34、的端口地址分配表A口60HB口61HC口62H控制口63H若有以下指令将控制字写入控制端口中:MOV AL,81HOUT 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,则只需执行以下代码:MOV AL,06HOUT 61H,AL而若要求对PC2置1以驱动蜂鸣器,则可执行以下代码:MOV AL,05HOU

35、T 63H,AL其中05H的二进制形式为00000101,最高位D70表示此控制字为C口置1/置0控制字。根据其格式,D3D2D1010表示对PC2进行操作,D00表示对PC2置1。3.2 本设计中8259A芯片的编程结构和应用编程参阅参考文献1,8259A是Intel系列的可编程中断控制器。它具有以下特点:1)1片8259A能管理8级中断;2)由于8259A是可编程的,所以使用起来非常灵活。实际系统中,可以通过编程使8259A工作在多种不同的方式。3)8259A用NMOS工艺制造,只需要一组5V电源。3.2.1 8259A的编程结构 编程结构如图3-2所示。各寄存器的工作原理表述如下:1)中

36、断请求寄存器IRR。此寄存器用来存放外部输入的中断请求信号IR7 IR0。每一位对应一个外部中断请求信号IR,当某个IR端有中断请求时,其相应位置“1”。 2)中断屏蔽寄存器IMR。IMR是一个8位寄存器,用来存放对各级中断请求的屏蔽信息,如果某一位IMR置“0”,表示对应的中断IR被允许,IMR的某一位IMR置“1”,表示对应的中断IR被屏蔽。3)中断服务寄存器ISR。ISR是8位寄存器,与8级中断IR7IR0相对应,用来记录正在处理的中断请求,如果某一级中断被响应,则ISR中的相应位置“1”。4)优先级判别器PR。PR用来管理和识别各中断请求信号的优先级别。当出现多重中断时,PR将新出现的

37、中断请求和正在被服务的中断优先级进行比较,确定新的优先级是否高于正在处理的中断级。高级中断允许中止低级中断。而8259A的下半部有7个8位寄存器。这些寄存器可分为两组:ICW1ICW4为一组,称为初始化命令字(ICW)寄存器,用来接收CPU向8259A发出的初始化命令以决定8259A的工作方式。而OCW1OCW3为一组,称为操作命令字(OCW)寄存器,用来存放CPU向8259A发出的操作命令。图3-2 8259A的编程结构3.2.2 8259A初始化流程图在8259A进入正常运行之前,必须将系统中的每一片8259A进行初始化。初始化就是将上述的初始化命令字按固定的次序写入8259A的指定端口。

38、8259A的初始化流程图如图3-3所示。图3-3 8255A的初始化流程图3.2.3 本设计中8259A的应用编程系统中的8259A的偶端口地址为20H,端口地址为21H。假设系统只有一片8259A,且系统开放IRQ7,则可用以下代码对其进行初始化:MOV AL,13H ;初始化8259OUT 20H,AL ;ICW1MOV AL,08H ;ICW2OUT 21H,ALMOV AL,09H ;ICW4OUT 21H,ALIN AL,21H ;OCW1AND AL,7FHOUT 21H,AL以上代码中,写入ICW1寄存器的数值为13H,其二进制形式为00010011。根据8259初始化命令字IC

39、W1的格式,D30表示中断请求为边沿触发方式;D1=1表示采用单片8259;D01表示采用ICW4。写入ICW2寄存器的数值为08H,其二进制形式为10000000。根据ICW2的格式及含义,表示中断类型码的前5位为10000,而后3位则由中断请求信号进入8259时的输入引脚所确定。若中断请求信号从IR7引脚输入,则中断类型码的低3位为111。写入ICW4寄存器的数值为09H,其二进制形式为10000001。根据ICW4的格式,D40表示中断嵌套方式为完全嵌套方式;D30表示8259不通过总线驱动器与数据总线相连;D10表示中断结束方式为非自动结束方式,此时需要发出一般的中断结束命令来结束中断

40、过程。IN AL,21H表示将OCW1的数值读入AL,AND AL,7FH表示对最高位清零,清零后再通过OUT 21H,AL将修改后的AL值写入OCW1。整个过程表示开放8259的IR7,允许此引脚上的中断请求。而要使得CPU进入中断处理子程序IRQ7,则应使用以下代码,以便产生中断时,CPU进行正确的跳转:PUSH DSMOV AX,0HMOV DS,AXMOV BX,003CHMOV AX,OFFSET IRQ7 ;获取IRQ7的偏移地址ADD AX,2000HMOV BX,AXMOV AX,0000HMOV BX,003EHMOV BX,AXPOP DS因为在8259A的IR7引脚产生中

41、断时,CPU通过总线获得8259A传来的中断类型码0FH(即00001 111),此时CPU将对此码进行乘4操作而获得一数值,再将以此数值为内存地址的内容读出送至CS、IP,也就是进行了跳转。以上代码就是更改了相应内存单元的内容,从而使得CPU可以进行正确的跳转而转至中断处理子程序IRQ7。进入中断处理子程序后最终需要进行中断结束处理,这时可采用以下代码:MOV AL,20HOUT 20H,AL此代码将20H写到OCW2中,其中EOI=1,R=0,SL=0,这是一个一般的中断结束命令,它使当前中断处理子程序对应的ISn位被清除,从而结束中断,使得可以再次引发IR7中断。3.3 本设计中8253

42、A芯片的工作方式和应用编程Intel 8253 是NMOS工艺制成的可编程定时/计数器,它既可以用于定时也可以用于计数,其最高速率为2.6MHz。8253内部包含三个结构完全相同但又相互独立的定时/计数器,并通过控制端口对各个定时/计数器进行操作控制。3.3.1 8253的工作方式8253作为一个可编程的定时/计数器,可以用6种模式工作,本设计中只用到方式0和方式2,由于方式2前面已经介绍,故以下只介绍方式0的工作原理。方式0 :又称计数结束产生中断工作方式。当程序将工作方式控制字写入控制字寄存器时,计数器的输出端OUT立即变为低电平。在计数初值写入该计数器后,输出仍将保持为低电平。当门控信号

43、GATE为高电平时,计数器对输入端CLK的输入脉冲开始作减一计数,当计数器从初值减为0 时,输出端OUT由低电平变为高电平,该输出信号可作为向CPU 发出的中断请求信号。时序图如下:图3-4 8253方式0时序图3.3.2 本设计中8253的应用编程假设系统中8253各计数器的端口地址如下表所示:表3-2 8253定时/计数器各端口地址计数器040H计数器141H计数器242H控制寄存器43H如果采用OPCLK=1.193MHz的系统时钟,若要求计数器0计时0.01秒,则可采用以下代码:MOV AL,0B4HOUT 43H,ALMOV AX,11930OUT 42H,ALMOV AL,AHOUT 42H,AL 其中第一、二行表示设置计数器0的工作方式为方式2,先读写低8位,再读写高8位。接着第三至六行把计数初值放至16位的初值寄存器中。这样的话每次计数完毕后都会在输出端输出一负脉冲。4.调试过程与总结4.1 程序的调试过程程序的调试是一个艰难的过程,因为程序如果隐藏着微小错误,就会使得实验结果与预

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号