请问各位朋友,怎么我用STC单片机定时器 来定时 1S 怎么误差这么大, 10 多分钟下来相差了 10 多秒。
我使用的晶振是 18.432 M 的,请问各位如何才能更精确的定时到 1S。
下面是我的代码
定时器初始化部分还是使用官方的软件计算的。
void timer0Init(void) //10毫秒@18.432MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xC4; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
中断部分
void Timer0_ISR(void) interrupt 1
{
static timer_ms = 0;
TL0 = 0x00; //设置定时初值
TH0 = 0xC4; //设置定时初值
timer_ms ++;
if (timer_ms >= 100)
{
timer_ms = 0;
sys_timer.timer.S ++; /*-- 秒--*/
if (sys_timer.timer.S > 59)
{
sys_timer.timer.S = 0;
sys_timer.timer.M ++; /*-- 分--*/
if (sys_timer.timer.M > 59)
{
sys_timer.timer.M = 0;
sys_timer.timer.H ++; /*-- 时--*/
if (sys_timer.timer.H > 23)
{
sys_timer.timer.H = 0;
}
}
}
}
}
哪位朋友能帮忙看一下。谢谢!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
TL0 = 0x00; //设置定时初值
TH0 = 0xC4; //设置定时初值
复制代码
在ISR里面这样处理是有误差的. 因为这时候TL0/TH0已经不是0
用C语言校准很蛋疼的。。。我觉得需要根据反汇编出来的代码调整(这个我只是猜测,没有试过)
涉及到精确的计时,我都是用汇编。。。
精度高低完全取决于所用晶振的精度
如果你用的晶振精度高于时钟芯片上的晶振,你完全可以获得更好的计时精度
软件上完全可以做到没有误差,也没有什么累积误差
在中断中重设定时器初值的方法不是很好,需要修正,还要防止更高级中断打断,用c语言写程序时不方便修正等等
你完全可以用16位方式,不需要重新设置初值
这样一来定时器中断频率是18432000/12/256/256=6000/256
也就是说6000次循环时间是256秒
你在你的中断函数中设置一个静态变量,每次加上256,发现大于6000就减去6000,同时秒数加1
这样的程序不管是c还是汇编都很容易实现,也没有累积误差
也不需要特殊调整
一周热门 更多>