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

单片机通过定时器来实现多任务,充分利用定时器资源来实现异步处理

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率.
因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发?
在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,每个任务的变量通过一个全局结构体来定义,当然这个结构体必须包括这个计数溢出值。每到一个定时器中断,各个任务计数器都加一,然后检查计数器是否溢出,如果计数溢出就执行相应的任务,同时将此任务的计数器值清零,,如果溢出执行相应的任务,如果没有,则此任务就不执行!但一定要注意在中断程序,千万不能有死循环,如果有等待一定要进行超时检测,来避免死机!
这里举个例子,刚刚成思路,因此写的不是很好!这个程序使用一个4连体数码管显示从DS18B20中采集的温度值,4位连体数码管当然只能使用动态扫描方法来显示数据,并且这个动态扫描不能在主程序中执行,因为在主程序动态扫描效果很容易收到中断程序的影响,而使显示效果下降,因此必须使用定时器来控制延时实现动态扫描,但是ds18b20的读写时序对延时的精度要求也是相当高的,如果在主程序中,中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰,而不能采集正确的数据!因此DS18b20采集数据的程序也不能够放在主程序中,当然我们可以使用两个定时器来实现!这里我们使用一个定时器来实现,由于DS18B20温度转换时间比较长12位精度的温度转换需要接近1秒的时间,这对动态扫描是无法容忍的,可行的办法是将启动转换,读取温度值放在同一个中断的不同状态,也就是在任务中实现状态机,从而避免了在中断中出现长时间的等待,而影响系统的性能!以下中断函数的具体实现:
void interrupt main_int()+ m# H4 _" K  d* @' H  ~( l2 s
{) t: f9 H2 y5 d9 t, A# p; r
// t0_int(&data) ;
/ P" b: E7 j2 K- R  `- \4 \ uchar tl ,th ;/ C( D! d% r& A2 g; x5 Z/ {1 t
uint temp ;+ g" e! a: P4 g# J) T6 c
if(T0IF)+ y9 _9 P4 Y2 d0 n. g4 c
{6 L+ x) A- K6 ^6 i0 j
  T0IF=0 ;
$ c$ h# v7 H& \$ ?8 L  I! W6 [. l  (ds.count)++ ;: i- [9 s4 `, ?! J6 X" r% T7 X
  if(ds.count==80)
: a( H/ O3 W% ]8 c6 X, }  {: Z$ ?/ B8 x- f4 Q0 |9 I, f( J: {
   ds.count=0 ;
7 m6 A' h1 i$ C5 e7 q7 y   switch(ds.state)
3 k6 p5 T9 [  C+ E8 l4 p$ i   {
! r5 l+ p" F0 z6 Q' B/ P    case 0 :# l  r. R! `: P1 J
     ds.state=1 ;
# n6 W6 z0 u1 _% r     init_ds18b20() ;
, n3 _& ~! f3 |: E1 `8 `     write_ds18b20(ROM_SKIP) ;
4 {4 W# {* w" J# j- Q) [, P     write_ds18b20(MEM_CONVERT) ; 7 N/ v! Z; o- x( c5 y2 T
     break ;
2 _5 k( c* ^/ I7 s4 R2 O    case 1 :- z1 g' t. q( e% D, u% v
     init_ds18b20() ;/ h5 B1 N$ R) j0 J$ B) `& v
     write_ds18b20(ROM_SKIP) ;
2 t' e& i0 M0 y& c* c     write_ds18b20(MEM_READ) ;
+ ?6 E: U+ A$ T1 U     tl=read_ds18b20() ;
( ^/ e' c+ _  J8 I     th=read_ds18b20() ; ; D0 @3 l- ~; B7 i, P2 N
     if(!(th&0xf0))8 [, N9 G1 B$ {
     {
+ L4 K$ ]( c1 r* |) a, ~5 x      th=th&0x07 ;6 M6 z, J% a* v% _, f3 _' }
      temp=th*256+tl ;. p1 v, q! e) p9 {8 A3 a9 [
      ds.data=temp/16 ;
# A5 Y5 U' _2 x0 O* K     } - E0 p  l: d. [
     else
4 E9 S+ \4 v! s, ]' L/ y1 x+ y     { th=th&0x07 ;
2 N5 M+ e6 Z2 {5 n      temp=th*256 +tl ;
/ o/ X4 @5 V, z, j! }# |      ds.data=temp/16 ;& G, b( `, ^: N1 ~
     }
' H# \; J& N. N     ds.state=0 ;+ i' q2 O; O4 Z% ^% X7 G+ _
     break ;
7 o" T3 D1 O9 |' i! S9 y& Z    default :
# m$ W% s8 z( r( C5 g5 @     ds.state=0 ;" |, [- V* u9 f1 \6 m$ z
     break ;7 P" r: v, [6 P; @
   }! x+ X- f/ m% s' C2 F
  }
$ J  W* G8 J8 x3 c: e  int_display1(ds.data) ;4 U+ \4 G& A+ |1 Y
  TMR0=210 ;
$ N3 [- L- W; \3 q/ p }
& ]5 X; s% e/ V1 M}

5 k0 [$ n6 N2 z6 A- r2 j5 J1 x: n

该用户从未签到

2#
发表于 2020-12-2 09:50 | 只看该作者
定时器很重要,是基础
  • TA的每日心情
    开心
    2023-5-15 15:14
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2020-12-2 14:04 | 只看该作者
    现在定时器配置比较方便
  • TA的每日心情

    2019-11-20 15:16
  • 签到天数: 1 天

    [LV.1]初来乍到

    4#
    发表于 2020-12-2 15:29 | 只看该作者
    可以在软件的帮助下,让软件配置

    该用户从未签到

    5#
    发表于 2021-1-18 23:19 | 只看该作者
    感谢楼主分享66666666
  • TA的每日心情
    开心
    2020-4-4 15:57
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
    发表于 2021-1-26 16:44 | 只看该作者
    现在定时器配置比较方便

    该用户从未签到

    8#
    发表于 2021-2-1 20:25 | 只看该作者
    感谢楼主分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

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

    EDA365公众号

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

    GMT+8, 2025-10-10 11:42 , Processed in 0.140625 second(s), 23 queries , Gzip On.

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

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

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