?? text1.c
字號:
/* 反應(yīng)速度測試儀
P2,P3分別接的數(shù)碼管做為十位和個位。
P1.0與按鍵相接于GND.
P1.1接發(fā)光二極管做為指示燈,管腳低電平時亮
定時器0工作于方式2,自動重裝,按鍵后取隨機數(shù)
定時器1工作于方式1,計算反應(yīng)時間,晶振為11.0592*/
#include <reg51.h>//51單片機頭文件
#define uchar unsigned char//宏定義,用uchar 代表 usigned char(無符號字符型數(shù)據(jù))
#define uint unsigned int
#define ulong unsigned long
sbit P10=P1^0;//用P10表示P1口第0個管腳
sbit P11=P1^1;
uchar count;//全局變量,標(biāo)記定時器溢出多少次
uchar code LED[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00};//這些數(shù)組放到數(shù)碼管里就顯示0-9,全滅全亮
//LED[10]表示LED數(shù)組的第10個數(shù)。數(shù)碼管為共陰極,管腳高電平對應(yīng)數(shù)碼管的一位亮起
void delay(ulong n)//延時子程序
{
uint m;//定義m 為無符號整型變量
for(m=0;m<30000;m++); //單片給m做加一運算,直到m<30000,其實就是延時去除
//按鍵抖動,因為此延時是檢測到按鍵后立即執(zhí)行,鍵其實依然被按著
while(n--)//當(dāng)n大于0時下面的語句循環(huán)
{
if(P10==0)//P10接的是一個按鍵,當(dāng)P10==0時,說明鍵被按下
{
P2=LED[10];
P3=LED[10];//說明用戶在發(fā)光二極管未亮?xí)r按下鍵,數(shù)碼管顯示全滅
}
}
}
void main()//主函數(shù)
{
uchar i,j,k;
uint x;
TMOD=0x12;//定時器1工作于方式1,//定時器0工作于方式2
TH0=0;TL0=0;//定時器0計數(shù)初值,定時器0用于是產(chǎn)生隨機數(shù)
TH1=0xdc;TL1=0;//定時器1計數(shù)初值
TR0=0;//開啟定時器0
EA=1;//開啟總中斷
ET1=1;//開啟定時器1中斷
while(1)//實際程序總是在這里循環(huán)
{
TR1=0;//關(guān)閉定時器1
TH1=0xdc;TL1=0;//重置定時器1計數(shù)初值
while(1)//以下語v句循環(huán)
{
P2=LED[10];P3=LED[10];//P2,P3分別接的十位和個位,現(xiàn)在全滅
if(P10==0)//如果鍵被按下
{
x=TL0;//取隨機數(shù)
P2=LED[0];P3=LED[0];//十位和個位顯示00
break;//跳出while循環(huán),不僅僅是跳出if
}
}
delay(3000*(30+50*x));//根據(jù)隨機數(shù)來延時
P11=0;//P11接的是一個發(fā)光二極管,低電平亮
TR1=1;//開啟定時器1,開始計算用戶反應(yīng)時間
while(1)//循環(huán)
{
if(P10==0)break;//用戶反應(yīng)過來了。
}
k=count%100;//對count求100的余,賦值給k
i=k/10%10;//十位
j=k%10;//個位
P2=LED[i];P3=LED[j];//顯示十位和個位,即用戶反應(yīng)時間
for(x=0;x<65000;x++);//讓用戶看一下他的反應(yīng)時間
P11=1;count=0;//滅燈,清0
}
}
void timer1() interrupt 3 //中斷服務(wù)程序
{
TH1=0xdc;
TL1=0;//重新賦值
count++;//每10ms 溢出一次,count 加一
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -