|
在許多程序設(shè)計(jì)的場(chǎng)合,我們時(shí)常會(huì)利用到時(shí)間延遲子程序,接下來(lái)就介紹一個(gè)可以控制延遲時(shí)間的延遲子程序。 開下面是利用發(fā)工具E8-ICE來(lái)演示的一個(gè)精確的控制延遲時(shí)間的程序,選擇使用石英振蕩器,可以精確的算準(zhǔn)延遲時(shí)間,時(shí)間可以到nanosecond(十億分之一秒),很神奇。 LP_CNT0 == 0X20 ;定義。 LP_CNT1 == 0X21 MOV LP_CNT0, A ;設(shè)定延遲寄存器0(LP_CNT0)=2 CALL P0_DLY ;呼叫時(shí)間延遲子程序。 P0_DLY: NOP ;調(diào)節(jié)延遲時(shí)間。 MOV A, @200 ;設(shè)定 A = 200。 MOV LP_CNT1, A ;設(shè)定寄存器LP_CNT1 = 200。 P0_LP: NOP ;調(diào)節(jié)延遲時(shí)間。 NOP ;調(diào)節(jié)延遲時(shí)間。 NOP ;調(diào)節(jié)延遲時(shí)間。 DJZ LP_CNT1 ;遞減LP_CNT1,為0就跳過(guò)下一行 JMP P0_LP ;循環(huán)。 DJZ LP_CNT0 ;遞減LP_CNT0,為0就跳過(guò)下一行 JMP P0_DLY ;循環(huán)。 RET ;返回主程序。 假設(shè)用戶所使用的開發(fā)工具是E8-ICE,而且所采用的振蕩器為石英振蕩(4M Hz),並選擇指令執(zhí)行周期為1 Cycle, 2 Clock。這時(shí)每執(zhí)行一個(gè)指令的時(shí)間為0.5 uS. 用戶可以看出在程序中用了兩個(gè)寄存器來(lái)計(jì)數(shù)(LP_CNT0、LPCNT1),另外也使用了兩個(gè)循環(huán)(P0_DLY、P0_LP),其中在P0_LP中有5個(gè)指令,所以在P0_LP這個(gè)循環(huán)中,執(zhí)行了有1000個(gè)指令。 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ù)目 在整個(gè)P0_DLY循環(huán)中就有2012個(gè)指令,每個(gè)指令的執(zhí)行時(shí)間為0.5 us。 2012 (instructions) x 0.5 (us/instruction) = 1.006 ms 所以用戶可以精確的計(jì)算出延遲的時(shí)間,用戶可以在LP_CNT0設(shè)定不同的值,如此可以有各種不同的延遲時(shí)間。 l 例:設(shè)計(jì)一個(gè)延遲時(shí)間為2ms的程序。 只要在上述程序中在呼叫P0_DEL延遲子程序之前,將LP_CNT0設(shè)成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 |