EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率. 因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发? 在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,每个任务的变量通过一个全局结构体来定义,当然这个结构体必须包括这个计数溢出值。每到一个定时器中断,各个任务计数器都加一,然后检查计数器是否溢出,如果计数溢出就执行相应的任务,同时将此任务的计数器值清零,,如果溢出执行相应的任务,如果没有,则此任务就不执行!但一定要注意在中断程序,千万不能有死循环,如果有等待一定要进行超时检测,来避免死机! 这里举个例子,刚刚成思路,因此写的不是很好!这个程序使用一个4连体数码管显示从DS18B20中采集的温度值,4位连体数码管当然只能使用动态扫描方法来显示数据,并且这个动态扫描不能在主程序中执行,因为在主程序动态扫描效果很容易收到中断程序的影响,而使显示效果下降,因此必须使用定时器来控制延时实现动态扫描,但是ds18b20的读写时序对延时的精度要求也是相当高的,如果在主程序中,中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰,而不能采集正确的数据!因此DS18b20采集数据的程序也不能够放在主程序中,当然我们可以使用两个定时器来实现!这里我们使用一个定时器来实现,由于DS18B20温度转换时间比较长12位精度的温度转换需要接近1秒的时间,这对动态扫描是无法容忍的,可行的办法是将启动转换,读取温度值放在同一个中断的不同状态,也就是在任务中实现状态机,从而避免了在中断中出现长时间的等待,而影响系统的性能!以下中断函数的具体实现: void interrupt main_int()
% G4 `4 N8 x7 i+ i; b( E{
* ^5 W Q- M, A) {2 j// t0_int(&data) ;
- D( B* Z5 K( _$ |0 Y* ^ uchar tl ,th ;! S4 w# Z5 x7 @/ _& f
uint temp ;
2 D8 i( W+ A! e9 c. l/ ^: N if(T0IF)# o$ d! t% `! g; H: h" N
{
& Y/ f( t9 w* _# [* G7 y5 p3 g T0IF=0 ;" H& q: L) f4 _% A9 X
(ds.count)++ ;: |5 G: J- G) h' T, O7 K; x, a$ e3 }
if(ds.count==80)
/ o; g1 I$ e. G1 p7 i* } {! B$ b/ Y6 m5 v* I" D, q
ds.count=0 ;! E* T% ^ s* l D
switch(ds.state)
: e7 E. {* Q B- Y& B; Q: t% s {
8 E: N) ]1 D- O# Q5 v+ F3 H* v case 0 :
, U) q7 N# l2 K! K0 V, B- Q# @ ds.state=1 ;3 v3 Y$ I/ v0 ] c
init_ds18b20() ;! R; U( ]1 M7 i8 V) Q7 F
write_ds18b20(ROM_SKIP) ;
3 a0 p/ _7 R6 ]; {& _9 C2 m write_ds18b20(MEM_CONVERT) ;
9 O3 P9 G+ m$ e }) _ break ;
$ A- @: v" |3 ~: [$ a1 | case 1 :
2 A; X6 J, K3 f init_ds18b20() ;0 z% h/ F9 S ]0 a6 ], `' D5 J
write_ds18b20(ROM_SKIP) ;
: Q7 P, c* B) J: o write_ds18b20(MEM_READ) ;1 N6 T9 F+ w# U3 }
tl=read_ds18b20() ;- ]6 V2 T1 A7 o# A9 ?
th=read_ds18b20() ; + o7 v# m7 {8 ^) A9 x0 Q
if(!(th&0xf0))8 _& V. g+ A- u( O. p+ {) x
{" B! Q" W& |3 |2 k A" U
th=th&0x07 ;
$ U) F, N/ d9 _( e2 O5 M temp=th*256+tl ;
9 G, B1 m7 j3 x! q3 J ds.data=temp/16 ;- y! D! }8 Q! C; w; l
}
) O. a$ M8 `6 L! K/ }) ~0 v else0 D2 q+ n& g9 X& t/ \& U2 _/ _
{ th=th&0x07 ;* i/ z; d/ j0 d* m, Z8 \
temp=th*256 +tl ;- ]) g" _1 B' \9 _
ds.data=temp/16 ;
% S7 v; `& H& C" q% U& K! s$ G }
; c; p: x2 W3 ?! C4 U# U ds.state=0 ;9 z! R4 e1 B3 K2 i; {2 G H# w- m5 I' Y
break ;
7 m2 V: d; l' P& l default :
4 d& A6 `4 l1 P1 X# b/ ` ds.state=0 ;
' N" }" d* R! K9 O break ;' J2 z4 g r" S4 k+ s4 x9 C( a7 G
}# C, w' `2 z, b0 O+ q
}+ r3 v- T7 b7 W( X$ x5 n
int_display1(ds.data) ;
7 A, [. a) ]4 X TMR0=210 ;$ X2 |$ g. \) @$ U
}$ G+ R. r! ~2 D/ V1 j) R8 N* D
} " H" n% O( F; z8 D
|