找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2044|回复: 19
打印 上一主题 下一主题
收起左侧

关于单片机1秒定时的疑问

  [复制链接]
跳转到指定楼层
楼主
需要做一个一秒钟的倒计时功能,可以设一个1ms定时器,循环1000次,也可以设一个50ms定时器,循环20次。请问哪种时间比较准确?两种方法系统开销有差别吗?(因为还有很多其他功能,循环次数多会影响其他功能运行吗?)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:332444 发表于 2022-12-19 11:25 | 只看该作者
定时器误差受程序其他部分影响不小,合理的程序才能保证秒钟的准确.
回复

使用道具 举报

板凳
ID:1056573 发表于 2022-12-20 01:13 | 只看该作者
设一个单片机工作于12M晶体震荡器,它的时钟周期是1/12(微秒)。它的一个机器周期是12*(1/12)也就是1微秒。所以设置1s定时,无论怎么设置定时器、怎么循环,理论上运行的机器周期是一样的,即总循环次数是一样的。
回复

使用道具 举报

地板
ID:353115 发表于 2022-12-20 09:52 | 只看该作者
准确与否,看给定时器的值准不准,比如65536-11059200/12*50/1000=19456,这样定时50ms,结果是个整数。如果定时1ms,那么在计算11059200/12*1/1000=921.6,会有小数,这样就会有精度损失。
回复

使用道具 举报

5#
ID:1058360 发表于 2022-12-20 10:02 | 只看该作者
其它功能尽量不要写到中断程序里,不然会有误差
回复

使用道具 举报

6#
ID:624769 发表于 2022-12-20 10:22 来自手机 | 只看该作者
如果,一上来就是奔着1秒去的,如果用的是没有重载功能89c51这种片子,则两种都不好。 应该按,第一次跑余,后面都跑满65536来设计。 如是带自动重载的定时器,则50ms较好。如果是带分频计数器这种,应直接定1秒。总之应根据使用的单片机来做合理设置。
回复

使用道具 举报

7#
ID:1044091 发表于 2022-12-20 10:36 | 只看该作者
qsssuv 发表于 2022-12-20 09:52
准确与否,看给定时器的值准不准,比如65536-11059200/12*50/1000=19456,这样定时50ms,结果是个整数。如 ...

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



回复

使用道具 举报

8#
ID:1044091 发表于 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开始计时
}
回复

使用道具 举报

9#
ID:1034262 发表于 2022-12-20 11:04 | 只看该作者
定时器工作于自动重装方式,1ms或50ms,精度一样,取决于晶振的精度。
回复

使用道具 举报

10#
ID:839835 发表于 2022-12-20 11:08 | 只看该作者
跟你循环多少次其实没多大关系,准不准看晶振,一般外部晶振可以达到0.001的误差,内部晶振1%-3%的误差。想要看看精确度,最好看看芯片手册
回复

使用道具 举报

11#
ID:879348 发表于 2022-12-20 11:58 | 只看该作者
看你对准的要求怎样
回复

使用道具 举报

12#
ID:624769 发表于 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开始计时
}
回复

使用道具 举报

13#
ID:1044091 发表于 2022-12-20 16:18 | 只看该作者
188610329 发表于 2022-12-20 14:14
STC8G  的 定时器2 有 8位预分频(TM2PS) 寄存器,你可以直接 64分频后,直接得到1秒的 定时时间。以你 ...

谢谢前辈指导!我试一下。
回复

使用道具 举报

14#
ID:1059013 发表于 2023-1-20 15:00 | 只看该作者
通常都是有误差的,可以在循环里放一个IO口的Toggle 语句,然后用示波器看端口输出方波波长,然后调整语句就能准确了
回复

使用道具 举报

15#
ID:965189 发表于 2023-1-21 09:29 | 只看该作者
单从对别的函数的影响来考虑的话,当然是中断的次数越少越好。
回复

使用道具 举报

16#
ID:72088 发表于 2023-1-21 13:19 | 只看该作者
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用
回复

使用道具 举报

17#
ID:57657 发表于 2023-1-21 15:47 | 只看该作者
定时器中断定1秒必须设为自动重装初值模式,手动重装误差大,有多个中断应设为高优先级。
回复

使用道具 举报

18#
ID:1044091 发表于 2023-1-21 16:19 | 只看该作者
新乡家电维修 发表于 2023-1-21 13:19
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用

确定了,定时器最后用的是2ms时长。中断里3个标志位,1个2ms扫描EC11,1个500ms闪动数码管,1个1s给倒计时。
回复

使用道具 举报

19#
ID:1034262 发表于 2023-1-21 16:24 | 只看该作者
使用定时器,自动重装模式不会引入误差,时间精度跟晶振一致,你用一个0.01ppm的恒温晶振,年误差不超过0.3秒,我就做有这么一个。
回复

使用道具 举报

20#
ID:1044091 发表于 2023-1-21 16:37 来自手机 | 只看该作者
新乡家电维修 发表于 2023-1-21 13:19
你要是会点单片机知识就不会问了,延时是最基层的入门程序。你不会告诉你也不会用

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表