#include <STC89C5xRC.H>void delay()//用定时器0实现10ms精准定时
{TMOD = 0x01;TH0 = 0xd8;TL0 = 0xf0;//65536 - 10000 = 55536TF0 = 0;//置溢出标志位为0TR0 = 1;//开启定时器0while(TF0 == 0);TR0 = 0;//暂停定时器0
}void disp_digit(int d)
{unsigned char code DIG_CODE[10] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};//显示个位数P2 = 0;// P2 = 0 -> (P24, P23, P22) = (0, 0, 0) -> 右数第一个数字点亮P0 = DIG_CODE[d % 10];delay();//10ms精准定时//显示十位数P2 = 1 << 2;//P2 = 0000 0100 -> (P24, P23, P22) = (0, 0, 1) -> 右数第二个数字点亮P0 = DIG_CODE[d / 10];delay();//10ms精准定时
}int main()
{int i;int sec;while(1){sec = 15;//计数初始值while(sec >= 0){for(i = 0; i < 50; i++){disp_digit(sec);//花费大约20ms}//20ms*50=1000ms=1ssec --;//显示组合数字减1}}return 0;
}
肯定有和我一样好奇心强的朋友会问到, 这里提供的倒计时器是完全没有误差的吗(因为晶振提供的频率很准确), 答案是有的. 那么为什么会有误差呢:
比如这里,
TMOD = 0x01;
TH0 = 0xd8;
TL0 = 0xf0;//65536 - 10000 = 55536
TF0 = 0;//置溢出标志位为0
TR0 = 1;//开启定时器0
在开启定时器0前的诸多语句都是要耗费掉一定时间的, 只不过这时间量级较10ms来说不足以比较, 所以我们在短时间内是感受不到这误差的.