找回密码
 注册
关于网站域名变更的通知
查看: 309|回复: 5
打印 上一主题 下一主题

一个关于单片机硬件延时的疑惑

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-12-21 13:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
关于单片机的定时,在我刚刚学习的时候,都是用软件实现的.但在软件进行延时的过程中,cpu时间被白白浪费了,此时能利用cpu的只有中断.
( }7 R& Y& O* K, _. _! Z  T; u- k7 u7 \$ C3 ^$ ]( ^" p
# G3 y7 v# H- r
随着使用的深入,我越发觉得软件定时这是不是个好方法,虽然它很简单.+ O$ o* `, J, n9 [0 X

: s, b& Z5 `2 g7 x随后我对硬件定时进行了了解,发现替代的方法有个用定时器来搞的:
7 K# y: \2 w( r; I# h在定时器中断里设置一个标志位,每当定时器运行到设定的时间,就将该位置置位(定时短)或+1(定时时间较长),然后用外部程序去查询这个标志位,做判断." ?+ O. r& n* A( Y4 h7 O0 U
0 h1 U7 c8 G9 u, f, M% p0 P, b
但是我又有了个疑惑,对于后者,假如我要定时30毫秒,定时器溢出时间为1ms,标志位用8位无符号
+ w7 P# j8 |- @/ K( ^; N那到了240的时候,240+30=14 ,溢出了~ 这个怎么处理?
( r/ Z* Q- B* }" H, Z  f  R. _& h难道我把最大阈值设定为225么? 那假如我有多个不同的延时需要进行处理呢?.... 没办法呀~ 难道要设置最大延时限制值么?...0 @$ x: \  I8 F. X4 D7 L' C

* G; @( h8 Y  i* m让人很是摸不着头脑,求大家帮助一下我呀~+ i" Y+ U" |$ l- u& h$ a
$ N. t/ J( H; v( D1 V4 F9 I
---------------分割线---------------
+ ^& F" q9 z% C2 G8 S一天后更新,感谢大家的回复与指教,我看了感觉无地自容.....愧对坛龄,愧对老师....; ^+ y- g. i' K- _) c
大家的回复我都有好好看,我会好好学习的,谢谢大家3 W  E( ~7 I' x0 p, p' p0 S

该用户从未签到

3#
发表于 2021-12-21 13:57 | 只看该作者
标志位可以随时清零。
7 y6 K% h; z$ [& W等到了30ms 执行操作后,顺便清零标志位,- A5 U# u( p/ ^/ D

6 ?5 Y& `9 I! K# j6 u* A
& {- d1 r) }9 h. H4 q% v: |# G7 ?" N2 L9 @
可以设置多个变量 例如 flag_300ms = 0;  上面每次到30ms 就加一;7 m8 X9 k9 C% a( c
然后大循环里面判断flag_300ms ==9,执行操作,清零  flag_300ms

该用户从未签到

4#
发表于 2021-12-21 14:40 | 只看该作者
标志位用完要清零
4 G! Q1 N3 |  Q5 avoid timer0_int (void) interrupt 1  //1ms
3 g/ L4 t+ \, G- G6 D{
) o9 L% O2 b5 S$ \) e; C8 ~3 n        if(!TMR_01_DN)
% y5 C  Y: P% I( }          if(++TMR_01_OT>30)% h. k9 s2 k( c6 Y) X* Y
            {( d& ?$ v# _4 u, I0 O
               TMR_01_DN = 1;' A8 ?9 y$ T& G; M9 J- f$ ?
               TMR_01_OT = 0;  //clear count) Z% i! \3 T" C
            }% B( [4 o( \: M$ I
}
2 F  `% ^; R" `! r: `void main()5 z8 z) W( q- {: ~
{
1 V/ ?$ w& }' }# E' h$ R# }        if(TMR_01_DN)+ p+ W  l- Z3 [: V6 D* O! `
          {TMR_01_DN = 0;  //clear flag
, F$ K$ s$ H, o3 G$ Y            //your code
- o& i- d* u" c" B; H  K* ~8 {          }/ G: V+ B3 t6 l# H. Z
}

该用户从未签到

5#
发表于 2022-1-5 09:32 | 只看该作者
所有要延时的语句( 延时值+回调 )放入一个数组, 1ms处理一次, 延时值减1, 到0则回调函数.

该用户从未签到

6#
发表于 2022-1-5 10:44 | 只看该作者
你设置一个年月日的 结构体。  不停的去减设置时候的 年月日。差值大于多少就好NEW_year_date_Sec   - old_year_date_Sec = Time 。  
$ f4 A7 [, y8 [' C6 s! K" B3 R# I: @6 S
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-31 14:35 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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