在許多程序設計的場合,我們時常會利用到時間延遲子程序,接下來就介紹一個可以控制延遲時間的延遲子程序。
開下面是利用發(fā)工具E8-ICE來演示的一個精確的控制延遲時間的程序,選擇使用石英振蕩器,可以精確的算準延遲時間,時間可以到nanosecond(十億分之一秒),很神奇。
LP_CNT0==0X20;定義。
LP_CNT1==0X21
MOV A,@2;A=2。
MOV LP_CNT0,A;設定延遲寄存器0(LP_CNT0)=2
CALLP0_DLY;呼叫時間延遲子程序。
P0_DLY:
NOP;調(diào)節(jié)延遲時間。
MOV A,@200;設定A=200。
MOV LP_CNT1,A;設定寄存器LP_CNT1=200。
P0_LP:
NOP;調(diào)節(jié)延遲時間。
NOP;調(diào)節(jié)延遲時間。
NOP;調(diào)節(jié)延遲時間。
DJZLP_CNT1;遞減LP_CNT1,為0就跳過下一行
JMPP0_LP;循環(huán)。
DJZLP_CNT0;遞減LP_CNT0,為0就跳過下一行
JMPP0_DLY;循環(huán)。
RET;返回主程序。
假設用戶所使用的開發(fā)工具是E8-ICE,而且所采用的振蕩器為石英振蕩(4MHz),並選擇指令執(zhí)行周期為1Cycle,2CLOCk。這時每執(zhí)行一個指令的時間為0.5uS.
用戶可以看出在程序中用了兩個寄存器來計數(shù)(LP_CNT0、LPCNT1),另外也使用了兩個循環(huán)(P0_DLY、P0_LP),其中在P0_LP中有5個指令,所以在P0_LP這個循環(huán)中,執(zhí)行了有1000個指令。
5X200=1000P0_LP循環(huán)總共執(zhí)行指令數(shù)目。
5+1000=1005P0_DLY循環(huán)總共執(zhí)行指令數(shù)目。
1005X2=2010
2010+1+1=2012延遲程序總共執(zhí)行指令數(shù)目
在整個P0_DLY循環(huán)中就有2012個指令,每個指令的執(zhí)行時間為0.5us。
2012(instructions)x0.5(us/instruction)=1.006ms
所以用戶可以精確的計算出延遲的時間,用戶可以在LP_CNT0設定不同的值,如此可以有各種不同的延遲時間。
l例:設計一個延遲時間為2ms的程序。
只要在上述程序中在呼叫P0_DEL延遲子程序之前,將LP_CNT0設成4就可以了。
MOV A,@4
MOV LP_CNT0,A
CALLP0_DLY
其余不變。
1005X4=4020。
4020+1+1=4022。
4022(instructions)X0.5(us)=2.011ms