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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
关于单片机的定时,在我刚刚学习的时候,都是用软件实现的.但在软件进行延时的过程中,cpu时间被白白浪费了,此时能利用cpu的只有中断.0 a: @3 v/ a- }* t  X
3 c" L/ f! a+ v' I  {7 L

# H3 ^1 O( F  Q/ q随着使用的深入,我越发觉得软件定时这是不是个好方法,虽然它很简单.
& i8 t" {: L3 e$ R7 X5 J: p, l' e/ A6 E) E6 y: q5 e
随后我对硬件定时进行了了解,发现替代的方法有个用定时器来搞的:
) e2 `. o9 U$ M/ g在定时器中断里设置一个标志位,每当定时器运行到设定的时间,就将该位置置位(定时短)或+1(定时时间较长),然后用外部程序去查询这个标志位,做判断.- R% n8 D) j; j' r

4 Y5 ^. r5 C" n5 v7 u: a0 ]' I3 K但是我又有了个疑惑,对于后者,假如我要定时30毫秒,定时器溢出时间为1ms,标志位用8位无符号
6 h# e5 Z% p# ^& O5 J/ Z) p那到了240的时候,240+30=14 ,溢出了~ 这个怎么处理?" e* m- Q. o9 P; Q) u( c! T1 T7 D
难道我把最大阈值设定为225么? 那假如我有多个不同的延时需要进行处理呢?.... 没办法呀~ 难道要设置最大延时限制值么?...; @1 a" E& l6 {: {

5 p9 E1 Z& ^8 s让人很是摸不着头脑,求大家帮助一下我呀~8 s- ], W0 Y5 ^. B  d1 w% G1 y2 D

  A+ }. o# c. ]---------------分割线---------------
) V2 J- ?2 M9 M* p( t1 y一天后更新,感谢大家的回复与指教,我看了感觉无地自容.....愧对坛龄,愧对老师....- I% R$ {+ F+ I5 G7 D
大家的回复我都有好好看,我会好好学习的,谢谢大家
- F2 d: b% B1 z

该用户从未签到

3#
发表于 2021-12-21 13:57 | 只看该作者
标志位可以随时清零。& l9 E- o" n. ]. I
等到了30ms 执行操作后,顺便清零标志位,' ]4 ]) p7 F7 x$ V6 q

/ h1 `& L$ S6 w) x4 \& u
2 u: p. n; S, t- r0 u! V$ q* ]( U5 _
可以设置多个变量 例如 flag_300ms = 0;  上面每次到30ms 就加一;
+ E% b/ W5 G! j/ L* [6 l: l然后大循环里面判断flag_300ms ==9,执行操作,清零  flag_300ms

该用户从未签到

4#
发表于 2021-12-21 14:40 | 只看该作者
标志位用完要清零5 Y- z5 [$ Y$ g% t9 R% Y
void timer0_int (void) interrupt 1  //1ms
6 p/ C, G0 _6 @, l# M/ W{. @* ~: g* ?9 r% v0 P! @$ W
        if(!TMR_01_DN)2 {2 `0 E2 e4 H7 h
          if(++TMR_01_OT>30)
* o, X" z3 l3 K  ?            {
8 b4 d  b6 d: p" I( U* H               TMR_01_DN = 1;
4 l5 n' S! F8 W. v               TMR_01_OT = 0;  //clear count
) L1 R$ Z0 A4 ^9 f# e            }$ p: w6 P/ c; i4 ~& V3 [) G
}
+ \$ @, U+ ^) g) z6 ]% Ivoid main()
  S# G- G3 l% D' @% V{, |7 {# k  N  w7 @8 j: ?/ ^# r
        if(TMR_01_DN)
1 Q5 j8 w1 C. b: c$ _: {8 J* F          {TMR_01_DN = 0;  //clear flag
: k! M5 K+ @; F, [& w7 S            //your code5 p) L' \" F2 |5 [& W2 ?
          }( d' Y3 `, s4 d: l# Z, t1 [$ u# O+ e
}

该用户从未签到

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

该用户从未签到

6#
发表于 2022-1-5 10:44 | 只看该作者
你设置一个年月日的 结构体。  不停的去减设置时候的 年月日。差值大于多少就好NEW_year_date_Sec   - old_year_date_Sec = Time 。  
( m4 W' {0 {: E5 a0 q$ k2 o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-9-30 01:00 , Processed in 0.125000 second(s), 23 queries , Gzip On.

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

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

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