基于AT89C52的人体反应速度测试仪我把仿真图和程序文件分享到下面了,需要的可以去看看。
先按住按钮,等待led亮起后再松开按钮 测得的时间及反应速度的时间.
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
仿真图
单片机源程序如下:
- #include<stdlib.h>
- #include<stdio.h>
- #include<intrins.h>
- #include<reg52.h>
- sbit key=P1^0;
- sbit led=P1^1;
- typedef unsigned char byte;
- typedef unsigned int word;
- static byte disp[5];
- code byte table[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
- byte bot(void)
- {
- if(key==0)return 0;
- else return 1;
- }
- void display(word ms)
- {
- byte posi=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; //显示xxxx秒形式
- P0=temp;
- }
- posi*=2;
- }
- }
- unsigned long random(void) //生成随机数
- {
- word rt; byte k=0;
- srand (50000); //种下随机数种子,范围0-50000
- rt=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()); //等待按键按下,否则始终等待
- 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计时器
- {
- 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 //若按键按下,重新开始测试
- {
- while(1)
- {
- if(k==1) //按键弹开后始终显示时间
- {
- k=bot();
- display(mstime);
- }
- else //若按键按下,重新开始测试
- {
- mstime=0;
- P2=0xff;
- break;
- }
- }
- }
- }
- }
- }
复制代码
Keil代码与Proteus8.8; 7.5仿真下载:
人体反应速度测试仪项目.7z
(70.8 KB, 下载次数: 67)
|