基于C51实现测试人体反应速度

  • 在protest中创建项目

AT89C51的P1.0接口与声音和灯相连,P1.6接口连接的是开始按钮,P1.7接口连接的是重置按钮,P0接口和P2接口连接4位数码管,P0接口要外接一个电阻,否则数码管出现错误。P0接口连接的是数码管的段选码,而P2.0~P2.3接口连接的是数码管的位选码。

  • 在keil4中编写代码

  • 头文件
#include<reg51.h>
#include<absacc.h>
#include<stdlib.h>
  • 定义一些字段
typedef unsigned char uchar;
typedef unsigned int uint;
sbit LEDs=P1^0; //小灯和声音
sbit key1=P1^6;  //开始按钮
sbit key2=P1^7;  //重置按钮
unsigned long int  time;  //秒数
uint i,j,n;
#define LED_SEG_PORT P0  //段选码
#define LED_BIT_PORT P2  //位选码
unsigned char code DIS_SEG1[11]={ 0xBF, 0x86, 0xDB, 0xCF, 0xE6, 0xED, 0xFD, 0x87,0xFF, 0xEF };//带有小数点的0~9数字
unsigned char code DIS_SEG7[11]={ 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F, 0x6F,0x80 };//0~9数字
unsigned char code DIS_BIT[7]={ 0xff,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//位选码
  • 读取开始按钮函数
int anxia(void)    
{
   if(key1==0)
		 return 0;
   else
		 return 1;
}
  • 读取重置按钮函数
int chongzhi(void)    
{
   if(key2==0)
		 return 0;
   else
		 return 1;
}
  • 生成随机数函数
 int random()       
 {
	 uint rt;
	 srand (1000);	
	 	rt=rand()/3;                  
	 return rt;
	 
 }
  • 延迟函数
void delay20ms(void)   
{
    unsigned char a,b;
    for(b=50;b>0;b--)
       for(a=45;a>0;a--);
}
  • 数码管显示函数
void display(uchar num ,uchar b) 
{
  if(b==0)//第一位是带有小数点的数字
	{
		LED_BIT_PORT=DIS_BIT[b];
        LED_SEG_PORT=DIS_SEG1[num];
	}
	else
	{
		LED_BIT_PORT=DIS_BIT[b];
		LED_SEG_PORT=DIS_SEG7[num];
	}
  delay20ms();
}
  • 清零函数

以下字段清零时需要多次使用,所以创建一个函数,可以方便调用。

void czsmg()  
{
	LEDs=1;
	LED_SEG_PORT=0;
	LED_BIT_PORT=0;
	time=0;
}
  • 主函数
void main()
{
  loop:TMOD=0x01;  
  TH0=0xfb;  //赋初值
  TL0=0xc8;
  TR0=1;   //计数
  ET0=1;   //定时器中单
  EA=1;   //允许中断
	while(1)
	{
	  for(i=0;i<=random();i++)  
	  {
			if(LEDs==1&&key1==0)//如果灯和声音没有开始时按下开始按钮,则显示9999
		 {
			  display(9,0);
			  display(9,1);
			  display(9,2);
			  display(9,3);
	 		  TR0=0;	 //停止计数
			 break;
     }
		 if(i==random())  //如果到达随机的秒数,则灯亮
		{
		  	LEDs=0;
				break;
    }
    }
		break;
	}
  time=0;  //从灯亮开始计时
	while(1)
	{
		if(LEDs==0)  //灯亮后,数码管开始显示秒数,并开始计时
		{
			display(time/1000%10,0);
            display(time/100%10,1);
            display(time/10%10,2);
            display(time%10,3);
       }
		if(anxia()==0) //如果按钮按钮,则显示当前秒数
		{
			TR0=0;//暂停计时
       }
		if(chongzhi()==0)  //按下重置按钮,则重新开始
		{
			czsmg();
    	   goto loop;
       }
		if(time>=9999)  //如果秒数超过10秒,则需要重新开始
		{
	      czsmg();
       }	
	}
}
  • 中断函数
 void time0(void) interrupt 1   
{
 TH0=0xfb;   //重新赋初值
 TL0=0xc8;
 if(n>=1)
 {
    n=0;
    time++;
 }
 n++;
}
  • 运行结果

具体操作步骤:点击开始按钮,在等待随机一段时间后,小灯和声音启动的同时,数码管开始计时,按下按钮,则数码管停止计时,该数码管的时间就是你的反应速度;如果在声音和小灯没有启动前按下按钮,则数码管显示9999,提示错误;数码管的秒数控制在10秒之内,如果超过10秒还没有按下按钮,则需要按下重置按钮重新开始。

在这里插入图片描述
在这里插入图片描述

  • 5
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值