求助:STC 单片机使用定时器 定时1S

2019-07-16 03:38发布

    请问各位朋友,怎么我用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;
                                }
                        }
                }
        }
}


哪位朋友能帮忙看一下。谢谢!

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
caokyo
1楼-- · 2019-07-16 08:46

        TL0 = 0x00;                //设置定时初值
        TH0 = 0xC4;                //设置定时初值

复制代码
在ISR里面这样处理是有误差的. 因为这时候TL0/TH0已经不是0
sunnyking
2楼-- · 2019-07-16 09:31

用C语言校准很蛋疼的。。。我觉得需要根据反汇编出来的代码调整(这个我只是猜测,没有试过)
涉及到精确的计时,我都是用汇编。。。
yuankangdi
3楼-- · 2019-07-16 09:56
不懂,努力学习中,帮你顶下。
3htech
4楼-- · 2019-07-16 14:42
 精彩回答 2  元偷偷看……
往事只能回首
5楼-- · 2019-07-16 18:56
中断中设定定时初值时,可以先关定时器,设定后再开定时器,设定值在计算值基础上加12(根据精度调节),另外如果其他方面能接受,10ms中断改成40ms中断,定时装载的误差可以更小。另外普通晶振稳定度是100ppm,极限误差2个多小时1秒。
ronga245
6楼-- · 2019-07-16 21:31
晕死,用时钟芯片精度并不见得会高,你现在用的也是晶振,时钟芯片上用的也是晶振
精度高低完全取决于所用晶振的精度
如果你用的晶振精度高于时钟芯片上的晶振,你完全可以获得更好的计时精度
软件上完全可以做到没有误差,也没有什么累积误差
在中断中重设定时器初值的方法不是很好,需要修正,还要防止更高级中断打断,用c语言写程序时不方便修正等等
你完全可以用16位方式,不需要重新设置初值
这样一来定时器中断频率是18432000/12/256/256=6000/256
也就是说6000次循环时间是256秒
你在你的中断函数中设置一个静态变量,每次加上256,发现大于6000就减去6000,同时秒数加1
这样的程序不管是c还是汇编都很容易实现,也没有累积误差
也不需要特殊调整

一周热门 更多>