急求大神给答案..急急急
电子秒表设计:用四位LED数码管作显示器的电子秒表,计时精度为0.1秒,显示格式为:分一位,秒两位,十分之一秒一位,分和秒、秒和十分之一秒之间加小数点分隔。比如:5分27.3秒显示为:5.27.3。按一下按钮启动计时器每十分之一秒加一,再按一下该按钮停止计时,再按一下按钮,数字回到”0.00.0”,如此周而复始。(晶振频率为12MHz)
#include <REG51.H>
#define U8 unsigned char
U8 tab[]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
U8 scn[]={0x7f,0xbf,0xdf,0xef};//先点亮左边一个数码管
U8 buf[4]={0,0,0,0};// 显示缓冲区,开机先显示"0000"
U8 cnt = 0; // 扫描计数
void main(void)
{ EA = 1; // 允许中断
TMOD = 0x01; // 设定时器0为模式1(16位)
ET0 = 1; // 定时器0中断允许
TH0 = 0xee; // 晶振11.0592MHz,5mS
TL0 = 0;
TR0 = 1; // 开始计数
while(1); // 死循环,等待中断
}
void timeint(void) interrupt 1 // 定时器0中断服务程序
{ char i;
TH0 = 0xee; // 设置定时器时间常数
TL0 = 0;
i = cnt & 0x03; // 求应点亮的LED号(从左到右依次为 0,1,2,3)
P0 = tab[buf[i]]; // 笔划代码送P0口
P2 = scn[i]; // 控制扫描码送P2口
if(cnt==200)
{ cnt=0; // 到1秒钟,显示的数字加一
for(i=3;i>=0;i--)
{ buf[i]++;
if(buf[i]==10) buf[i]=0;// 加到10向前进位
else break;
}
}
cnt++;
}