测试反应时间模拟系统_第1页
测试反应时间模拟系统_第2页
测试反应时间模拟系统_第3页
测试反应时间模拟系统_第4页
测试反应时间模拟系统_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

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

2、够真实地测试出人的反应时间, 而且还可以锻炼和提高个人对外界突发事件 的处理能力。关键词: 反应时间、 8086/8088、汇编、 8255simulationsystemoftestingreactiontimeAbstractWiththerapiddevelopmentofelectronictechnology,themicro-computerhasimpactedonalmosteveryareaofhumanlifeandmakesthepeople sliveschangingrevolutionary.So,it sverynecessarytounderstandtheba

3、seworkingprincipleofmicro-computer.Computerprincipleandhowtod osomehardwareandsoftwaredevelopmentonthecomputershouldbemasteredbythepeoplethatwillw orkinthefieldofelectronicsindustry.Forthisreason,duringstudyingmicro-computertechnol ogyanditsapplication,asystemusedtotestapersonsreactiontimeisdevelope

4、d.Thesystemtakesthe8088microprocessorasacoreandcombinesIntegratedCircuitssuchas8255ProgrammablePar allelInterface,8253ProgrammableIntervalTimer,8259AProgrammableInterruptControllerand etc,whichteststhereactiontimeanddisplaysitontheLED.Thisequipmentcannotonlytesttherea ctiontimecorrectly,butalsoimpro

5、vethehandlingcapacityofsuddeneventsoftheoutsideworldb ytraining.Keywords: reactiontime;8086/8088 、 assemblelanguage 、8255目录摘要 IAbstract II目录 Ill1. 前言 12. 设计方案论证 22.1 概述 22.2 本设计使用的设备介绍 22.2.1TDN86/88+系统简介 22.3 设计原理和方法 32.3.1 设计原理 32.3.2 设计方法 42.3.3 程序流程图及其问题 43. 本设计中各芯片的工作原理及编程 133.1 本设计中8255A芯片的工作原

6、理 133.1.18255A 的内部结构 133.1.28255A 的控制字及工作方式 143.1.3 本设计中 8255A 的应用编程 143.2本设计中 8259A芯片的编程结构和应用编程 153.2.18259A 的编程结构 153.2.28259A 初始化流程图 163.2.3 本设计中 8259A的应用编程 173.3本设计中 8253A芯片的工作方式和应用编程 183.3.18253 的工作方式 183.3.2 本设计中 8253的应用编程 194. 调试过程与总结 204.1 程序的调试过程204.2 硬件的调试过程284.3 总结 29致谢 30参考资料 31附录一:测试反应时

7、间模拟系统总电路图 32附录二:测试反应时间模拟系统程序 33附录三:硬件实物图及实物与TDN86/88+系统的连接图 45/、八1. 前言近几十年来,微型计算机的应用已经全面渗透进人类生活的各个角落,大到航空航天 领域,小至嵌入式家庭用器,无处不见其踪影,无处不让人深刻感受到其对人类生活的革 命性变革。本设计是一个能测试人体反应时间的系统,该系统可以应用于体育训练、医疗 和娱乐等领域。2. 设计方案论证2.1概述本设计采用8088微处理器,结合8255A可编程并行通信接口、8259中断控制器、8253 定时/计时器以及键盘等部分外设电路,利用汇编为程序设计语言实现一个能测试人体反 应时间的模

8、拟系统。具体任务:设计一个能测试人的反应(响应)时间的仪器。按启动钮,测试开始,一旦 看到灯亮,立即按测试钮,用 4位八段码显示从看到灯亮到按下测试钮的反应时间 xx.xx 秒。具有以下功能:(1)编制一个随机数产生子程序,由随机数决定从按启动钮到四个 LED亮的时间(如在 3秒15秒之间内任意变动),使被测试者对 LED亮的时间无法预见,以确保测试结果 的可信;(2)必须在见到LED亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效;(3)反应时间显示xx.xx秒,准确到百分之一秒。修改以上设计使进一步能测试人对不同事物的反应(响应)时间。如功能为:按启 动钮,测试开始,一旦红灯亮,立即按

9、红灯测试钮,一旦绿灯亮,立即按绿测试钮, 八段码显示反应时间xx.xx秒。若按错钮,则显示出错并响“嘟”一声。要求编制二个 随机数产生子程序,一个决定从按启动钮到 LED亮的时间,另一个决定亮何种颜色灯; 同样要求在见到LED亮时按测试钮才有效。2.2本设计使用的设备介绍为研究方便,本设计采用TDN86/88+微机实验系统来辅助开发此系统,即首先将程序 在该系统上调试,调试完成后再将最终的程序加载到所设计的硬件系统上。另外,硬件方 面还需用到普通PC机一台,用来作为开发主机,以提供界面编辑、编译程序,并将程序 加载到目标系统中。2.2.1TDN86/88+ 系统简介(1)系统总线 系统总线信号

10、定义如表2-1所示。表2-18088微机系统总线定义信号线说明信号线说明XA0-XA7系统地址总线XIORI/O读(输出)信号线XA8-XA15XMER存储器读(输出)信号线XA16-XA19XMEW存储器写(输出)信号线OPCLK时钟信号线(1.193MHz)HOLD总线请求(输入)信号线PCLK时钟信号线(2.386MHz)HLDA总线请求应答(输出)信号线(2)系统内存分配情况 系统内存分配如下图所示:图2-1系统内存分配情况本设计需要用到8255、8253、8259等芯片,它们各自的端口地址如下表所示:表2-2输入/输岀接口编码表电路名称信号线寄存器编址电路名称信号线寄存器编址8253

11、I0Y20#计数器40H8255IOY3A 口60H1#计数器41HB 口61H2#计数器42HC 口62H3#计数器43H控制口63H8259I0Y1-20H-21H2.3设计原理和方法2.3.1设计原理本设计中可以划分为键盘扫描和键命令的识别和处理部分。从宏观上看,这两部分程 序应当不停地并行、地在执行,这样才能保证既使LED的数字显示稳定,又不遗漏对闭合键的识别和处理。2.3.2设计方法设计中采用的方案是将键盘扫描程序、键命令的识别和处理程序及LED显示程序等作为主程序,而将显示程序、延时程序以及随机数产生程序等作为子程序调用。在主程序中, 对8255A 8259进行初始化,接着检测启动

12、键的信号,在启动信号到来后产生随机数,再 初始化8253,使它工作在方式2,每10ms产生一上升沿作为中断请求信号给 8259,使得 程序每10ms便进入中断处理子程序,从而实现时间上的累加。设计的总框图如下图所示。图2-2设计总框图大致工作过程为:8088微处理器根据RAM中的程序不断探测启动键是否按下, 若启动 键按下,则产生一随机时间给 8253进行延时处理,使8253完成315秒的工作。延时结 束后,通过RAM的随机数产生子程序产生一随机数,以决定亮 8个LED中的哪个LED此 后程序对键盘进行扫描,若按错键则响蜂鸣器,若按下正确的键则将利用8255B 口所连接的四位数码管显示时间的数

13、据。2.3.3程序流程图及其问题(1)程序流程图基于以上设计任务可以画出图2-3所示的简易流程图。程序流程图里的相关问题当按着流程图去试着写程序,会遇到以下几个问题:1) 长时间延时为解决这个问题,应首先了解8253定时/计数器的内部结构及工作原理。Intel8253是NMO工艺制成的可编程定时/计数器,最高速率为2.6MHz它既可以用 来定时,也可以用来计数。其实,定时功能也是通过计数来完成的,因为当计数器用作定 时器时,其输入的时钟信号为周期性脉冲信号,而对周期性信号的计数即实现了延时的目 的,延时时间为输入时钟信号的周期与计数初值N的乘积。8253的编程结构框图如图2-4所示。图2-3简

14、易流程图图2-48253定时/计数器编程结构图8253内部有三个计数器,分别称为计数器 0、计数器1和计数器2,它们的结构完全 相同。每个的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。每个通过三个引脚和外部联系,一个为时钟输入端CLK 一个为门控信号输入端 GATE另一个为输出端OUT每个内部有一个8位的控制寄存器,还有一个16位的初值寄存器CR 一个执行部件CE和一个输出锁存器OL。执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初值寄存器的值是通过程序设置的。输出锁存器OL用来锁存执行部件CE的内容,从而使CPU可以对此进行读操作。因此,如果

15、在系统时钟为1.193MHZ勺情况下,需要利用8253定时/计数器延时0.01秒, 只需将初始值11930赋给初值寄存器,再将8253的相应CLK端接上系统时钟引脚即可。至于控制寄存器,它的格式如下表所示:表2-38253控制寄存器格式SC1SC0RL1RL0M2M1M0BCD各位所表示的意义简要解释如下: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

16、,M0工作方式选择位。具体选择关系如下表:表2-4工作方式选择关系表000模式0001模式1X10模式2X11模式3100模式4101模式5BCD用来设置计数值格式。为1时表示计数值为BCD码格式;为0时表示为二进制格式另外, 8253定时/ 计数器里各计数器都有六种工作方式,分别为方式 0至方式5,在这 里为方便编程先说明一下方式 2。方式 2又称频率发生器工作方式。当程序将工作方式控制 字写入控制字寄存器时,计数器的输出端0U立即变为高电平。在写入计数初值后,计数器 对输入时钟clK数。在计数过程中ou保持不变,直到计数器从初值减为1时,输出out!变 低,再经过一个CLK周期,OUT恢复

17、为高电平,并按已设定的计数初值重新开始计数。其时序 图如下图所示:图 2-58253 方式 2 时序图由时序图可见,每当计数器计数完成时便在输出端输出一负脉冲。由于8253定时/计数器是16位的,而系统总线中的时钟信号只有两种:1.193MHz和 2.386MHz这意味着单纯的16位计数器最多只能只时计时 65535/1.193MS=0.0549S。那么, 如何来实现长达315秒的延时呢?其实,可以通过计数器的串联来解决这个问题。 例如, 可以将系统时钟接到CLK0上,使GATE有效(高电平)并将OUT0俞出接到CLK1上作为计数 器1的计数时钟,并使GATE伪高电平。这就使得计数器0和计数器

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

19、9的中断请求信号,而CPU通过接收中断类型码进入中断处理子程序,并在此子程序里的对某一计数变量加 1 从而实现时间的累加,达到长时间延时的目的。8259A是In tel系列的可编程中断控制器。中断控制器的功能就是在有多个中断源的 系统中,接收外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请 求送到CPU勺INTR端;当CPLP向应中断并进入中断子程序的处理过程后,中断控制器仍然负责对外部中断请求的管理。8259编程结构图 2-6 所示。由图可见,8259A内部由两大部分组成,上半部分包括中断请求寄存器IRR,优先级别器PR和中断服务寄存器ISR,它们构成8259A的中断处理部

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

21、VAX,BX ;BX 存放计数初值OUT42H,AL ; 先写计数值低 8位MOVAL,AHOUT42H,AL ; 再写计数值高 8位IRQ7:DECCX ;中断处理子程序MOVAL,20H ; 中断结束处理OUT20H,ALIRET以上程序代码的第二条和第三条两条指令表示选择定时/计数器 2;给计数器赋初值时先读写低 8 位,再读写高 8 位;工作方式选择方式 2。第四至七行用于对初值寄存器赋初 值,而后面的语句则为中断处理子程序。程序中,方式2表示每经过CLK2上的一个时钟脉冲便对计数值减一,直至计数值减至 1时在OUT21出端一负脉冲并再次实现初值的自 动重装工作。而输出的负脉冲将作为

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

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

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

25、L,8DIVDL;产生 07之间一随机数至 AHMOVRND,AH ;AX 除 DL,商放 AL,余数放 AHRND_AXPROCNEAR ; 子过程,用于产生随机的 AXMOVAX,0C49HIMULSEEDADDAX,05E1HMOVSEED,AX ; 保存种子PUSHCXMOVCL,8RORAX,CL;对AX进行移位POPCXRND_AXENDP其中SEED RND是在数据段定义的变量,SEED初始化时可以任意赋值,本设计中置初 值为 1。此段代码最终产生一个 07内的随机数至变量 RND。上面所说的产生一个 3001500内的随机数问题也可以类似地解决,程序中先用一个 随机数子程序产生

26、100个随机数,对其求和并将所得的和存放到变量 RNDSUM则根据统计 平均规律,RNDSU约为255*100/2 = 12750,将此值作为计数器 T的初始值。如此一来, 欲表示一个 315秒的区间,则需确定两个变量 NUM1和 NUM2(其中 NUM仁 11930*300/RNDSUINUM2=11930*1500/RNDSU,M这样区间(NUMNUM2就对应 3 15 秒。具体代码如下:MOVDX,0036H ;11930*300=369C78HMOVAX,9C78HMOVBX,RNDSU(RNDSU为 100个 RND之和DIVBXMOVNUM1,AXMOVDX,0111H;11930

27、*1500=1110E58HMOVAX,0E58HDIVBXMOVNUM2,AXCALLRND_AX ; 产生随机 AXMOVDX,0MOVCX,NUM2SUBCX,NUM1DIVCX;CX存放0NUM2-NUM1间的随机数MOVCX,DXADDCX,NUMCX存放NUM1-NUM之间的随机3)键盘扫描通常使用的键盘是矩阵结构的,如下图所示:图 2-7 键盘的矩阵式结构 识别键盘上的闭合键通常有两种方法:行反转法和行扫描法。 行反转法的原理:行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输 出方式,将列线也接到一个并行口,先让它工作在输入方式,程序使CPU通过输出端口往各行线上全部送

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

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

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

31、 1 ,8255A 的内部结构框图如下图所示:图 3-18255A 的内部结构图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提

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

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

34、A的A B端口均采用方式0。本设计只米用方式0。3.1.3本设计中8255A的应用编程假设用8255A的端口地址如下表所示:表3-18255A的端口地址分配表A 口60HB 口61HC 口62H控制口63H若有以下指令将控制字写入控制端口中:MOVAL,81HOUT63H,AL,最高位D7= 1表示此控制字为方式选择控制字。根据 8255方式选择控制字格式, 则D6DQ 00表示A 口工作于方式0, D4= 0表示A 口工作于输出状态,D3= 0表示C 口高 4位为输出口,D2= 0表示B 口工作于方式0,D1= 0表示B 口为输出口,D0= 1表示C口 低4位为输入口。此后若要求B 口输出1

35、的显示码06H,则只需执行以下代码:MOVAL,06HOUT61H,AL而若要求对PC2置1以驱动蜂鸣器,则可执行以下代码:MOVAL,05HOUT63H,AL其中05H的二进制形式为00000101,最高位D7= 0表示此控制字为C 口置1/置0控制 字。根据其格式,D3D2D伞010表示对PC2进行操作,D0= 0表示对PC2置1。3.2本设计中8259A芯片的编程结构和应用编程参阅参考文献1,8259A是In tel系列的可编程中断控制器。它具有以下特点:1)1片8259A能管理8级中断;2)由于8259A是可编程的,所以使用起来非常灵活。实际系统中,可以通过编程使 8259A工作在多种

36、不同的方式。3)8259A用NMO工艺制造,只需要一组5V电源。3.2.18259A的编程结构编程结构如图3-2所示。各寄存器的工作原理表述如下:1)中断请求寄存器IRR。此寄存器用来存放外部输入的中断请求信号IR7IR0。每 一位对应一个外部中断请求信号IR,当某个IR端有中断请求时,其相应位置 “T o 2)中断屏蔽寄存器IMR。IMR是一个8位寄存器,用来存放对各级中断请求的屏蔽信息, 如果某一位IMR置“0”,表示对应的中断IR被允许,IMR的某一位IMR置“T,表示对 应的中断 IR 被屏蔽。3)中断服务寄存器ISRo ISR是8位寄存器,与8级中断IR7IR0相对应,用来记录正在处

37、理的中断请求,如果某一级中断被响应,则ISR中的相应位置“ 1” o4)优先级判别器PR PR用来管理和识别各中断请求信号的优先级别。当出现多重中 断时,PR将新出现的中断请求和正在被服务的中断优先级进行比较,确定新的优先级是否 高于正在处理的中断级。高级中断允许中止低级中断。而8259A的下半部有7个8位寄存器。这些寄存器可分为两组:ICW1ICW为一组, 称为初始化命令字(ICW)寄存器,用来接收CPU向 8259A发出的初始化命令以决定8259A的 工作方式。而OCW1OC为一组,称为操作命令字(OCW寄存器,用来存放CPU向 8259A发 出的操作命令。图 3-28259A 的编程结构

38、3.2.28259A 初始化流程图在8259A进入正常运行之前,必须将系统中的每一片 8259A进行初始化。初始化就是 将上述的初始化命令字按固定的次序写入 8259A的指定端口。8259A的初始化流程图如图 3-3所示。图 3-38255A 的初始化流程图3.2.3本设计中8259A的应用编程系统中的8259A的偶端口地址为20H,端口地址为21H假设系统只有一片8259A,且 系统开放IRQ7,则可用以下代码对其进行初始化:MOVAL,13H初始化 8259OUT20H,AL;ICW1MOVAL,08H;ICW2OUT21H,ALMOVAL,09H;ICW4OUT21H,ALINAL,21

39、H;OCW1ANDAL,7FHOUT21H,AL以上代码中,写入ICW1寄存器的数值为13H,其二进制形式为00010011。根据8259 初始化命令字ICW1的格式,D3= 0表示中断请求为边沿触发方式;D1=1表示采用单片8259; D0= 1表示采用ICW4写入ICW2寄若中断请求信号从IR7引脚输入,则中断类型码的低3位为111。写入ICW4寄D仁0表示中断结束方式为非自动结束方式,此时需要发出一般的中断 结束命令来结束中断过程。INAL,21H表示将OCW的数值读入AL, ANDAL 7FH表示对最高位清零,清零后再通 过OUT21H AL将修改后的AL值写入OCW。整个过程表示开放

40、8259的IR7,允许此引脚 上的中断请求。而要使得CPU进入中断处理子程序IRQ7,则应使用以下代码,以便产生中断时,CPU 进行正确的跳转:PUSHDSMOVAX,0HMOVDS,AXMOVBX,003CHMOVAXQFFSETIRQ获取IRQ7的偏移地址ADDAX,2000HMOVBX,AXMOVAX,0000HMOVBX,003EHMOVBX,AXPOPDS因为在8259A的IR7引脚产生中断时,CPU通过总线获得8259A传来的中断类型码 0FH(即00001111),此时CPU将对此码进行乘4操作而获得一数值,再将以此数值为内存 地址的内容读出送至CS IP,也就是进行了跳转。以上

41、代码就是更改了相应内存单元的内 容,从而使得CPU可以进行正确的跳转而转至中断处理子程序 IRQ7。进入中断处理子程序后最终需要进行中断结束处理,这时可采用以下代码:MOVAL,20HOUT20H,AL此代码将20H写到OCW中,其中EOI=1,R=0, SL=0,这是一个一般的中断结束命令, 它使当前中断处理子程序对应的 ISn 位被清除,从而结束中断,使得可以再次引发 IR7 中 断。3.3 本设计中 8253A 芯片的工作方式和应用编程Intel8253是NMO工艺制成的可编程定时/计数器,它既可以用于定时也可以用于计 数,其最高速率为2.6MHz, 8253内部包含三个结构完全相同但又

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

43、时序图如下:图3-48253方式0时序图3.3.2本设计中8253的应用编程假设系统中8253各计数器的端口地址如下表所示:表3-28253定时/计数器各端口地址计数器040H计数器141H计数器242H控制寄存器43H如果采用OPCLK=1.193MH的系统时钟,若要求计数器0计时0.01秒,则可采用以下代码:MOVAL,0B4HOUT43H,ALMOVAX,11930OUT42H,AL MOVAL,AHOUT42H,AL其中第一、二行表示设置计数器 0的工作方式为方式2,先读写低8位,再读写高8 位。接着第三至六行把计数初值放至16位的初值寄存器中。这样的话每次计数完毕后都会在输出端输出一

44、负脉冲。4. 调试过程与总结4.1 程序的调试过程程序的调试是一个艰难的过程,因为程序如果隐藏着微小错误,就会使得实验结果与 预期结果大相径庭,甚至程序运行不了。而要挖掘出这些深藏着的错误,必须花费足够多 的时间与耐心,对每一程序模块、模块与模块间的联系 ( 比如参数传递问题 ) 、甚至每一语 句进行再三的思考。(1) 芯片的测试为了测试8253定时/计数器与8259A中断控制器共同作用后的工作情况,可将 8253 的0UT2连接到8259A的IR7端,具体连接情况如下:8253-GATE2+5V8253-CLK2KK18253-OUT28259A-IR7此时,将以下代码编译加载到系统中测试:

45、C0DESEGMENTASSUMECS:C0DESTART:PUSHDSM0VAX,0HM0VDS,AX M0VBX,003CHM0VAX,0FFSETIRQ7ADDAX,2000HM0VBX,AXM0VAX,0000HM0VBX,003EHM0VBX,AXP0PDS; 修改中断向量; 初始化 8259M0VAL,13H0UT20H,ALM0VAL,08H0UT21H,ALM0VAL,09H0UT21H,ALINAL,21HANDAL,7FH0UT21H,AL;ICW1;ICW2;ICW4;0CW1 开放 IRQ7; 初始化 8253MOVAL,90HOUT43H,ALMOVAL,5OUT42

46、H,ALSTIHERE:JMPHEREIRQ7:MOVAH,01HMOVAL,4DHINT10HMOVAL,20HOUT20H,ALMOVAL,90HOUT43H,ALMOVAL,5HOUT42H,ALIRETCODEENDSENDSTART; 控制字写入控制寄存器;对T2赋初值” 5”; 开中断; 等待中断; 显示字母 ” M”; 清除中断标志; 重新对计数器赋初值; 控制字写入控制寄存器; 对 T2 赋初值” 5”程序加载运行后,每按一次启动键KK1,便产生一个正脉冲作为8253计数器T2的CLK 时钟信号。程序中对计数器T2赋予初值” 5”,当按下6次启动键KK1后在显示终端显示 一个字

47、母” M 。之所以要按下6次而不是5次启动键,是因为计数器T2采用的是方式0, 该方式规定写入计数初值后需等待一个时钟脉冲计数初值才会送到计数执行部件进行减 一操作,因此需按 6下启动键 KK1。通过以上程序,确定8253定时/计数器及8259A中断控制器工作正常。(2) 本系统在程序调试过程中所遇到的几个问题1)随机数的产生刚开始时,本设计想利用读系统时钟的方法来产生随机数。 使用的功能调用为: ah=02, intlah。执行后CH:CL=分;DH秒(均为BCD格式)。比如可以通过以下程序读取系统时 钟,这在普通PC机上可以得到正确结果:DATASEGMENTHOURDB?MINDB?SE

48、CDB?PCSECDB?;变量HOU用于存放时;变量MIN用于存放分;变量SEC用于存放秒DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXSTIMOVAH,02H执行INT1AH功能调用 INT1AHmovhour,CH功能调用所得到的数据赋值给各变量MOVMIN,CLMOVSEC,DHMOVPCSEC,DLMOVAH,4CHINT21HCODEENDSENDSTART比如当前时 23:44:09 秒,则执行以上程序后,会得到数据段内的数据为:2344090000000000-0000000000000000程序的

49、执行过程为,在执行intlah功能调用后,ch=00100011B(23的BCD码),将其赋值 给变量hour后,hour便以23H的形式存放在内存中。但将此程序放至TDN86/88系统中运行,就得到不一样的结果了。我试验过两次,一 次是系统刚上电后运行此程序, 此时变量得到的结果为 :hour=0CCH, min=0CCH, sec=0CCH。 另一次是先运行其它程序,然后再运行此程序,此时得到的结果为 hour=18H, min=86H, sec=00H。无论哪一种情况,都不能得到正确的结果。为此,此程序采用了其它方法来实 现随机数的产生,也就是第 2 章所述的方法。但这种方法生成随机的效

50、果怎样呢?可以用 以下程序来统计:DATASEGMENTSEEDDW1; 定义种子IDB?;定义一变量,用来存放07以判断所产生的随机数的值XTABLEDDROuTINE0 ; 定义表存放各跳转路径的段地址和偏移地址DDROuTINE1DDROuTINE2DDROuTINE3DDROuTINE4DDROuTINE5DDROuTINE6DDROuTINE7;定义变量统计07的出现次数TIMES0DB0TIMES1DB0TIMES2DB0TIMES3DB0TIMES4DB0TIMES5DB0TIMES6DB0TIMES7DB0RNDBUFDB100DUP(?)DATAENDS * JSTACKSE

51、GMENTSTKBUFDB80DUP(?)STACKENDS * JCODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVBX,0MOVSI,OFFSETRNDBUFMOVCX,100 ; 产生 100 个 07 的随机数 RNDGNT:MOVAX,0C49HIMULSEEDADDAX,05E1HMOVSEED,AXPUSHCXMOVCL,8RORAX,CLMOVDX,0MOVCX,8DIVCX; 除数为 8,余数为 07POPCXMOVSI,DLMOVDI,0MOVI,0KKK:CMPDL,I ; 利用变量 I 判断产生的随机数

52、的值JNZNOT_YETCALLXTABLEDI ; 判断出随机数的值后调用子程序对相应的统计变量加 1 JMPNEXTRNDNOT_YET:ADDDI,TYPEXTABLEINCIJMPKKKNEXTRND:INCSILOOPRNDGNTJMPCODEENDROUTINE0:INCTIMES0 ; 对相应的统计变量加 1 RETROUTINE1:INCTIMES1RETROUTINE2:INCTIMES2RETROUTINE3:INCTIMES3RETROUTINE4:INCTIMES4RETROUTINE5:INCTIMES5RETROUTINE6:INCTIMES6RETROUTINE7

53、:INCTIMES7RETCODEEND:MOVAH,4CHINT21HCODEENDSENDSTART将以上源程序保存为100rnd2.asm,并编译链接后用DEBU程序调试,具体过程如下:F:Xmasmdcbug.exeBJLBP=0008SI=0008 DI=0000AX-tES1 B8690BCX=015BSS=0B69NOUCS=0B77AX,IP=0000NVUP ElPL NZ NA PONCCX=015BSP-0000BP=0000SI=0008 DI=0000DS -0B55ES=0B5$SS=0B69CS=0B77IP=0003NVUP ElPLNZ 舶 PONC-tBED

54、SNOUDS,AXBX-0000CX=015BBP=0000SI=0008 DI=0000DS -0B69ES=0B5$SS=0B69CS=0B77IP=0005NUUP ElPLNZ 舶 P0NCBB000BNOUBX,0000图4-1D0S下的调试图1由图可见,执行两步单步运行后,数据段段地址变为 DM 0B69,根据数据段变量的定 义情况知道从0B69:0023开始存放100个07的随机数,利用G命令全速运行程序后再 用D命令查看得到以下结果:图4-2DOS下的调试图2由上图可见,产生的100个随机数从第1行的倒数第五个数字02开始至倒数第二行 的倒数第二个数字02结束;而第一行的第四个数字 0E到第一行的倒数第六个数字 09为 0007在这100个随机数中的统计次数。为了明确,在此重新写一次各随机数的统计次数:表4-1随机数次数统计表随机数0001020304050607次数(十六进制)0E0E0C0C0D0E0C09次数(十进制)1414121213141209可见,用上述方法来产生随机数是可行的2)响蜂鸣器设计要求当按错键时响蜂鸣器一声。因为系统采用的是有源蜂鸣器,因此,当按错按 键时只需把蜂鸣器接高电平即可。但是在调试的实际情况出现了一些问题,因为

温馨提示

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

评论

0/150

提交评论