原创 单片机定时中断的精确定时编程方法

2009-8-12 16:34 1313 9 9 分类: MCU/ 嵌入式

来源 CEPARK网站http://www.cepark.com/Index.html  作者: hnrain


文中以定时器T1工作在定时方式1为例,晶振频率为12MHz 。


4k{Uc{ a401851 方法1电子园51单片机学习网}2V,M;BD5e


电子园51单片机学习网Lq2yxcN,w


  在定时器溢出中断得到响应时,停止定时器计数,读出计数值(反映了中断响应的延迟时间),根据此计数值算出到下一次中断时,需多长时间,由此来重装载和启动定时器。例如定时周期为1ms,则通常定时器重装载值为-1000(0FC18H)。下面的程序在计算每个定时周期的精确重装载值时,考虑了由停止计数(CLR TR1)到重新启动计数(SETB TR1)之间的7个机器周期时间。程序中#LOW(-1000+7)和#HIGH(-1000+7)是汇编符号,分别表示-1000+7=0FC1FH这个立即数的低位字节(1FH)和高位字节(0FCH)。
2a!~px3b!}40185……电子园51单片机学习网EQN$pJ3F+E {\
CLR EA ;禁止所有中断
,v8V"C"y#q cq40185CLR TR1 ;停止定时器T1
F|,k+v#@6m40185MOV A,#LOW(-1000+7) ;期望数的低位字节
'lma/pkpYj{W40185ADD A,TL1 ;进行修正
+M\D i!{40185MOV TL1,A ;重装载低位字节电子园51单片机学习网+^)A!z5h6q
MOV A,#HIGH(-1000+7) ;对高位字节处理
$C a/W~7C?6W+a:CW40185ADDC A,TH1
x K\ZE'XP40185MOV TH1,A 电子园51单片机学习网^2^])U3yDxJ
SETB TR1 ;重启动定时器电子园51单片机学习网/Vd6]5_9?T0a}n
SETB EA ;重开中断电子园51单片机学习网5g%jcj,O
……
电子园51单片机学习网"\\ bu?4P ^


电子园51单片机学习网W Ug8QER


  此方法适用于各种原因造成的定时误差的情况,为通用方法。


S7q*|4S#H CL40185 电子园51单片机学习网j+]P/Q:m7C


2 方法2电子园51单片机学习网xeq0f1U_i


Vo)~k0T|40185  假如定时周期为10ms,通常定时器重装载值为0D8F0H,中断子程序如下[2]:
"?2g3\t J40185ORL TL1,#0F0H电子园51单片机学习网 zW4r!? l!O
MOV TH1,#0D8H
O!AA3qjh2n?C6z40185……
电子园51单片机学习网Hs oYt9aR


电子园51单片机学习网?FuM)_)hO4l


  这里用ORL TL1,#0F0H代替MOV TL1,#0F0H 可提高定时精度。此方法只适用于重装载值低位字节的低4位为零,且中断响应的延迟时间小于16个机器周期的情况。类似的定时器重装载值有0FFF0H,0FFE0H等。


/l(MVij,Dn40185 电子园51单片机学习网$[,wP)t!F!n


3 方法3


l r bnYWzX40185


G9~qx$Cb-g40185  假如定时周期为1ms,通常定时器重装载值为0FC18H,中断子程序如下:电子园51单片机学习网2OQ&zU A5E5c~ p
MOV A,#LOW(-1000+4) ;期望数的低位字节
)s\{r1^ p1Ix40185ADD A,TL1电子园51单片机学习网8Zw6k,N'Q3d J
MOV TL1,A
4v rd'n;Bk;E40185MOV A,#HIGH(-1000+4) ;对高位字节处理
1U%l,\ sI40185ADDC A,TH1
DX:|:xhf o']40185MOV TH1,A电子园51单片机学习网p9sRY@u
DEC TL1 ;恢复提前了的2个机器周期电子园51单片机学习网yk2i1e2~
……


2Hd }W2}^&R,~T40185


KUm:Aw40185  这种方法中不停止定时器计数过程,若在执行指令ADDC A,TH1 或MOV TH1,A时,恰好产生TL1溢出向TH1进位的情况,则TH1的值就不对了,会产生更大的误差。为此,程序段开头为重装载值加4,若有溢出进位,则可提前发生,其中2个机器周期是考虑到为TL1重装载占用的时间。


oaD0B0Q#^6eFM40185


kt!onQ8MVlHD1H a40185  此方法适用于系统中无其它更高优先级中断源的情况。若类似方法1,在程序段开头和结尾分别加上禁止所有中断(CLR EA)和开中断(SETB EA)指令,则将适用于所有情况。电子园51单片机学习网yGr`q-p+?u


2W.s9j~+s-w#u/r l.z&u:o401854 方法4


,pr5{zT8gy e40185 电子园51单片机学习网:{ m.i)f T.H0T(t


  假如定时周期不确定,只知道定时器重装载值存放在寄存器R3、R2中,中断子程序如下:
/u7X#z,E8`!s.K40185MOV A,#05H ;3个机器周期装载TL1,2个周期提前电子园51单片机学习网m(k6A;bYh#i1s;F-LC
ADD A,TL1 电子园51单片机学习网HR+RO'KtH#U%f4i~X
ADD A,R2
s0R!cc6@jM/]#I40185MOV TL1,A 电子园51单片机学习网R0J HT#o"{k
MOV A,R3 ;处理高位字节
9p%p1fb*H1tZ_ W40185ADDC A,TH1
e]Bu&T1\40185MOV TH1,A
+U zV Nyv0D40185DEC TL1 ;恢复提前了的2个机器周期
;aa.j)VU.A!q40185……


Y9P+sv!z-X:c40185 电子园51单片机学习网;Jz9d!wd I+n$K


  此法适用于定时周期不确定的情况,其它同方法3。


k8|&N R'?'a40185 电子园51单片机学习网o {V0\h|q


5 方法5


0YW F:a;MVF40185 电子园51单片机学习网5v5DA"Q*t3a2ZU


  当定时中断发生的位置可预知时,通常出现在主程序的AJMP $ (或SJMP $)等待指令处,中断延迟时间为3个或4个机器周期。取固定值4可简化补偿程序。以定时周期1ms为例,中断子程序如下:
3WFMRA!dh-y4|x40185ORG 001BH
NJEP#T'Z0pi/H40185MOV TL1,#LOW(-1000+4)电子园51单片机学习网5~0x;T yW\3t _bn|F(p
MOV TH1,#HIGH(-1000+4)电子园51单片机学习网$Y?@2`'F\:U n.X ]-{
……


S1JB9]M6j#U([40185


(~ j8sPi+U4KwA40185  此方法适用于定时中断总发生在同一条指令位置,且无其它中断源的情况。
3h"{-j.A`,^a2^8o|M40185结 语
电子园51单片机学习网peRZ}KQ&];ju


电子园51单片机学习网@O5bE&\k


  上述5种方法误差均不超过1个机器周期,其中方法1、3、4较为通用,适用于任何情况,但程序较长;方法2、5简单,但必须注意满足对应条件,才能使用。当然,也还有其它方法[3],但比较烦琐,并不理想,这里不一一介绍。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条