|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
在设计单片机定时控制系统时,常常会遇到系统的时钟误差问题。在时间精度要求较高的场合通常采取微调石英晶振的并联谐振电容的方法来校正时钟误差。此方法虽然简便,但也有缺点,如制作麻烦、调校不能定量进行,不易校准,而且微调电容本身就是一个频漂因素。笔者在开发一套自动广播控制系统时,选用稳定性较好的固定云母电容作为晶振的并联谐振电容,编制了时间微调程序,用软件对时间进行微调。
4 ~0 i% p$ k# d+ R; ~8 k 单片机系统中通常利用片内定时器定时发出中断请求,CPU响应中断后在中断服务程序中对中断计数,根据计数结果进行秒、分、时各寄存计数单元的处理,得到所需要的时间值。改变定时器的初值即可改变产生中断的时间,达到时间调整的目的。用户可根据时钟运行的误差,从键盘输入调整量,CPU经计算得到定时器修正后的初值。此后定时器运行均采用修正后的值,就实现了时钟的调校。
; m. O: j$ O: D: O/ b8 } 设系统采用6M晶振,每100ms产生一次中断信号,那么定时器初值每增(减)1,1次中断减(增)2μs,时钟每天的增(减)值为:△t=24小时×60分/时×60秒/分×1秒/100毫秒×2微秒≈1.7秒。时钟最小调整幅度为1.7秒,显然不实用。" P7 l( ^- s% ~+ ^& m
由于大多数系统以秒为计数单位,若定时器每100ms中断一次,则计满10次向秒进1。如果第1~第9次中断定时器均用原来的初值,只在第10次才装入修正后的初值,即修正值每增减1个单位,时钟每天变化量为:△t=24小时×60分/小时×60秒/分×2微秒≈0.17秒。忽略其它因素,时钟经调校后的最大误差为△t,即0.086秒/日。为了使用方便,笔者设计的系统采用初始化时存入某标准值(譬如选50),进行时钟微调时使该值在0~99之间变化。调校输入完成后,进行运算处理,根据该值与标准值的差,对微调修正值进行调整。该值每增(减)1,定时器修正值也就增(减)1,每天时钟就快(慢)0.17秒。修正结果存于寄存器中以备调用。
7 k: k1 A' O" |( u6 c1 \ 下面是时钟调校及修正量输入完成后的运算处理的源程序。) k$ ^+ ^' H8 @1 g
;2FH——定时器低位修正初装值单元7 d: E) q4 G% h- |1 N' X
;22H——100ms计数次数单元5 w* k' u' v% u; U8 T
;20H——校正数据存放单元
+ t8 t' U1 m" d @$ | ;时钟调校程序:
) a; o) H5 {% @5 D7 a" ~ ORG 0000H
. G# z3 |; R# R0 m AJMP MAIN
+ c0 v8 S; W$ `7 o ORG 000BH ;T0中断入口, l+ Q" {% _7 e) f4 a; n
AJMP CLOCK
4 `" H. d: f1 a; s* |MAIN :MOV TMOD,#01 ;置T0为工作方式1
5 ^- z$ u& \7 G( d: M; W1 {% _ MOV TL0,#0B0H ;送定时器初值
^& b4 w$ u9 E& d( k: H- p* q9 j MOV TH0,#3CH
4 v+ M) O/ d, D! P MOV IE,#82H ;开中断
& j7 r. |; O" C# S6 I( @ SETB TR0 ;启动T0
# F7 K/ ^: V k MOV 22H,#10D ;100ms计数次数8 ? b, {) l+ R3 D1 [9 D
MOV 20H,#50D ;调校预设值
: D% B0 A2 h1 C8 ~+ THERE :AJMP HERE ;等待中断
, J1 x$ ~0 x9 ]CLOCK:DJNZ 22H,CLO2 ;未计满0.9s,继续计数9 s- A7 A5 E0 l5 ?" c+ R: i
MOV TL0,2FH ;已计数满0.9s,进行
" M5 X0 G2 [. Q* ^/ b! m MOV TH0,#3CH ;调整5 V3 `0 \4 o. N1 x
SETB TR0
7 n+ u0 `( a/ l) P8 K, } MOV 22H,#10D ;重设计数值) S; A0 _, b' U
RETI
, \ u q0 x# i" c% H# [2 cCLO2 :MOV TL0,#0A6H ;T0原始设定值
5 H# Z2 q! ^7 k! ?7 k K& A0 e MOV TH0,#3CH
8 B8 m+ H3 R& P5 \3 B8 `( } SETB TR0
% v5 g" V. w* N% [3 m RETI. h' \8 e0 f% A2 i) p5 g! M
;校正输入完成后处理子程序:8 r. t( k9 S9 Q
CLR C
" O; f/ j: s1 T0 k+ @ MOV A,#0A6H: [" a6 w: D, _1 Q$ m& `* z h2 F
SUBB A,#50D ;计算修正时T0的实际值
* `- v) g7 H6 b0 i" } ADD A, 20H
+ u/ L' X& U) _5 u MOV 2FH, A ;计算结果暂存备用# g9 `7 V0 G9 s
|
|