基于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)
2022-6-23 16:28 上傳
點擊文件名下載附件
文件
|