|
在許多程序設計的場合,我們時常會利用到時間延遲子程序,接下來就介紹一個可以控制延遲時間的延遲子程序。 開下面是利用發(fā)工具E8-ICE來演示的一個精確的控制延遲時間的程序,選擇使用石英振蕩器,可以精確的算準延遲時間,時間可以到nanosecond(十億分之一秒),很神奇。 LP_CNT0 == 0X20 ;定義。 LP_CNT1 == 0X21 MOV LP_CNT0, A ;設定延遲寄存器0(LP_CNT0)=2 CALL P0_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é)延遲時間。 DJZ LP_CNT1 ;遞減LP_CNT1,為0就跳過下一行 JMP P0_LP ;循環(huán)。 DJZ LP_CNT0 ;遞減LP_CNT0,為0就跳過下一行 JMP P0_DLY ;循環(huán)。 RET ;返回主程序。 假設用戶所使用的開發(fā)工具是E8-ICE,而且所采用的振蕩器為石英振蕩(4M Hz),並選擇指令執(zhí)行周期為1 Cycle, 2 Clock。這時每執(zhí)行一個指令的時間為0.5 uS. 用戶可以看出在程序中用了兩個寄存器來計數(shù)(LP_CNT0、LPCNT1),另外也使用了兩個循環(huán)(P0_DLY、P0_LP),其中在P0_LP中有5個指令,所以在P0_LP這個循環(huán)中,執(zhí)行了有1000個指令。 5X 200= 1000 P0_LP循環(huán)總共執(zhí)行指令數(shù)目。 5 + 1000 = 1005 P0_DLY循環(huán)總共執(zhí)行指令數(shù)目。 1005 X 2 = 2010 2010 + 1 + 1 = 2012 延遲程序總共執(zhí)行指令數(shù)目 在整個P0_DLY循環(huán)中就有2012個指令,每個指令的執(zhí)行時間為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 |