📄 text1.c
字号:
/* 反应速度测试仪
P2,P3分别接的数码管做为十位和个位。
P1.0与按键相接于GND.
P1.1接发光二极管做为指示灯,管脚低电平时亮
定时器0工作于方式2,自动重装,按键后取随机数
定时器1工作于方式1,计算反应时间,晶振为11.0592*/
#include <reg51.h>//51单片机头文件
#define uchar unsigned char//宏定义,用uchar 代表 usigned char(无符号字符型数据)
#define uint unsigned int
#define ulong unsigned long
sbit P10=P1^0;//用P10表示P1口第0个管脚
sbit P11=P1^1;
uchar count;//全局变量,标记定时器溢出多少次
uchar code LED[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};//这些数组放到数码管里就显示0-9,全灭全亮
//LED[10]表示LED数组的第10个数。数码管为共阴极,管脚高电平对应数码管的一位亮起
void delay(ulong n)//延时子程序
{
uint m;//定义m 为无符号整型变量
for(m=0;m<30000;m++); //单片给m做加一运算,直到m<30000,其实就是延时去除
//按键抖动,因为此延时是检测到按键后立即执行,键其实依然被按着
while(n--)//当n大于0时下面的语句循环
{
if(P10==0)//P10接的是一个按键,当P10==0时,说明键被按下
{
P2=LED[10];
P3=LED[10];//说明用户在发光二极管未亮时按下键,数码管显示全灭
}
}
}
void main()//主函数
{
uchar i,j,k;
uint x;
TMOD=0x12;//定时器1工作于方式1,//定时器0工作于方式2
TH0=0;TL0=0;//定时器0计数初值,定时器0用于是产生随机数
TH1=0xdc;TL1=0;//定时器1计数初值
TR0=0;//开启定时器0
EA=1;//开启总中断
ET1=1;//开启定时器1中断
while(1)//实际程序总是在这里循环
{
TR1=0;//关闭定时器1
TH1=0xdc;TL1=0;//重置定时器1计数初值
while(1)//以下语v句循环
{
P2=LED[10];P3=LED[10];//P2,P3分别接的十位和个位,现在全灭
if(P10==0)//如果键被按下
{
x=TL0;//取随机数
P2=LED[0];P3=LED[0];//十位和个位显示00
break;//跳出while循环,不仅仅是跳出if
}
}
delay(3000*(30+50*x));//根据随机数来延时
P11=0;//P11接的是一个发光二极管,低电平亮
TR1=1;//开启定时器1,开始计算用户反应时间
while(1)//循环
{
if(P10==0)break;//用户反应过来了。
}
k=count%100;//对count求100的余,赋值给k
i=k/10%10;//十位
j=k%10;//个位
P2=LED[i];P3=LED[j];//显示十位和个位,即用户反应时间
for(x=0;x<65000;x++);//让用户看一下他的反应时间
P11=1;count=0;//灭灯,清0
}
}
void timer1() interrupt 3 //中断服务程序
{
TH1=0xdc;
TL1=0;//重新赋值
count++;//每10ms 溢出一次,count 加一
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -