|
今天在做用計時器代替delay函數(shù)的數(shù)碼管程序,從99開始倒計時。剛開始的時候99能正常顯示,98開始后面的大多數(shù)都不能正常顯示,偶爾個別數(shù)有可以正常顯示,這是為什么?下面是代碼和proteus仿真圖。順便問一下,做項目的時候幾乎都是拋棄delay函數(shù),用計時器的嗎?那計時器會不夠用的吧?謝謝各位
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uint n,time=99; //n:50ms計數(shù)變量;time:時間變量
uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰極數(shù)碼管編碼
uchar table1[]={0xfe,0xfd}; //位選信號
uint index; //位選變量
void init(){
TMOD=0x11;
TH0=(65536-46080)/256; //計時器0計時50ms,20個周期為1s
TL0=(65536-46080)%256;
TH1=0xfc; //計時器1計時1ms,1ms到則顯示下一位數(shù)碼管
TL1=0x66;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
}
void ledscan(uint time){
switch(index){ //根據(jù)位選變量選擇段選信號
case 0:P0=table[time/10];
break;
case 1:P0=table[time%10];
break;
default:break;
}
P2=table1[index]; //根據(jù)位選變量選擇位選信號
index++;
if(index>1) //位選只有0,1兩種情況,超過1則清零
index=0;
}
void main(){
init();
while(1){
if(n==20){ //20個50ms為1s
n=0;
time--;
if(time==-1)
time=99;
}
}
}
void timer_0()interrupt 1{
TH0=(65536-46080)/256; //50ms到則50ms計數(shù)變量+1
TL0=(65536-46080)%256;
n++;
}
void timer_1()interrupt 3{ //1ms到則顯示下一位
TH1=0xfc;
TL1=0x66;
ledscan(time);
}
|
|