用PIC单片机16F883的TIM0做实时时钟,秒走的超级慢,为什么?补充里是部分程序,一分钟大概慢20多秒

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谢谢啦!

第1个回答  2011-11-22
定时器错了,你这个 TMR 不是你这样用的。 初值有个公式的。 分频比1-8 需要加上一个14/分频,这个一般公式很少注明,提醒楼主下。

最简单办法,你下个计算器,不用管怎么算的,大概几十K大小的,自己百度之。。。。追问

4M晶振,一个机器周期1us,定时器8位,我分频16:1,中断一次是16*256=4096us。当这个basesec大于50000时,ms50就加1,这样虽然每秒有误差,但都被basesec累计下来,当这个累计误差大于50000时,就一起得到修正。没问题。附初值,误差没法修正。

第2个回答  2011-11-22
没搞过PIC,告诉我晶振多大的,可以帮你想一下本回答被提问者采纳

Warning: Invalid argument supplied for foreach() in /www/wwwroot/aolonic.com/skin/templets/default/contents.html on line 45
相似回答
大家正在搜