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