对延时子函数的调用,占用机器周期为2T。上面⑥⑦两项一共占用机器周期为5T,这是固定不变的,不会随着延时的长短而改变,这应该看成是延时以外额外的机器周期。综合以上分析,延时总的机器周期是以上各项之和,再考虑到x倍,则:
89C51总周期x×2T2T×j2T2T×2562T×i12T5Tx×2T×j2T×i508T5T
4
fSTC15总周期x×4T4T×j4T4T×2564T×i14T10Tx×4T×j4T×i1016T10T
仔细研究这个公式,可以看出延时的主要贡献在中括号里,j只是起补充的作用。只要通过计算将大括号内的机器周期设计成一个常用值,比方1ms,如果需要延时100ms,调用时只需要将实参赋值成100就可以了,对89C51单片机来讲仅存在有5个机器周期的固定误差。由于i、j和x最大只能为256,当x1时最大延时对89C51单片机来讲是131588个机器周期,对STC15单片机来讲是263176个机器周期。
四、长延时代码如果要进一步延长延时,可以再增加一层循环,这样延时大约可以增大256倍。当x1
时最大延时对89C51单片机来讲是33686021个机器周期,对STC15单片机来讲是67372042个机器周期。C语言如下:
voiddelayu
sig
edcharx
u
sig
edcharijdo
i2j240k156do
do
whilekwhilejwhileiwhilex}
此时的机器周期为:89C51总周期x×3T2T×k2T2T×2562T×j12T2T×2562T×256×i12T5Tx×2T×k514×j131586T×i131586T5TSTC15总周期x×6T4T×k4T4T×2564T×j14T4T×2564T×256×i14T10Tx×4T×k1028×j263172T×i263172T10T
五、短延时代码如果延时的时间时间比较短,当S1时,对于89C51单片机来讲小于515个机器周期,
对于89C51单片机来讲小于1030个机器周期,可以仅用一层循环。
5
fvoiddelay_10usu
sig
edcharx
u
sig
edcharido
i3whileiwhilex
此时的机器周期为:89C51总周期x×1T2T×i2T5Tx×2T×i3T5T
STC15总周期x×2T4T×i4T10Tx×4T×i6T10T
六、精确的延时代码根据推导出的公式,就能够精确计算延时的时间,如果算下来还差一两个机器周期,可
以在循环外赋值的地方添加一两个“_
op_”函数,无论是89C51还是STC15,“_
op_”函数都只占用1个机器周期。
下面这些延时子函数是非常精确的,调用它们的时候仅会有前述的固定误差,对于89C51单片机来讲是5个机器周期,对于STC15单片机来讲是10个机器周期,不会因为参数x的大小而改变。
voiddelay_10usu
sig
edcharX
u
sig
edcharido
_
op_i3whileiwhileX
89C51
voiddelay_15usu
sig
edcharX
u
sig
edcharido
i6whileiwhileX
89C5r