void interrupt time0()
{
if(T0IE && T0IF) //判断是否timer0中断
{
T0IF=0;
basesec+=0x1000;
}
}
void main(void)
{
PORT_init();
TIME0_init();
GIE = 1; //全局终端允许位;使能所有未屏蔽中断;
while(1)
{
if(basesec>50000)
{
basesec-=50000;
ms50++;
if(ms50==20)
{
ms50=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
}
void TIME0_init(void)
{
OPTION=0XD3; //设16分频比
TMR0=0X00; //定时器赋初值
T0IE=1; //使能timer0中断
T0IF=0; //定时器中断标志置0
}
晶振是 4.0M谢谢啦!
4M晶振,一个机器周期1us,定时器8位,我分频16:1,中断一次是16*256=4096us。当这个basesec大于50000时,ms50就加1,这样虽然每秒有误差,但都被basesec累计下来,当这个累计误差大于50000时,就一起得到修正。没问题。附初值,误差没法修正。