EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在单片机系统中,有许多情况下需要等待某个事件的发生,来继续下一步操作,如果有一个任务还好说,单片机可以无限等待事件的发生,但是如果单片机要处理多个事件时,这种系统一般不能实现,除非用中断,对!用中断,但是中断源的数量是有限的,并且有很多中断源是针对特殊用处,这样能给我自由分配的中断源就只有定时器中断和外部中断,如果仅使用这几个中断源来实现异步,这样可实现的异步事件时非常有限的,每个中断源完成一个异步事件,效率是相当低,大大降低了系统的性能,降低了定时器的利用率. 因此在这里我考虑使用定时器中断来实现多个事件的异步,一个定时器如何实现多个任务的并发? 在这里使用一个任务一个计数器,根据任务实时性的强弱,来设计任务计数器的计数溢出值,每个任务的变量通过一个全局结构体来定义,当然这个结构体必须包括这个计数溢出值。每到一个定时器中断,各个任务计数器都加一,然后检查计数器是否溢出,如果计数溢出就执行相应的任务,同时将此任务的计数器值清零,,如果溢出执行相应的任务,如果没有,则此任务就不执行!但一定要注意在中断程序,千万不能有死循环,如果有等待一定要进行超时检测,来避免死机! 这里举个例子,刚刚成思路,因此写的不是很好!这个程序使用一个4连体数码管显示从DS18b20中采集的温度值,4位连体数码管当然只能使用动态扫描方法来显示数据,并且这个动态扫描不能在主程序中执行,因为在主程序动态扫描效果很容易收到中断程序的影响,而使显示效果下降,因此必须使用定时器来控制延时实现动态扫描,但是ds18b20的读写时序对延时的精度要求也是相当高的,如果在主程序中,中断程序造成的延时必然会对ds18b20采集数据的延时精确度造成干扰,而不能采集正确的数据!因此DS18b20采集数据的程序也不能够放在主程序中,当然我们可以使用两个定时器来实现!这里我们使用一个定时器来实现,由于DS18B20温度转换时间比较长12位精度的温度转换需要接近1秒的时间,这对动态扫描是无法容忍的,可行的办法是将启动转换,读取温度值放在同一个中断的不同状态,也就是在任务中实现状态机,从而避免了在中断中出现长时间的等待,而影响系统的性能!以下中断函数的具体实现: void interrupt main_int()
; [0 O3 b) X$ G5 S5 b{
5 O: @, n* l1 N( m7 D7 _$ t// t0_int(&data) ;
3 t4 g* v ]8 U4 T) \" Yuchar tl ,th ;
, J7 a$ W# C. Cuint temp ;
. t* ^. t$ z iif(T0IF)
9 M/ c0 w, ?7 a9 x) v{' Z& V' w s: p6 I
T0IF=0 ;0 L8 T4 \" E. C8 u( J h/ {
(ds.count)++ ;- J, M$ y# I+ _9 ?: \4 h9 R' k
if(ds.count==80)
$ l+ b% ^5 p7 v6 p6 V {
+ V5 U! O6 _: F ds.count=0 ;1 i/ `7 g1 e$ c7 e0 y
switch(ds.state)4 ~7 E3 b% B9 S* M& ]+ G; S
{
' y4 e c& W: O& w case 0 :4 M1 [! |$ W- u
ds.state=1 ;
: P) K: S* |1 r" ]8 C init_ds18b20() ;
. f8 ~* ^. D0 I" D) r1 b' t! w write_ds18b20(ROM_SKIP) ;
2 ?% f( z9 z* |. Q write_ds18b20(MEM_CONVERT) ;
1 r: R3 @4 T* N# |; Q break ;
" Z7 l' S3 A0 D' X# \% f case 1 :. ~8 b$ _( i/ L7 b" }( k; e
init_ds18b20() ;) W* X6 i% r! ]; v. w
write_ds18b20(ROM_SKIP) ;
4 T" j" c* { T% t5 N write_ds18b20(MEM_READ) ;
' S5 x; |7 | B/ E" F tl=read_ds18b20() ;
: R7 y. e" G* \" c% Y th=read_ds18b20() ;
! Z5 U5 P- I1 J- q9 J6 I# r- A if(!(th&0xf0))
+ s. a2 a" M8 {1 g' l {
. ^ }1 A% X& I( N/ e2 I* [+ j3 z th=th&0x07 ;* p% A" J. G% s, \
temp=th*256+tl ;
4 g6 s) w8 d1 N( y5 H. D& j. J ds.data=temp/16 ;7 }" F: m* n; D* W" b0 p) j
}
( b9 M2 V5 B& l4 V8 ? else8 B& ]$ v# y9 ]6 B5 Q p- y
{ th=th&0x07 ;
I; c4 @; b7 R temp=th*256 +tl ;
4 z, V6 L8 ^, i% ~" L ds.data=temp/16 ;
8 E6 T# i0 g) v( g$ x% n }7 ~! d3 z6 Z$ P2 q
ds.state=0 ;
$ a) d( r+ l8 q# m break ;) b) X) W: y9 `$ @, L8 X
default :1 G4 z( z( a" n% Y
ds.state=0 ;. B; w& q3 k7 c3 Z/ C( @5 O
break ;1 T7 v- Y+ V% l5 W7 f. Y2 X9 P
}
+ o$ b0 m- M3 @- h! o# t$ o* @ }
* _% z, k P0 u$ D int_display1(ds.data) ;
$ c. v: n2 o* z9 s- Y TMR0=210 ;' t5 J, H3 ~/ ^0 V) W! x( W: @" T+ C' t2 X
}# F& v z" E. x2 n% ?
}
2 a; e# U( r* u& V |