人体反应速度测试仪毕业设计解读.docx
《人体反应速度测试仪毕业设计解读.docx》由会员分享,可在线阅读,更多相关《人体反应速度测试仪毕业设计解读.docx(23页珍藏版)》请在冰点文库上搜索。
人体反应速度测试仪毕业设计解读
第一章课题综述
1.1课题背景
速度素质是指人体进行快速运动的能力,即在单位时间内迅速完成某一动作或通过某一距离的能力。
反应速度是指人体对刺激发生反应的快慢。
从生理机制分析,反应快慢取决于“反射弧”的五个环节:
感受器—传入神经—神经中枢—传出神经—效应器。
下面以MCS-8051单片机为核心,设计出测试人体反应速度的仪器用以测试人的反应时间。
我们学习的是单片机理论知识,而课程设计则是对我们学习的理论知识的实践和巩固。
1.2设计要求
基于MCS-8051单片机的人体反应速度测试仪设计要求如下:
1.按下“开始”按钮,红灯亮,按钮一直保持按下状态。
2.红灯持续点亮一段随机时间,然后熄灭,灯熄灭时人松开按钮。
3.计算灯熄灭的时间和按钮被松开的时间之差,显示出来。
4.若测试者在红灯熄灭之前松开按钮,则显示出错信息。
1.3面对的问题
1.对MCS-8051单片机的了解和应用。
2.对八段数码管的特性的了解和使用。
1.4需解决的关键技术
课题主要通过控制红灯的状态,通过测试按钮的状态来间接计算人体反应速度。
要了解每一段数码管与MCS-8051单片机的连接,数码管显示数字的段码,各个芯片的输入输出关系,单片机内部定时器的原理与控制,必须通过查阅资料确定。
必须了解数码管显示器的显示原理。
第二章系统分析
2.1涉及的基础知识
通过学习和查阅资料,本课题需要掌握和了解如下知识:
1.MCS-8051单片机各输入输出端口的功能特性。
2.MCS-8051单片机复位电路工作原理及设计。
3.MCS-8051单片机晶振电路工作原理及设计。
4.测试按钮、测试灯电路设计。
5.驱动器74LS244、反相器74LS04的特性及使用。
6.数码管显示器的特性及使用。
7.MCS-8051单片机引脚。
8.单片机内部定时器原理及使用。
9.单片机C语言及程序设计。
2.2MCS-8051单片机简介
随着超大规模集成电路技术的发展,在一个集成电路芯片上集成了中央处理器CPU、数据存储器RAM、程序存储器ROM或EPROM、各种I/O接口等,构成了一个计算机,称为单片机。
也就是说,单片机是集成在一块集成电路芯片上的计算机。
单片机以其较高的性价比、较高的集成度、较高可靠性、较强控制功能以及低电压、低功耗、偏于携带等优点收到广大用户的青睐。
MCS-51系列单片机以其典型的结构和完善的总线专用寄存器的集中管理,众多的逻辑位操作功能及面向控制的丰富指令系统,堪称为一代“名机”,为以后的其他单片机发展奠定了基础。
MCS-51系列单片机具有品种全、兼容性强、软硬件资料丰富等特点,因此应用非常广泛,直到现在MCS-51系列单片机仍为单片机中的主流机型,也是高档单片机的基础。
8051是MCS-51系列单片机中的代表产品,它内部集成了功能强大的中央处理器,包含了硬件乘除法器、21个专用控制寄存器、4KB的程序存储器、128字节的数据存储器、4组8位的并行口、两个16位的可编程定时/计数器、一个全双工的串行口以及布尔处理器。
8051中集成了完善的各种中断源,用户可十分方便的控制和使用其功能,使得它的应用范围加大,可以说它可以满足绝大部分的应用场合。
2.3MCS-8051单片机引脚图
MCS-8051单片机采用40条引脚的双列直插式封装,引脚配置如图2—1所示。
单片机电源引脚接入单片机的工作电源:
VCC引脚接+5V电源,VSS引脚接地。
单片机时钟由引脚XTAL1和XTAL2接外部时钟配置电路组成。
单片机复位,当振荡器运行时,在RST引脚加上两个机器周期的高电平使单片机复位。
MCS-8051单片机具有4个8位的输入/输出口,P0、P1、P2和P3口。
P0口是双向8位三态I/O口,此口常作为地址总线低8位及数据总线分时复用口,可带8个LSTTL负载。
P1口是8位准双向I/O口,可带4个LSTTL负载。
P2口是8位准双向I/O口,常作地址总线高8位使用,可驱动4个LSTTL负载。
P3口是8位准双向I/O口,为双功能复用口,可驱动4个LSTTL负载。
2.4数码管显示器
2.4.1数码管显示器的特性
1.发光响应快,亮度强,高频特性好;而且随着材料的不同,数码管还能发出红、黄、绿、蓝、橙等多种颜色的光。
图2—1MCS-8051单片机引脚图
2.机械性能好,体积小,重量轻,价格低廉;能与COMS和TTL电路配合使用;使用寿命长。
3.工作电压低,驱动电流适中。
每段电流为5~10mA,一只数码管的8段LED全亮需要电流35~70mA。
这样打的电流需要由驱动电路提供,因此,使用时要注意数码管的驱动问题。
在使用中,为了给发光二极管加驱动电压,他们应有一个公共的引脚,公共的引脚有如下两种链接方法:
一、共阴极接法。
把发光二极管的阴极连接在一起构成阴极公共引脚,使用时公共引脚接地,这样阳极引脚上加高电平的发光二极管就导通点亮,而加低电平的则不亮。
二、共阳极接法。
把发光二极管的阳极连接在一起作为阳极公共引脚,使用时阳极公共引脚接+5V。
这样阴极引脚上加低电平的发光二极管即可导通点亮,而加高电平的则点不亮。
本课题采用SR410561K四位一体数码管,为共阳极接法,位选信号位高电平有效,段码信号为低电平有效。
2.4.2数码管的显示原理
并排使用的多位数码管组成数码管显示器。
数码管显示器多采用动态显示方式,全部数码管共用一套段码驱动电路,各位数码管的同段引脚短接后再接到对应段码的驱动线上。
显示时通过位控制信号采用扫描的方法逐位地循环点亮各位数码管。
动态显示虽然在任一时刻只有一位数码管被点亮,但是由于人眼具有的视觉残留效应,看起来与全部数码管持续点亮的效果完全一样。
数码管显示器的动态显示需要为各位提供段码以及相应的位控制,此即通常所说的段控和位控。
把数码管显示器段码表预先存放在存储器中,使用时通过查表就可以得到段码。
段码输出后送到公共端码线上,也可称为段控信号。
而通过并行口输出的相互独立的位码则是起选通作用的,也称位控活扫描信号,用于选择显示位。
动态显示具有硬件简单,功耗低和显示灵活性强等优点。
但动态显示增加了驱动软件的复杂性,且显示亮度较低。
2.4.3数码管显示器段码
SR410561K四位一体数码管采用共阳极接法,单个数码管如图2—2所示。
图2—2八段数码管
则数码管段码如表2—1所示。
表2—1数码管段码
显示数字
Dpgfedcba
段码
0
11000000
c0
1
11111001
f9
2
10100100
a4
3
10110000
b0
4
10011001
99
5
10010010
92
6
10000010
82
7
11111000
f8
8
10000000
80
9
10010000
90
A
10001000
88
b
10000011
83
C
11000110
c6
d
10100001
a1
E
10000110
86
F
10001110
8e
2.5定时器
2.5.1定时器工作原理
在MCS-8051单片机内集成了两个16位的定时器/计数器T0和T1,其基本工作原理是加1计数,即对指定的脉冲信号进行加1操作,直到出现溢出为止。
当T0和T1作为定时器使用时,其计数脉冲信号取自单片机内部的时钟信号,每个机器周期产生一个计数脉冲,使计数器加1。
T0和T1分别有两个8位的计数器组成,其中T0由特殊功能寄存器TH0与TL0组成,而T1则由特殊功能寄存器TH1与TL1组成。
这四个寄存器用来存储定时或计数使用的初值,所以也被称为时间常数存储器。
特殊功能寄存器TMOD和TCON完成对定时器/计数器的控制功能。
2.5.2定时器的控制
MCS-8051单片机的定时功能是由特殊功能寄存器TH0,TL0,TH1,TL1,TMOD和TCON完成的。
特殊功能寄存器TMOD用于确定定时器的工作方式,格式如下:
D7
D6
D5
D4
D3
D2
D1
D0
GATE
C/T
M1
M0
GATE
C/T
M1
M0
其中,前4位用于控制T1的工作方式,后四位用于控制T0的工作方式。
本课题仅使用T1作为定时器,选择工作方式为方式1,即为选择T1为16为定时器。
则TMOD的值应设置为00010000B,即TMOD=0x10。
特殊功能寄存器TCON用于用于控制定时器的启动和停止技术,同时包含了定时器的状态,可进行位寻址。
格式如下:
D7
D6
D5
D4
D3
D2
D1
D0
TF1
TR1
TF0
TR0
IE1
IT1
IE0
IT0
本课题中用到的控制位有TI的控制位TR1和TF1,无需中断控制。
TR1为T1运行控制位,若TR1=1,允许T1计数,若TR1=0,禁止T1计数。
TF1为T1计数溢出标志值,当T1被允许计数后,T1从初值开始加1计数,最高位产生溢出时,TF1由硬件置1,TF1的信息可由软件查询。
2.5.3定时器初值的设定
本课题中,设置初值使T1的定时周期为1ms。
当红灯熄灭后,定时器开始工作,每1ms定时器产生一次溢出,使数码管要显示的反应时间以毫秒为单位加1,达到使数码管显示人体反应时间的目的。
T1采用工作方式1定时,时钟频率采用6MHz,则计数初值:
x=216-6×106×1×10-3/12=65536-6000/12=65036
化为二进制x=1111111000001100B,则计数初值应为TH1=0xfe,TL1=0x0c。
第三章总体方案设计
3.1总体方案
数码管的显示电路中采用动态数码管显示。
采用MCS-8051单片机的P0端口(P0.0~P0.7端口)控制段码,低电平有效。
P2.0~P2.3端口控制4位数码管的位选择,高电平有效。
(P2.3端口控制第1个数码管,P2.2端口控制第2个数码管,P2.1端口控制第3个数码管,P2.0端口控制第4个数码管)。
各个数码管的段码都是P0端口的输出,即各个数码管输入的段码都是一样的,为了使其分别显示不同的数字,可采用动态扫描的方式,即先只让最低位显示,经过一段延时,再只让次低位显示,以此类推。
由于视觉暂留,只要延时时间足够短,就能够使得数码的显示看起来非常稳定清楚。
3.2功能模块框图
人体反应速度测试仪的功能模块框图如图3—1所示。
硬件电路由MCS-8051单片机、电源电路、测试按钮和测试灯电路、晶振电路、复位电路、驱动电路、反相电路以及数码管显示电路组成。
图3—1人体反应速度测试仪功能模块框图
第四章系统硬件设计
4.1硬件连接图
4.1.1测试按钮与测试灯电路
MCS-8051单片机的P1.0端口控制一个发光二极管,即为测试红灯。
发光二极管加限流电阻接+5V电源,当单片机的P1.0端口输出低电平时,红灯亮,输出高电平时,红灯灭。
P1.1端口接“开始”按钮,按钮另一端接地。
若按钮按下,则P1.1口输入低电平,否则输入高电平。
4.1.2数码管显示电路
数码管采用SR410561K四位一体数码管。
MCS-8051单片机的P0口的8个端口(P0.0~P0.7)控制数码管的八段数码显示。
P0口8位输出经限流电阻接入到数码管显示器的段码端口。
数码管采用共阳极接法,低电平有效。
限流电阻的接入是由于在应用数码管进行显示时,首先需要考虑的问题是驱动电流,与发光二极管相同,数码管的发光段也需要串联限流电阻,串联限流电阻的组织越大,电流越小,亮度越低;电阻阻值越小,电流越大,亮度越高。
在使用限流电阻时需要在每一个线段上都串联限流电阻,而不要在公共端上串联一个限流电阻,否则在显示不同的数字时,会造成数码管亮度的不同。
单片机P2口的P2.0~P2.3控制4位数码管的位选,P2口输出经限流电阻后需进行反相,反相之后经驱动电路接入到数码管显示器的位选端。
4.1.3晶振电路
时钟是单片机的心脏,单片机各功能部件的运行都是以时钟频率为基准,有条不紊地一拍一拍地工作。
因此,时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的运行。
单片机必须在时钟的驱动下才能正常工作。
MCS-8051单片机的时钟可以由内部方式或外部方式产生。
本课题采用内部方式的晶振电路,如图4—1所示,一般选用石英晶体振荡器。
利用MCS-8051单片机内部的震荡电路,并在XTAL1和XTAL2两脚间外接晶体以及电容C1和C2构成的并联谐振电路,使内部振荡器产生自激振荡。
组成时钟电路的晶体振荡器的频率大小决定了单片机系统的工作频率,即决定着单片机的工作速度,本课题时钟频率采用6MHz。
图4—1晶振电路
4.1.4复位电路
采用上电自动复位电路,工作原理是:
通电瞬间,RC电路充电,RST端出现正脉冲,只要RST端保持10ms以上的高电平,就能使单片机有效复位。
当晶振频率选用6MHz时,C取22uF,R取1k欧,如图4—2所示。
图4—2复位电路
4.1.5驱动电路
用四个PNP数码管作为每一位数码管的驱动电路,这样使得数码管电流更大,亮度更亮。
P2.0~P2.3控制数码管显示器的四个位,当相应的端口变为高电平时,经反相器变为低电平,驱动相应的三极管会导通,+5V通过相应的驱动三极管给数码管相应的位供电,这时只要P0口送出相应的显示段码,数码管就能显示出所需数值,即显示定时器的计时数值。
4.1.6反相电路
由于程序中设置P2口输出的位选信号为高电平,使驱动三极管导通应使用低电平,即在位选信号输出线路中限流电阻后应接入反相器。
本课题反相器采用74LS04反相器。
74LS04芯片为6非门(反相器),内部含有6个coms反相器,74LS04的作用就是反相。
反相器输出三极管驱动电路接入到数码管位选端口。
74LS04如图4—3所示。
图4—374LS04反相器
4.2实现方法
主程序采用查询方式,当按钮按下时,MCS-8051单片机使LED灯亮起的同时调用随机函数产生一个随机时间,单片机利用产生的这个随机时间计时。
计时时间到,MCS-8051单片机输出使P1.0端口为高电平,LED测试灯熄灭,MCS-8051单片机进行新的一轮计时,当测试者松开按钮时,计时时间停止,单片机把这个计时时间送往数码管显示电路显示。
当MCS-8051单片机第一轮的计时时间还未到时,若按钮松开,则单片机输出错误提示,使数码管显示为9999。
4.3详细流程图
图4—1详细流程图
第五章程序代码编写
5.1按钮电路的实现
描述:
读取按钮当前的状态
bytebot(void)//按钮状态,若按钮被按下则返回0,否则返回1
{
if(key==0)
return0;
elsereturn1;
}
5.2四位数码管显示电路的实现
描述:
数码管进行显示反应时间
voiddisplay(wordms)//数码管上的显示反应时间
{
byteposi=0x01,i,j,temp;//posi初始化选择为最低位
disp[3]=ms/1000;//1s
disp[2]=(ms%1000)/100;//100ms
disp[1]=(ms%100)/10;//10ms
disp[0]=ms%10;//1ms
for(i=0;i<4;i++)//数码管显示
{
temp=disp[i];
temp=table[temp];
for(j=0;j<200;j++)
{
P2=posi;//P2口进行位选择
P0=temp;//P0口进行段选择
}
posi=posi*2;//posi二进制向左移动一位,选择下一位
}
}
5.3随机函数的实现
描述:
用随机函数产生一个随机数,为随机时间,即按钮按下到红灯熄灭的时间
unsignedlongrandom(void)//生成随机数
{
wordrt;
srand(50000);//产生的随机数的范围为0-50000
rt=rand();//产生一个随机数
returnrt;
}
5.4定时器程序的实现
描述:
定时器初始化程序
voidINIT_T1(void)
{
TMOD=0x10;//定时器1为工作方式1
TH1=0xfe;//定时器1的周期为1ms
TL1=0x0c;
TR1=1;//启动定时器1
}
voidlms(void)//1ms产生一次溢出
{
INIT_T1();
while
(1)
{
if(TF1==1)//等待定时器1溢出
{
break;
}
}
}
5.5主函数的实现
#defineledP1^0
#definekeyP1^1
voidmain(void)
{
unsignedcharcodetable[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
bytek=0;
k=bot();//获取按钮情况,k=0为按钮被按下
wordmstime=0;
P1=0xff;//P1口预制高电平,红灯熄灭(P1.0)
while
(1)
{
wordmstime=0,j;
wordr,j;
while(bot());//等到按钮被按下,循环条件为0,跳出该循环
led=0;//按键被按下后,灯亮
r=random();//产生随机时间
for(j=r;j>0;j--)//使红灯在该时间内为亮
{
lms();
k=bot();
if(k==1)//如果测试者在红灯熄灭前松开按钮按钮
{
mstime=9999;//使数码管显示9999出错信息
led=1;//红灯熄灭
gotoloop;
}
}
led=1;//随机延时结束,红灯熄灭
INIT_T1();//定时器1初始化
while
(1)
{
if(TF1==1)//定时器每1ms产生一次溢出
{
TH1=0xfe;
TL1=0x0c;
TR1=1;
TF1=0;//溢出位复位
mstime=mstime+1;//计时时间增加1ms
}
if(bot())break;//测试者松开按钮,计时结束
}
loop:
while
(1)
{
if(k==1)//按键弹开后始终显示时间
{
k=bot();
display(mstime);
}
else//若按键按下,重新开始测试
{
mstime=0;
P2=0xff;
break;
}
}
}
5.6总程序
#defineledP1^0
#definekeyP1^1
bytebot(void)
{
if(key==0)
return0;
elsereturn1;
}
voiddisplay(wordms)
{
byteposi=0x01,i,j,temp;
disp[3]=ms/1000;
disp[2]=(ms%1000)/100;
disp[1]=(ms%100)/10;
disp[0]=ms%10;
for(i=0;i<4;i++)
{
temp=disp[i];
temp=table[temp];
for(j=0;j<200;j++)
{
P2=posi;
P0=temp;
}
posi=posi*2;
}
}
unsignedlongrandom(void)
{
wordrt;
srand(50000);
rt=rand();
returnrt;
}
voidINIT_T1(void)
{
TMOD=0x10;
TH1=0xfe;
TL1=0x0c;
TR1=1;
}
voidlms(void)
{
INIT_T1();
while
(1)
{
if(TF1==1)
{
break;
}
}
}
voidmain(void)
{
unsignedcharcodetable[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,
0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}
bytek=0;
k=bot();
wordmstime=0;
P1=0xff;
while
(1)
{
wordmstime=0,j;
wordr,j;
while(bot());
led=0;
r=random();
for(j=r;j>0;j--)
{
lms();
k=bot();
if(k==1)
{
mstime=9999;
led=1;
gotoloop;
}
}
led=1;
INIT_T1();
while
(1)
{
if(TF1==1)
{
TH1=0xfe;
TL1=0x0c;
TR1=1;
TF1=0;
mstime=mstime+1;
}
if(bot())
break;
}
loop:
while
(1)
{
if(k==1)
{
k=bot();
display(mstime);
}
else
{
mstime=0;
P2=0xff;
break;
}
}
}
第六章结论
经过两周的制作,完成了人体反应速度测试仪的设计,达到了预定的要求。
这次课程设计给我们提供了一个应用自己所学知识去勇于创新和实际的平台。
一开始做人体速度测试仪的设计是觉得看起来会比较简单,但是真正做起来才发现其实还是比较困难的,毕竟在这一方面的技术有限。
第一周前两天进行了资料查阅了解,第三天开始编辑说明书,同时进行电路图的构思理解。
从通过理论设计,再到确定具体方案,成型。
整个过程都需要充分利用所学的知识进行思考、借鉴。
可以说,这次课程设计是对前面所学知识进行的一次比较综合的检验。
总的来说,这次课程设计虽然很累,但却是苦中有乐,非常充实。
在这次实习中,正确的思路是很重要的,只有你的设计思路是正确的,你的设计才有可能成功。
这次能那么成功的完成我的设计,要感谢老师和同学们的帮助,李老师、胡老师能在百忙之中来知道我,每当我遇到棘手的问题,老师总能给我最好的建议,教我改进的方法,不厌其烦的指出我在设计中存在的问题和错误,是我更好的完成设计。
在理解程序的时