当前位置:文档之家› 单片机原理 人体反应测速

单片机原理 人体反应测速

课程设计实验报告题目单片机的人体反应速度测试仪课程名称单片机原理及接口技术院部名称机电工程学院专业电气工程及其自动化班级电气2班姓名许俊超学号0922107020指导教师高峰金陵科技学院教务处制摘要:随着社会的发展,许多交通事故都是由于人们在突发情况下不能及时做出判断而导致的。

因此,在面对突发事故时,人的反应快慢直接影响到事情变化的好坏。

下面以AT89751单片机为核心,设计出测试人体反应速度的仪器用以测试人的反应时间,间接反映人们面对突发状况的反应能力。

以AT89751单片机为核心的人体反应速度测试仪,主要控制测试灯的状态,通过测试按键的状态来间接计算人体反应速度。

正常情况下系统运行主程序一直处于空闲等待状态,知道测试者按下按键后,LED测试灯立即点亮。

AT89751单片机在LED测试灯亮的同时开始计算一个随机时间,在一段随机时间结束后,AT89751单片机把LED测试灯熄灭,并开始计时灯灭与测试者放开按键的时间差,此计时时间用于纪录被测试者的反应时间,并以毫秒为时间单位在4位数码管上显示。

如果在LED测试灯灭之前提前放开测试按键,则显示9999作为出错信息。

关键词:AT89751 ; LED ; 数码管目录1 课题综述 01.1课题来源 01.2预期目标 (1)1.3面对的问题 (1)1.4需解决的关键技术 (1)2系统分析 (1)2.1涉及的基础知识 (1)2.2总体方案 (3)2.3功能模块框图 (4)3 系统设计 (4)3.1硬件连接图 (4)3.2实现方法 (5)3.3详细流程图 (5)4 代码编写 (6)4.1按键电路的实现 (6)4.24位LED数码管显示电路的实现 (7)4.3随机函数的实现 (7)4.4中断程序的实现 (8)4.5主函数的实现 (9)4.6总程序 (10)5 程序调试 (14)总结 (15)参考文献 (15)1 课题综述1.1 课题来源许多交通事故都是由于人们在突发情况下不能及时做出判断而导致的。

因此,在面对突发事故时,人的反应快慢直接影响到事情变化的好坏。

下面以AT89751单片机为核心,设计出测试人体反应速度的仪器用以测试人的反应时间,间接反映人们面对突发状况的反应能力。

我们学习的是单片机理论知识,而课程设计则是对我们学习的理论知识的时间和巩固。

1.2预期目标基于AT89751单片机的人体反应速度测试仪设计要求如下:(1)测试者按下测试按键后,测试灯亮起,测试随子开始。

(2)在测试过程中,测试者要注意观察测试灯的变化,当看到测试灯熄灭时,测试者要迅速放开测试按钮,单片机会在数码管上显示测试者的反应时间。

(3)若测试者在测试灯熄灭之前放开测试按键,则系统自动判为犯规,并显示出错信息。

1.3 面对的问题(1) 对AT89751单片机的了解和应用(2) 对LED数码管的特性的了解和使用1.4 需解决的关键技术本项目主要通过控制测试灯的状态,通过测试按键的状态来间接计算人体反应速度。

要了解每一段数码管与AT89751个引脚的连接,各个芯片的输入输出关系,必须通过查阅资料确定。

必须了解LED显示器的显示原理。

2系统分析2.1 涉及的基础知识通过学习和查阅资料,本项目需要掌握和了解如下知识:·+5V电源原理及设计。

·单片机复位电路工作原理及设计。

·单片机晶振电路工作原理及设计。

·测试按键电路设计。

·驱动电路74LS07、74LS244的特性及使用。

·LED的特性及使用。

·AT89751单片机引脚。

·单片机C语言及程序设计。

2.1.1 AT89S51单片机简介功能特性:AT89751是一种低功耗、高性能CMOS8位微控制器,具有8K 在系统可编程Flash 存储器。

使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。

片上Flash允许程序存储器在系统可编程,亦适于常规编程器。

在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89751为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

AT89751具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。

另外,AT89751 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。

空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。

掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

8 位微控制器8K 字节在系统可编程Flash AT89751。

主要性能:与MCS-51单片机产品兼容、8K字节在系统可编程Flash存储器、1000次擦写周期、全静态操作:0Hz~33Hz 、三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器八个中断源、全双工UART串行通道、低功耗空闲和掉电模式、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符。

图2-1 AT89751引脚图2.1.2 LED显示器的特性(1) 发光响应快,亮度强,高频特性好;而且随着材料的不同,数码管还能发出红、黄、绿、蓝、橙等多种颜色的光。

(2) 机械性能好,体积小,重量轻,价格低廉;能与COMS和TTL电路配合使用;使用寿命长。

(3) 工作电压低,驱动电流适中。

每段电流为5~10mA,一只数码管的7段LED 全亮需要电流35~70mA。

这样打的电流需要由驱动电路提供,因此,使用时要注意数码管的驱动问题。

在使用中,为了给发光二极管加驱动电压,他们应有一个公共的引脚,公共的引脚有如下两种链接方法:一、共阴极接法。

把发光二极管的阴极连接在一起构成阴极公共引脚,使用时公共引脚接地,这样阳极引脚上加高电平的发光二极管就导通点亮,而加低电平的则不亮。

二、共阳极接法。

把发光二极管的阳极连接在一起作为阳极公共引脚,使用时阳极公共引脚接+5V。

这样阴极引脚上加低电平的发光二极管即可导通点亮,二加高电平的则点不亮。

2.1.3 LED显示器显示原理、并排使用的多位数码管成为LED显示器。

LED显示器多采用动态显示方式,全部数码管共用一套段码驱动电路,各位数码管的同段引脚短接后再接到对应段码的驱动线上。

显示时通过位控制信号采用扫描的方法逐位地循环点亮各位数码管。

动态显示虽然在任一时刻只有一位数码管被点亮,但是由于人眼具有的视觉残留效应,看起来与全部数码管持续点亮的效果完全一样。

LED显示器的动态显示需要为各位提供段码以及相应的位控制,此即通常所说的段控和位控。

把LED显示器段码表预先存放在存储器中,使用时通过查表就可以得到段码。

段码输出后送到公共端码线上,也可称为段控信号。

而通过并行口输出的相互独立的位码则是起选通作用的,也称位控活扫描信号,用于选择显示位。

动态显示具有硬件简单,功耗低和显示灵活性强等优点,但动态显示增加了驱动软件的复杂性,且显示亮度较低。

2.2 总体方案LED数码管的显示电路中采用动态数码管显示,在其中P0端口控制段码,低电平有效,P2.0~P2.3端口控制位码,高电平有效。

P2.3端口控制第1个数码管,P2.2端口控制第2个数码管,P2.1端口控制第3个数码管,P2.0端口控制第4个数码管。

各个数码管的段码都是P0端口的输出,即各个数码管输入的段码都是一样的,为了使其分别显示不同的数字,可采用动态扫描的方式,即先只让最低位显示0,经过一段延时,再只让次低位显示1,以此类推。

由于视觉暂留,只要延时时间足够短,就能够使得数码的显示看起来非常稳定清楚。

2.3 功能模块框图图2-1 人体反应速度测试仪框图3 系统设计3.1 硬件连接图用一只发光二极管模拟测试灯,以AT89751单片机的P1.0端口控制这只发光二极管、发光二极管加限流电阻接+5V电源,P1.0端口输出低电平时,测试灯亮,输出高电平时,测试灯灭。

P1.1端口接测试按键,P0端口控制LED数码管的七段数码显示,P2.0~P2.3控制4位数码管的位选。

图3-1人体反应测速仪电路原理图PROTEL图3-2PRODUCE图3.2 实现方法主程序采用查询方式,当测试按键按下时,AT89751单片机使LED测试灯亮起的同时调用随机函数产生一个随机时间,AT89751单片机利用这个随机时间计时。

计时时间到,AT89751单片机产生一个输出使单片机的P1.1端口为低电平,LED测试灯熄灭,AT89751单片机进行新的一轮计时,送开测试按键,计时时间停止,把这个计时时间送往数码管显示电路显示。

当AT89751单片机第一轮的计时时间还未到时,若测试按键松开,AT89751单片机9999送往数码管显示电路显示。

3.3 详细流程图人体反应速度测试仪程序流程图,如图3-2所示。

图3-3程序流程图4 代码编写4.1按键电路的实现描述:读取按键byte bot(void) //读取按键,有按键被按下则返回0,否则返回1{if(key==0)return 0;else return 1;}4.2 4位LED数码管显示电路的实现描述:将缓存区display[]中的整数译码后用数码管进行显示void display(word ms) //数码管上的显示反应时间{byte posi=0x01,i,j,temp;disp[3]=ms/1000; //1sdisp[2]=(ms%1000)/100; //100msdisp[1]=(ms%100)/10; //10msdisp[0]=ms%10; //1msfor(i=0;i<4;i++) //数码管显示{temp=disp[i];temp=table[temp];for(j=0;j<200;j++) //延时{P2=posi; //显示xxxx秒形式P0=temp;}posi*=2;}}4.3 随机函数的实现描述:调用系统随机函数unsigned long random(void) //生成随机数{word rt;byte k=0;srand (50000); //种下随机数种子,范围0-50000rt=rand(); //生成随机熟rt=rt*rand(); //使随机数足够大,能够延时足够时间return rt;}4.4 中断程序的实现描述:定时器初始化子程序void INIT_TMR1(void){TMOD=0x11;TH1=0xfc;TL1=0x66;TR1=1;}void delaylms(void) //延时1ms{INIT_TMR1() ;while(1){if(TF1==1){break;}}}4.5 主函数的实现void main(void){byte k=0;k=bot(); //获取按键情况P1=0xff; //输入前先把P1口都加高电平while(1) //主循环开始{word mstime=0,j;word r;while(bot()); //等待按键按下,否则始终等待led=0; //按键被按下后,灯亮r=random();for (j=r;j>0;--j) //延时一段随机时间,为1马上的随机倍数{delaylms();k=bot();if (k==1) //如果在灯灭前谈起按键,显示最长时间作为惩罚{mstime=9999;goto loop;}}led=1; //灯灭INIT_TMR1(); //初始定时状态while(1) //如果按键弹起,反复进入定时状态,没1ms计时器溢出一次,毫秒数加1{if(TF1==1){TH1=0xfc;TL1=0x18;TR1=1;TF1=0;++mstime;}if(k=bot()) break;}loop: led=1 ;while(1){if(k==1) //按键弹开后始终显示时间{k=bot();display(mstime);}else //若按键按下,重新开始测试{mstime=0;P2=0xff;break;}}}}4.6总程序byte bot(void) //读取按键,有按键被按下则返回0,否则返回1if(key==0)return 0;else return 1;void display(word ms) //数码管上的显示反应时间{byte posi=0x01,i,j,temp;disp[3]=ms/1000; //1sdisp[2]=(ms%1000)/100; //100msdisp[1]=(ms%100)/10; //10msdisp[0]=ms%10; //1msfor(i=0;i<4;i++) //数码管显示{temp=disp[i];temp=table[temp];for(j=0;j<200;j++) //延时{P2=posi; //显示xxxx秒形式P0=temp;}posi*=2;}}unsigned long random(void) //生成随机数{word rt;byte k=0;srand (50000); //种下随机数种子,范围0-50000rt=rand(); //生成随机熟rt=rt*rand(); //使随机数足够大,能够延时足够时间return rt;}void INIT_TMR1(void){TMOD=0x11;TH1=0xfc;TL1=0x66;TR1=1;}void delaylms(void) //延时1ms{INIT_TMR1() ;while(1){if(TF1==1){break;}}}void main(void){byte k=0;k=bot(); //获取按键情况P1=0xff; //输入前先把P1口都加高电平while(1) //主循环开始{word mstime=0,j;word r;while(bot()); //等待按键按下,否则始终等待r=random();for (j=r;j>0;--j) //延时一段随机时间,为1马上的随机倍数{delaylms();k=bot();if (k==1) //如果在灯灭前谈起按键,显示最长时间作为惩罚{mstime=9999;goto loop;}}led=1; //灯灭INIT_TMR1(); //初始定时状态while(1) //如果按键弹起,反复进入定时状态,没1ms计时器溢出一次,毫秒数加1{if(TF1==1){TH1=0xfc;TL1=0x18;TR1=1;TF1=0;++mstime;}if(k=bot()) break;}loop: led=1 ;while(1)if(k==1) //按键弹开后始终显示时间{k=bot();display(mstime);}else //若按键按下,重新开始测试{mstime=0;P2=0xff;break;}}}}5 程序调试程序调试一般是一个一个模块地进行,一个一个子程序地调试,最后联起来统调。

相关主题