AT89C51的P1.0接口与声音和灯相连,P1.6接口连接的是开始按钮,P1.7接口连接的是重置按钮,P0接口和P2接口连接4位数码管,P0接口要外接一个电阻,否则数码管出现错误。P0接口连接的是数码管的段选码,而P2.0~P2.3接口连接的是数码管的位选码。
#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秒还没有按下按钮,则需要按下重置按钮重新开始。