标题: 关于单片机1秒定时的疑问 [打印本页]

作者: ningsy    时间: 2022-12-19 10:28
标题: 关于单片机1秒定时的疑问
需要做一个一秒钟的倒计时功能,可以设一个1ms定时器,循环1000次,也可以设一个50ms定时器,循环20次。请问哪种时间比较准确?两种方法系统开销有差别吗?(因为还有很多其他功能,循环次数多会影响其他功能运行吗?)


作者: xianfajushi    时间: 2022-12-19 11:25
定时器误差受程序其他部分影响不小,合理的程序才能保证秒钟的准确.
作者: ytchfp163    时间: 2022-12-20 01:13
设一个单片机工作于12M晶体震荡器,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。所以设置1s定时,无论怎么设置定时器、怎么循环,理论上运行的机器周期是一样的,即总循环次数是一样的。
作者: qsssuv    时间: 2022-12-20 09:52
准确与否,看给定时器的值准不准,比如65536-11059200/12*50/1000=19456,这样定时50ms,结果是个整数。如果定时1ms,那么在计算11059200/12*1/1000=921.6,会有小数,这样就会有精度损失。
作者: 冻死的企鹅    时间: 2022-12-20 10:02
其它功能尽量不要写到中断程序里,不然会有误差
作者: 188610329    时间: 2022-12-20 10:22
如果,一上来就是奔着1秒去的,如果用的是没有重载功能89c51这种片子,则两种都不好。 应该按,第一次跑余,后面都跑满65536来设计。 如是带自动重载的定时器,则50ms较好。如果是带分频计数器这种,应直接定1秒。总之应根据使用的单片机来做合理设置。
作者: ningsy    时间: 2022-12-20 10:36
qsssuv 发表于 2022-12-20 09:52
准确与否,看给定时器的值准不准,比如65536-11059200/12*50/1000=19456,这样定时50ms,结果是个整数。如 ...

我都是用的STC-ISP定时器计算器代码,精确度怎样?11.0592M和12M主频有差别么?




作者: ningsy    时间: 2022-12-20 10:59
188610329 发表于 2022-12-20 10:22
如果,一上来就是奔着1秒去的,如果用的是没有重载功能89c51这种片子,则两种都不好。 应该按,第一次跑余 ...

现在用的是STC8G1K08(兼容STC8H1K08),定时器2,50ms 12T自动重载,STC-ISP定时器计算器的代码。用山寨逻辑分析仪测试1S方波脉宽,每次测还不一样,有时候准的很,多数时候要慢零点几毫秒。可能IRC频率自动调整误差也有影响。

您说的“分频计数器”是什么呢?我这个项目代码空间快不够了,还想用USB来升级,未来准备改成STC8H8K64U,能直接产生1秒时基吗?


void Timer2Init(void)                //50毫秒@11.0592MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式
        T2L = 0x00;                //设置定时初始值
        T2H = 0x4C;                //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
}

作者: coody_sz    时间: 2022-12-20 11:04
定时器工作于自动重装方式,1ms或50ms,精度一样,取决于晶振的精度。
作者: xunzhaod    时间: 2022-12-20 11:08
跟你循环多少次其实没多大关系,准不准看晶振,一般外部晶振可以达到0.001的误差,内部晶振1%-3%的误差。想要看看精确度,最好看看芯片手册
作者: wufa1986    时间: 2022-12-20 11:58
看你对准的要求怎样
作者: 188610329    时间: 2022-12-20 14:14
ningsy 发表于 2022-12-20 10:59
现在用的是STC8G1K08(兼容STC8H1K08),定时器2,50ms 12T自动重载,STC-ISP定时器计算器的代码。用山寨 ...

STC8G  的 定时器2 有 8位预分频(TM2PS) 寄存器,你可以直接 64分频后,直接得到1秒的 定时时间。以你现有的例子为例:
void Timer2Init(void)                //1秒@11.0592MHz
{
        AUXR &= 0xFB;                //定时器时钟12T模式
        P_SW2 |= 0x80;
        TM2PS = 63;       //64分频
        T2L = 0xC0;                //设置定时初始值 65536-1440
        T2H = 0xC7;                //设置定时初始值
        AUXR |= 0x10;                //定时器2开始计时
}
作者: ningsy    时间: 2022-12-20 16:18
188610329 发表于 2022-12-20 14:14
STC8G  的 定时器2 有 8位预分频(TM2PS) 寄存器,你可以直接 64分频后,直接得到1秒的 定时时间。以你 ...

谢谢前辈指导!我试一下。
作者: fishafish    时间: 2023-1-20 15:00
通常都是有误差的,可以在循环里放一个IO口的Toggle 语句,然后用示波器看端口输出方波波长,然后调整语句就能准确了
作者: 君工创    时间: 2023-1-21 09:29
单从对别的函数的影响来考虑的话,当然是中断的次数越少越好。
作者: 新乡家电维修    时间: 2023-1-21 13:19
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用
作者: npn    时间: 2023-1-21 15:47
定时器中断定1秒必须设为自动重装初值模式,手动重装误差大,有多个中断应设为高优先级。
作者: ningsy    时间: 2023-1-21 16:19
新乡家电维修 发表于 2023-1-21 13:19
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用

确定了,定时器最后用的是2ms时长。中断里3个标志位,1个2ms扫描EC11,1个500ms闪动数码管,1个1s给倒计时。
作者: coody_sz    时间: 2023-1-21 16:24
使用定时器,自动重装模式不会引入误差,时间精度跟晶振一致,你用一个0.01ppm的恒温晶振,年误差不超过0.3秒,我就做有这么一个。
作者: ningsy    时间: 2023-1-21 16:37
新乡家电维修 发表于 2023-1-21 13:19
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用

定时器0软件重装控制电机调速,定时器1软件重装控制液体体积倒数,定时器3自动重装扫描ec11,按键和产生500ms和1秒时基信号。3个定时器全用完了。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1