#include <reg51.h>
unsigned char i,j,t,m,key,DelayTime,DispBuf[3];
unsigned int n;
unsigned long int c,spm;
unsigned char code
BitTab[3]={0xf7,0xef,0xdf};//位驅動碼
unsigned char code
DispTab[10]={0x81,0xcf,0x92,0x86,0xcc,0xa4,0xa0,0x8f,0x80,0x84};//字形碼
sbit P3_0=P3^0;
void delay(DelayTime);
main() //主程序
{
TMOD=0x01;//定時器T0工作于方式1
IT0=1; //外部中斷0為邊沿觸發方式
TH0=0xec;
TL0=0x78;//T0定時時間為5ms
IE=0X83; //開中斷
TR0=1; //開定時器T0
key=0;
for(;;) //鍵盤處理
{
if(key==1)
{
if(P3_0==0)
{
delay(100);
if(P3_0==0)
key=0;
}
}
else
{
if(P3_0==0)
{
delay(100);
if(P3_0==0)
key=1;
}
}
for(;P3_0==0;)
;
}
}
external0() interrupt 0//外部中斷0服務程序
{
c++;
if(key==0) //計算速度
{
if(n==0)//
spm=0;
else
spm=14904/n;
}
else //計算里程
{
spm=207*c;
spm=spm/10000;
}
n=0;
DispBuf[2]=spm%10;//取個位數
spm=spm/10;
DispBuf[1]=spm%10;//取十位數
DispBuf[0]=spm/10;//取百位數
}
Timer0() interrupt 1//定時器T0中斷服務程序
{
TH0=0xec;
TL0=0x78;
n++;
t=BitTab[j]; //取位值
P3=P3|0x38; //P3.3-P3.5送1
P3=P3&t; //P3.3-P3.5輸出取出的位值
t=DispBuf[j];//取出待顯示的數
t=DispTab[t];//取字形碼
P1=t; //字型碼由P3輸出顯示
j++; //j作為數碼管的計數器,取值0-2,顯示程序通過它確認顯示哪個數碼管
if(j==3)
j=0;
if(n>1000) //自行車停止超過5秒鐘,n復位
n=0;
}
void delay(DelayTime)//延時子程序
{
for(;DelayTime>0;DelayTime--)
{
for(i=0;i<250;i++)
;
}
|