测试反应时间模拟系统完整版.docx
- 文档编号:16484874
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:53
- 大小:115.53KB
测试反应时间模拟系统完整版.docx
《测试反应时间模拟系统完整版.docx》由会员分享,可在线阅读,更多相关《测试反应时间模拟系统完整版.docx(53页珍藏版)》请在冰点文库上搜索。
测试反应时间模拟系统完整版
HUAsystemofficeroom【HUA16H-TTMS2A-HUAS8Q8-HUAH1688】
测试反应时间模拟系统
测试反应时间模拟系统
摘要
随着电子技术的飞速发展,微型计算机已经全面渗透了人类生活各领域,并革命性地改变着人们的生活。
因此,可以说了解微型计算机的基本工作原理对于每个人都十分必要。
而对于即将从事电子行业的工作者来说,熟悉掌握微机原理并在其上进行软硬件的开发设计则是一项必须掌握的基本技能。
为此,在学习微型计算机技术以及其应用的过程中,我设计了一个能测试人体反应时间的模拟系统。
该系统以8088微处理器为核心,结合8255可编程并行通信接口、8253可编程定时/计数器、8259中断控制器等芯片以及LED等辅助电路,来测试人的反应时间,并将其反映在数码管上。
通过此仪器不仅能够真实地测试出人的反应时间,而且还可以锻炼和提高个人对外界突发事件的处理能力。
关键词:
反应时间、8086/8088、汇编、8255
simulationsystemoftestingreactiontime
Abstract
Withtherapiddevelopmentofelectronictechnology,themicro-computerhasimpactedonalmosteveryareaofhumanlifeandmakesthepeople’sliveschangingrevolutionary.So,it’sverynecessarytounderstandthebaseworkingprincipleofmicro-computer.Computerprincipleandhowtodosomehardwareandsoftwaredevelopmentonthecomputershouldbemasteredbythepeoplethatwillworkinthefieldofelectronicsindustry.Forthisreason,duringstudyingmicro-computertechnologyanditsapplication,asystemusedtotestaperson’sreactiontimeisdeveloped.Thesystemtakesthe8088microprocessorasacoreandcombinesIntegratedCircuitssuchas8255ProgrammableParallelInterface,8253ProgrammableIntervalTimer,8259AProgrammableInterruptControllerandetc,whichteststhereactiontimeanddisplaysitontheLED.Thisequipmentcannotonlytestthereactiontimecorrectly,butalsoimprovethehandlingcapacityofsuddeneventsoftheoutsideworldbytraining.
Keywords:
reactiontime;8086/8088、assemblelanguage、8255
摘要………………………………………………………………………………………………I
Abstract………………………………………………………………………………………II
目录……………………………………………………………………………………………III
1.前言……………………………………………………………………………………………1
2.设计方案论证…………………………………………………………………………………2
2.1概述………………………………………………………………………………………2
2.2本设计使用的设备介绍…………………………………………………………………2
2.2.1TDN86/88+系统简介…………………………………………………………………2
2.3设计原理和方法…………………………………………………………………………3
2.3.1设计原理……………………………………………………………………………3
2.3.2设计方法……………………………………………………………………………4
2.3.3程序流程图及其问题………………………………………………………………4
3.本设计中各芯片的工作原理及编程………………………………………………………13
3.1本设计中8255A芯片的工作原理……………………………………………………13
3.1.18255A的内部结构…………………………………………………………………13
3.1.28255A的控制字及工作方式………………………………………………………14
3.1.3本设计中8255A的应用编程………………………………………………………14
3.2本设计中8259A芯片的编程结构和应用编程…………………………………………15
3.2.18259A的编程结构…………………………………………………………………15
3.2.28259A初始化流程图………………………………………………………………16
3.2.3本设计中8259A的应用编程………………………………………………………17
3.3本设计中8253A芯片的工作方式和应用编程…………………………………………18
3.3.18253的工作方式……………………………………………………………………18
3.3.2本设计中8253的应用编程………………………………………………………19
4.调试过程与总结……………………………………………………………………………20
4.1程序的调试过程………………………………………………………………………20
4.2硬件的调试过程………………………………………………………………………28
4.3总结……………………………………………………………………………………29
致谢……………………………………………………………………………………………30
参考资料………………………………………………………………………………………31
附录一:
测试反应时间模拟系统总电路图……………………………………………………32
附录二:
测试反应时间模拟系统程序…………………………………………………………33
附录三:
硬件实物图及实物与TDN86/88+系统的连接图……………………………………45
1.前言
近几十年来,微型计算机的应用已经全面渗透进人类生活的各个角落,大到航空航天领域,小至嵌入式家庭用器,无处不见其踪影,无处不让人深刻感受到其对人类生活的革命性变革。
本设计是一个能测试人体反应时间的系统,该系统可以应用于体育训练、医疗和娱乐等领域。
2.设计方案论证
2.1概述
本设计采用8088微处理器,结合8255A可编程并行通信接口、8259中断控制器、8253定时/计时器以及键盘等部分外设电路,利用汇编为程序设计语言实现一个能测试人体反应时间的模拟系统。
具体任务:
设计一个能测试人的反应(响应)时间的仪器。
按启动钮,测试开始,一旦看到灯亮,立即按测试钮,用4位八段码显示从看到灯亮到按下测试钮的反应时间xx.xx秒。
具有以下功能:
(1)编制一个随机数产生子程序,由随机数决定从按启动钮到四个LED亮的时间(如在3秒~15秒之间内任意变动),使被测试者对LED亮的时间无法预见,以确保测试结果的可信;
(2)必须在见到LED亮后按测试钮才有效,即一直按着按钮或提前按下按钮无效;
(3)反应时间显示xx.xx秒,准确到百分之一秒。
(4)修改以上设计使进一步能测试人对不同事物的反应(响应)时间。
如功能为:
按启动钮,测试开始,一旦红灯亮,立即按红灯测试钮,一旦绿灯亮,立即按绿测试钮,八段码显示反应时间xx.xx秒。
若按错钮,则显示出错并响“嘟”一声。
要求编制二个随机数产生子程序,一个决定从按启动钮到LED亮的时间,另一个决定亮何种颜色灯;同样要求在见到LED亮时按测试钮才有效。
2.2本设计使用的设备介绍
为研究方便,本设计采用TDN86/88+微机实验系统来辅助开发此系统,即首先将程序在该系统上调试,调试完成后再将最终的程序加载到所设计的硬件系统上。
另外,硬件方面还需用到普通PC机一台,用来作为开发主机,以提供界面编辑、编译程序,并将程序加载到目标系统中。
2.2.1TDN86/88+系统简介
(1)系统总线
系统总线信号定义如表2-1所示。
表2-18088微机系统总线定义
信号线
说明
信号线
说明
XA0-XA7
系统地址总线
XIOR
I/O读(输出)信号线
XA8-XA15
XMER
存储器读(输出)信号线
XA16-XA19
XMEW
存储器写(输出)信号线
OPCLK
时钟信号线(1.193MHz)
HOLD
总线请求(输入)信号线
PCLK
时钟信号线(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设计原理和方法
2.3.1设计原理
本设计中可以划分为键盘扫描和键命令的识别和处理部分。
从宏观上看,这两部分程序应当不停地并行、地在执行,这样才能保证既使LED的数字显示稳定,又不遗漏对闭合键的识别和处理。
2.3.2设计方法
设计中采用的方案是将键盘扫描程序、键命令的识别和处理程序及LED显示程序等作为主程序,而将显示程序、延时程序以及随机数产生程序等作为子程序调用。
在主程序中,对8255A、8259进行初始化,接着检测启动键的信号,在启动信号到来后产生随机数,再初始化8253,使它工作在方式2,每10ms产生一上升沿作为中断请求信号给8259,使得程序每10ms便进入中断处理子程序,从而实现时间上的累加。
设计的总框图如下图所示。
图2-2设计总框图
大致工作过程为:
8088微处理器根据RAM中的程序不断探测启动键是否按下,若启动键按下,则产生一随机时间给8253进行延时处理,使8253完成3~15秒的工作。
延时结束后,通过RAM的随机数产生子程序产生一随机数,以决定亮8个LED中的哪个LED。
此后程序对键盘进行扫描,若按错键则响蜂鸣器,若按下正确的键则将利用8255B口所连接的四位数码管显示时间的数据。
2.3.3程序流程图及其问题
(1)程序流程图
基于以上设计任务可以画出图2-3所示的简易流程图。
(2)程序流程图里的相关问题
当按着流程图去试着写程序,会遇到以下几个问题:
1)长时间延时
为解决这个问题,应首先了解8253定时/计数器的内部结构及工作原理。
Intel8253是NMOS工艺制成的可编程定时/计数器,最高速率为2.6MHz。
它既可以用来定时,也可以用来计数。
其实,定时功能也是通过计数来完成的,因为当计数器用作定时器时,其输入的时钟信号为周期性脉冲信号,而对周期性信号的计数即实现了延时的目的,延时时间为输入时钟信号的周期与计数初值N的乘积。
8253的编程结构框图如图2-4所示。
图2-3简易流程图
图2-48253定时/计数器编程结构图
8253内部有三个计数器,分别称为计数器0、计数器1和计数器2,它们的结构完全相同。
每个的输入和输出都决定于设置在控制寄存器中的控制字,互相之间工作完全独立。
每个通过三个引脚和外部联系,一个为时钟输入端CLK,一个为门控信号输入端GATE,另一个为输出端OUT。
每个内部有一个8位的控制寄存器,还有一个16位的初值寄存器CR、一个执行部件CE和一个输出锁存器OL。
执行部件实际上是一个16位的减法计数器,它的起始值就是初值寄存器的值,而初值寄存器的值是通过程序设置的。
输出锁存器OL用来锁存执行部件CE的内容,从而使CPU可以对此进行读操作。
因此,如果在系统时钟为1.193MHz的情况下,需要利用8253定时/计数器延时0.01秒,只需将初始值11930赋给初值寄存器,再将8253的相应CLK端接上系统时钟引脚即可。
至于控制寄存器,它的格式如下表所示:
表2-38253控制寄存器格式
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:
工作方式选择位。
具体选择关系如下表:
表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保持不变,直到计数器从初值减为1时,输出OUT将变低,再经过一个CLK周期,OUT恢复为高电平,并按已设定的计数初值重新开始计数。
其时序图如下图所示:
图2-58253方式2时序图
由时序图可见,每当计数器计数完成时便在输出端输出一负脉冲。
由于8253定时/计数器是16位的,而系统总线中的时钟信号只有两种:
1.193MHz和2.386MHz。
这意味着单纯的16位计数器最多只能只时计时65535/1.193MS=0.0549S。
那么,如何来实现长达3~15秒的延时呢?
其实,可以通过计数器的串联来解决这个问题。
例如,可以将系统时钟接到CLK0上,使GATE0有效(高电平)并将OUT0输出接到CLK1上作为计数器1的计数时钟,并使GATE1为高电平。
这就使得计数器0和计数器1串联在一起。
可使计数器0工作在方式2或方式3,使其输出连续的脉冲;使计数器1工作在方式0。
计数值方面可使计数器0为11930,计数器1为1500,这样就可使得总计数值为11930*1500,即实现了延时15秒的目的。
但由于系统中计数器0和计数器1已作其它用途,故只能采用计数器2来实现长时间延时的目的。
为了实现单个计数器延时长时间的目的,须想办法实现计时时间的累加。
本设计采用计时器结合中断的方法来解决这个问题。
即将8253的工作方式设置为方式2,计数初值设为11930,此时每过0.01秒便在8253的OUT2引脚上输出一上升沿作为8259的中断请求信号,而CPU通过接收中断类型码进入中断处理子程序,并在此子程序里的对某一计数变量加1从而实现时间的累加,达到长时间延时的目的。
8259A是Intel系列的可编程中断控制器。
中断控制器的功能就是在有多个中断源的系统中,接收外部的中断请求,并进行判断,选中当前优先级最高的中断请求,再将此请求送到CPU的INTR端;当CPU响应中断并进入中断子程序的处理过程后,中断控制器仍然负责对外部中断请求的管理。
8259编程结构图2-6所示。
由图可见,8259A内部由两大部分组成,上半部分包括中断请求寄存器IRR,优先级别器PR和中断服务寄存器ISR,它们构成8259A的中断处理部分称为处理部件。
这部分的功能是接收和处理从IR1~IR0引脚进入的外部中断,其工作过程体现了8259A本身的工作原理。
即接收中断请求,进行中断判优,记录当前正在处理的中断优先级,实现中断嵌套,向CPU发出中断申请,当CPU响应中断时,接收CPU的两个连续中断响应信号将控制转移到中断服务程序中去。
图2-68259A的编程结构
综上所述,如果要求实现时间的累加,可以将8253定时/计数器的OUT输出端接到8259中断控制器的IRi端,并通过相应的程序代码编程实现。
MOVCX,100;延时时间由CX值决定
MOVAL,0B4H;初始化8253,计时0.01S
OUT43H,AL
MOVAX,BX;BX存放计数初值
OUT42H,AL;先写计数值低8位
MOVAL,AH
OUT42H,AL;再写计数值高8位
…
IRQ7:
DECCX;中断处理子程序
MOVAL,20H;中断结束处理
OUT20H,AL
IRET
以上程序代码的第二条和第三条两条指令表示选择定时/计数器2;给计数器赋初值时先读写低8位,再读写高8位;工作方式选择方式2。
第四至七行用于对初值寄存器赋初值,而后面的语句则为中断处理子程序。
程序中,方式2表示每经过CLK2上的一个时钟脉冲便对计数值减一,直至计数值减至1时在OUT2输出端一负脉冲并再次实现初值的自动重装工作。
而输出的负脉冲将作为8259的中断请求信号从引脚IR7引入,若此时8259未屏蔽该引脚上的中断请求,则8259将向CPU发出中断请求。
此后程序进入中断处理子程序进行中断处理。
由于每次计数结束时便进入中断处理过程中对CX减一,相当于实现了统计负脉冲个数的功能,因而实现了时间的累加。
解决了长时间延时的问题后,接着考虑如何延时3~15秒内的一个随机时间。
假设计时器T位数足够多,可以赋任意大的初值,那么对于1.193MHz的系统时钟来说,要延时3秒,则应对其赋的初值为11930*300;要延时15秒,则应赋的初值为11930*1500。
所以,以上问题实际上要解决的是如何产生一个300~1500内的随机数。
2)随机数的产生
如何产生一个随机数,以便亮一个随机LED
对于这个问题,一般是通过读取微机上的时间信息来实现的。
通过查阅参考文献[4]可知,在普通的PC机中,有一个由主板电池供电的CMOSRAM芯片,一般简称CMOS,其容量比较小,大多为128个存储单元。
在这128个存储单元中,0-0DH单元是用来保存时间信息的,而且存储形式采用BCD码形式。
在这若干个存储时间信息的存储单元中,当前的时间信息存放位置一般如下:
秒:
0分:
2时:
4日:
7月:
8年:
9
比如当前时间的秒数为26秒,则第0个存储单元的内容为00100110。
CMOSRAM芯片内部有两个端口,端口地址为70H和71H。
CPU通过这两个端口实现对CMOSRAM芯片的读写。
但是,TDN86/88+实验系统中并没有由纽扣电池供电的RAM芯片,因此若系统关闭电源时,一切信息都将消失,也就是说实验系统中并不存在与普通PC机类似的系统时间存储机制。
因此,需要采用其它方法来实现随机数的产生。
通过查阅相关文献,在本设计中将采用以下方法来实现随机数的产生(利用此方法产生随机数的效果请参阅调试部分):
首先产生一个随机的AX,再通过对N进行求余运算得到0~N-1内的随机数。
比如要产生一个0~7内的随机数,将采用以下代码完成:
CALLRND_AX;产生随机AX
MOVAH,03H;防止溢出
MOVDL,8
DIVDL;产生0~7之间一随机数至AH
MOVRND,AH;AX除DL,商放AL,余数放AH
……
RND_AXPROCNEAR;子过程,用于产生随机的AX
MOVAX,0C49H
IMULSEED
ADDAX,05E1H
MOVSEED,AX;保存种子
PUSHCX
MOVCL,8
RORAX,CL;对AX进行移位
POPCX
RND_AXENDP
其中SEED、RND是在数据段定义的变量,SEED初始化时可以任意赋值,本设计中置初值为1。
此段代码最终产生一个0~7内的随机数至变量RND。
上面所说的产生一个300~1500内的随机数问题也可以类似地解决,程序中先用一个随机数子程序产生100个随机数,对其求和并将所得的和存放到变量RNDSUM,则根据统计平均规律,RNDSUM约为255*100/2=12750,将此值作为计数器T的初始值。
如此一来,欲表示一个3~15秒的区间,则需确定两个变量NUM1和NUM2(其中NUM1=11930*300/RNDSUM,NUM2=11930*1500/RNDSUM),这样区间(NUM1~NUM2)就对应3~15秒。
具体代码如下:
MOVDX,0036H;11930*300=369C78H
MOVAX,9C78H
MOVBX,RNDSUM;RNDSUM为100个RND之和
DIVBX
MOVNUM1,AX
MOVDX,0111H;11930*1500=1110E58H
MOVAX,0E58H
DIVBX
MOVNUM2,AX
CALLRND_AX;产生随机AX
MOVDX,0
MOVCX,NUM2
SUBCX,NUM1
DIVCX;CX存放0NUM2-NUM1之间的随机数
MOVCX,DX
ADDCX,NUM1;CX存放NUM1-NUM2之间的随机
3)键盘扫描
通常使用的键盘是矩阵结构的,如下图所示:
图2-7键盘的矩阵式结构
识别键盘上的闭合键通常有两种方法:
行反转法和行扫描法。
行反转法的原理:
行反转法识别闭合键时,要将行线接一个并行口,先让它工作在输出方式,将列线也接到一个并行口,先让它工作在输入方式,程序使CPU通过输出端口往各行线上全部送低电平,然后读入列线的值。
如果此时有某一个键被按下,则必定会使某一列线值为零,然后,程序再对两个并行端口进行方式设置,使行线工作在输入方式,列线工作在输出方式,并且将刚才读得的列线值从列线所接的并行端口输出,再读取行线上的输入值,那么,在闭合键所在的行线上的值必定为零。
这样,当一个键被按下时,必定可以读得一对唯一的行值和列值。
行扫描法的原理:
首先先快速检查键盘中是否有某个键已被按下,然后,再确定具体按下了哪一个键。
为此,可以先使所有各行同时为低电平,再检查是否有列线也处于低电平。
这时,如果列线上有一位为0,则说明必有键被按下,不过,还不能确定所闭合的键处在哪一行上,于是再用扫描法来确定具体位置。
具体为:
先使第1行接地,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 测试 反应时间 模拟 系统 完整版