找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时器用作延时的问题

[复制链接]
跳转到指定楼层
楼主
ID:956872 发表于 2021-9-6 21:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用单片机定时器做延时工作的时候,是不是得独立一个定时器出来专门用于中断++计数啊,该计时器中断里不能有其它要做得事,是不是还得用最高优先级得模式才能保证计时得精准?我在想要定时器用的优先级低得话,高优先级中断在跑中断里得程序时,定时器计数就没办法++了。是不是这样子?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2021-9-6 22:33 | 只看该作者
不用呀,人为的启动定时器就可以了
void timer0() interrupt
{
        Time++;    //Time为全局变量,使用Time的时候先归零
        TH0=(65535-1000)/256; //
        TL0=(65535-1000)%256; //
        TR0=1;

其它要语句;
;
;
;
}
回复

使用道具 举报

板凳
ID:451718 发表于 2021-9-6 22:46 | 只看该作者
思路是对的,理解有问题。你这个问题很难几句话说清楚, 因为,不同品牌的单片机,定时器中断的机制都有差别。 把握一个原则, 周期短的中断,优先级靠前,资源占用尽量少。  如:定时器0做1毫秒周期的中断,优先级设为最高。 里面只放一个操作systick++,最多再放一个 if(systick%1000==0)sec++
回复

使用道具 举报

地板
ID:624769 发表于 2021-9-6 23:10 | 只看该作者
用单片机定时器做延时工作的时候,
=> 定时器是用来计时的,不要用来做延时, 类似 While(!TF0); 这样的操作,还不如Delay 函数,因为定时器也是靠的内部时钟,你延时函数也是内部时钟,精准度上其实一样的。而你用While(!TF0); 这样的操作的话,其实和延时函数卡死单片机性质是一样的,还多占用一个定时器。

是不是得独立一个定时器出来专门用于中断++计数啊,该计时器中断里不能有其它要做得事,是不是还得用最高优先级得模式才能保证计时得精准?
=> 定时器,只要是自动重载,不管你定时器里面做多少事,都能保证精准。如果不是自动重载,只要进入中断后,先重置TH0,TL0, 再做其它事情,也能确保精准。

我在想要定时器用的优先级低得话,高优先级中断在跑中断里得程序时,定时器计数就没办法++了。是不是这样子?
=> 定时器计数的话,如果你的定时器有自动重载功能的话,完全不需要高优先级,你会反复计数,说明定时器定个几毫秒完全不够你用,所以,只需要最低优先级,等时间到了,定时器会置位TF0,并且开始新的一轮计时,等到你那边空下来,就会跳到中断里,继续+1,只要你其它中断,卡的时间不会超过定时器新的一次溢出,就没有任何影响。就好像我需要定时器每31.25毫秒中断计数一次, 32 次1秒。1920次一分钟的计数,就是用的最低中断,其他中断执行最多0.02毫秒,完全不会影响定时器。
回复

使用道具 举报

5#
ID:956872 发表于 2021-9-7 08:01 | 只看该作者
188610329 发表于 2021-9-6 23:10
用单片机定时器做延时工作的时候,
=> 定时器是用来计时的,不要用来做延时, 类似 While(!TF0); 这样的操作 ...

定时器里的程序不能超过一次溢出时间,应该就是我理解的 更高级中断里跑程序太长的话会影响低级定时器进中断了(前提是低优先级的定时器的溢出中断时间比高优先级里的程序时间短),造成定时计数不准的问题了。还有就是有多个中断,定时器的优先级太低的话应该也有问题。
回复

使用道具 举报

6#
ID:956872 发表于 2021-9-7 08:05 | 只看该作者
Y_G_G 发表于 2021-9-6 22:33
不用呀,人为的启动定时器就可以了
void timer0() interrupt
{

我指的是定时器的优先级,如果这个定时器做延时,优先级是最低的,是不是就会被其他高优先级的中断打断,即便这定时器时间溢出了,还得等其他高优先级中断里的程序跑完才轮到这个定时器进中断,这样是不是就造成了计数不准的问题
回复

使用道具 举报

7#
ID:956872 发表于 2021-9-7 08:08 | 只看该作者
robinsonlin 发表于 2021-9-6 22:46
思路是对的,理解有问题。你这个问题很难几句话说清楚, 因为,不同品牌的单片机,定时器中断的机制都有差 ...

刚接触51单片机,也不知道其它单片机的差别。但我对这51单片机的运行时序理解,用定时器做低延时要保证延时每次时间都一致的话,就不能让其时间溢出进中断的时候被其它中断打断
回复

使用道具 举报

8#
ID:451718 发表于 2021-9-7 11:07 | 只看该作者
PEB188 发表于 2021-9-7 08:08
刚接触51单片机,也不知道其它单片机的差别。但我对这51单片机的运行时序理解,用定时器做低延时要保证延 ...

我曾经专门做过51的定时器实验,结果很有意思。  思路在这里,你不妨自己尝试一下, 或许会有所感悟。http://www.51hei.com/bbs/dpj-207735-1.html
回复

使用道具 举报

9#
ID:451718 发表于 2021-9-7 11:14 | 只看该作者
188610329 发表于 2021-9-6 23:10
用单片机定时器做延时工作的时候,
=> 定时器是用来计时的,不要用来做延时, 类似 While(!TF0); 这样的操作 ...

用定时器做延迟是一个非常好的思路,但不是你所理解的while(!TF0) 。 一个流畅的程序结构,应尽量慎用delay函数。
回复

使用道具 举报

10#
ID:401564 发表于 2021-9-7 11:45 | 只看该作者
PEB188 发表于 2021-9-7 08:05
我指的是定时器的优先级,如果这个定时器做延时,优先级是最低的,是不是就会被其他高优先级的中断打断, ...

在定时器中断中进行Time++
通过判断Time的大小来检测延时时间到了没有,到了就执行,不到就跳过,而不是等待
至于中断优先等级什么的,不需要考虑
在所有的中断中不要有长时间的延时,不要在中断中有等待while()之类的,在中断中进行一些简单的操作就可以,比如++,或者置位标志位之类,长时间的操作在中断以外进行
你所担心时间不准确,其实是不用管的,几十条指令也就几十uS的执行时间,对于一般mS级延时是没有什么影响的
如果你想精确到几个时钟的延时,用C是真的很难的
一般来说,1mS或者以上的延时,用定时器来做的话,你只要不在其它中断中有延时,等待之类的,基本是不用考虑被高等级中断打断的
回复

使用道具 举报

11#
ID:514901 发表于 2021-9-7 17:54 | 只看该作者
如果要定时器延时准确的话,配置定时器为高优先级确实是需要的,且尽量减少定时器中断里面的代码量
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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