在單片機的控制應用中,常有延時的需要。使用匯編語言可以編制能夠精確控制延時時間的程序,但參數(shù)計算卻比較復雜。延時參數(shù)的計算,是一個讓專業(yè)人員都感到頭痛的問題。
為了工作需要,專業(yè)人員一般都建立有滿足不同延時需要的程序。但對于初學者來說,卻是一個比較困難的問題。利用WAVE3.2集成調試軟件的強大仿真調試功能,通過反復幾次修改延時參數(shù),就可以輕而易舉地編制出精確延時程序,即使是初學者也不例外。下面通過一個實例,介紹這種編制精確延時程序的方法。
10ms精確延時程序的編制與調試
1.基本程序編制
延時程序的延時時間主要與兩個因素有關,一是所用晶振的頻率,二是延時程序中的循環(huán)次數(shù)。晶振確定之后,則主要是如何設計和計算需給定的延時循環(huán)次數(shù)。例如假設晶振頻率為6.000MHz,如果不計子程序調用、子程序返回等因素的影響,則單重循環(huán)程序能夠實現(xiàn)的最大延時時間為255×2×2μs≈1ms;二重循環(huán)程序能夠實現(xiàn)的最大延時時間為255×255×2μs=130.05ms;三重循環(huán)程序能夠實現(xiàn)的最大延時時間為255×255×255×2μs=3.316275s。因此,實現(xiàn)延時10ms的程序,需要使用二重循環(huán)程序,且第二重循環(huán)程序需要循環(huán)的次數(shù)大約為:AT=10ms/1ms=10(次)。因此,10ms延時的基本程序如下:
DELY10ms:MOVR0,#255;第
一重循環(huán)的次數(shù)裝入R0
LOOP2:MOVR1,#10;第二重
循環(huán)的次數(shù)裝入R1
LOP1:DJNZR0,LOOP1
DJNZR1.LOOP2
RET
2.WAVE3.2集成調試軟件參數(shù)設置和延時時間基本程序的測試
運行WAVE3.2集成調試軟件,并對軟件的“仿真器”選項中的“仿真頭設置”項的“晶體頻率”進行如下圖所示的設置。
將以上基本程序輸入新創(chuàng)建的文件,進行編譯后,即可進行基本程序的測試,下面介紹兩種簡單的測試方法:
(1)使用“執(zhí)行到光標處”的方式進行程序測試步驟如下:
A.將光標移到“RET”指令處(單擊一下,可以看到光標在這一行上閃爍);B.按“執(zhí)行到光標處”快捷鍵F4或從菜單欄“執(zhí)行/執(zhí)行到光標處”。
(2)使用“設置斷點”的方式進行程序測試步驟如下:
A.將光標移到“RET”指令處,按“斷點/取消斷點”快捷鍵CTRl+F8或從菜單欄“執(zhí)行/設置/取消斷點”,進行斷點設置(設置成功的畫面如下圖);B.按全速執(zhí)行快捷鍵Ctrl+F9或從菜單欄“執(zhí)行/全速執(zhí)行”。
通過以上任意一種方式的操作,程序運行到“RET”行將自動停止。即可看到圖3所示的執(zhí)行結果,在WAVE3.2集成調試軟件的窗口下部的“執(zhí)行時間”窗看到這段程序的執(zhí)行時間為10262.0μs。
3.延時時間程序的初步調試
通過延時時間基本程序的測試,看到這段程序的執(zhí)行時間為10262.0μs。
比目標延時需要多了262μs。如何得到更加精確的延時,是軟件延時的難點。
由以上10ms延時的基本程序可見,第一重循環(huán)的參數(shù)變化1與第二重循環(huán)的參數(shù)變化1,對定時時間的影響是不同的。這與4×400m接力賽類似,第二重循環(huán)的參數(shù)相當于是4個人,第一重循環(huán)的參數(shù)相當于是400m,如果人數(shù)變化1個數(shù)值,而保持單位路程仍為400m,則總路程將變化400m;如果保持人數(shù)不變,而單位路程變化1m,則總路程將變化4m。由此可見,第二重循環(huán)的參數(shù)變化對定時時間的影響更大。延時程序可以通過增減循環(huán)程序段的循環(huán)參數(shù)的數(shù)值來進行延時時間的基本調整。
由于延時僅多了262μs,因此,可以通過調整第一重循環(huán)的參數(shù)來進行初步調整。將傳送給R0的循環(huán)的參數(shù)改為245,編譯后,重新進行測試,程序的執(zhí)行時間變?yōu)?862.0μs,延時誤差為-138μs;將傳送給R0的循環(huán)的參數(shù)改為248后測試,程序的執(zhí)行時間變?yōu)?982.0μs,延時誤差為-18μs;將傳送給R0的循環(huán)的參數(shù)改為249,編譯后,重新進行測試,程序的執(zhí)行時間變?yōu)?0022.0μs,延時誤差為+22μs。至此,最后的兩個結果,對于要求不是很高的控制過程,這樣的延時精度已經(jīng)足夠了。
4.延時程序的精確調試
如果要進一步提高延時精度,需要對延時程序進行微調。在程序中,對延時時間進行微調的方法是:在程序中加入只是起到調節(jié)機器周期作用的指令。常用1字節(jié)空操作指令NOP進行微調。通過微調后的程序編譯后,進行測試,程序的執(zhí)行時間變?yōu)?0000.0μs。經(jīng)微調后的程序如下:
DELY1S:MOVR1,#10
LOOP2:MOVR0,#248
LOOP1:DJNZR0,LOOP1
DJNZR1.LOOP2
NOP
……
RET
本文只是探討了一種比較實用的定時程序的簡單的設計方法,適用于初涉自動控制系統(tǒng)開發(fā)的初學者。對于精確的計時系統(tǒng)的開發(fā),單純采用提高延時子程序的方式是不可取的。