在許多程序设计的場合,我們時常会利用到时间延迟子程序,接下来就介紹一个可以控制延迟时间的延迟子程序。
开下面是利用发工具E8-ICE来演示的一个精确的控制延迟时间的程序,选择使用石英振荡器,可以精确的算准延迟时间,时间可以到nanosecond(十亿分之一秒),很神奇。
LP_CNT0 == 0X20 ;定义。
LP_CNT1 == 0X21
MOV A, @2 ;A = 2。
MOV LP_CNT0, A ;设定延迟寄存器0(LP_CNT0)=2
CALL P0_DLY ;呼叫时间延迟子程序。
P0_DLY:
NOP ;调节延迟时间。
MOV A, @200 ;设定 A = 200。
MOV LP_CNT1, A ;设定寄存器LP_CNT1 = 200。
P0_LP:
NOP ;调节延迟时间。
NOP ;调节延迟时间。
NOP ;调节延迟时间。
DJZ LP_CNT1 ;递減LP_CNT1,为0就跳过下一行
JMP P0_LP ;循环。
DJZ LP_CNT0 ;递減LP_CNT0,为0就跳过下一行
JMP P0_DLY ;循环。
RET ;返回主程序。
假设用户所使用的开发工具是E8-ICE,而且所采用的振荡器为石英振荡(4M Hz),並选择指令执行周期为1 Cycle, 2 Clock。这時每执行一个指令的时间为0.5 uS.
用户可以看出在程序中用了两个寄存器来计数(LP_CNT0、LPCNT1),另外也使用了两个循环(P0_DLY、P0_LP),其中在P0_LP中有5个指令,所以在P0_LP这个循环中,执行了有1000个指令。
5X 200= 1000 P0_LP循环总共执行指令数目。
5 + 1000 = 1005 P0_DLY循环总共执行指令数目。
1005 X 2 = 2010
2010 + 1 + 1 = 2012 延迟程序总共执行指令数目
在整个P0_DLY循环中就有2012个指令,每个指令的执行时间为0.5 us。
2012 (instructions) x 0.5 (us/instruction) = 1.006 ms
所以用户可以精确的计算出延迟的时间,用户可以在LP_CNT0设定不同的值,如此可以有各种不同的延迟时间。
l 例:设计一个延迟时间为2ms的程序。
只要在上述程序中在呼叫P0_DEL延迟子程序之前,將LP_CNT0设成4就可以了。
MOV A, @4
MOV LP_CNT0, A
CALL P0_DLY
其余不变。
1005 X 4 = 4020。
4020 + 1 + 1 = 4022。
4022 (instructions) X 0.5 (us) = 2.011 ms