在單片機(jī)的控制應(yīng)用中,控制過(guò)程常有延時(shí)的需要,例如交通燈的控制程序,控制紅燈亮的時(shí)間持續(xù)30秒,就可以通過(guò)延時(shí)功能來(lái)實(shí)現(xiàn)。延時(shí)功能除了可以使用定時(shí)器/計(jì)數(shù)器之外,還可以使用軟件程序來(lái)完成。軟件延時(shí)程序是典型的循環(huán)程序,它是通過(guò)執(zhí)行一個(gè)具有固定延時(shí)時(shí)間的循環(huán)體來(lái)實(shí)現(xiàn)延時(shí)的。本文從機(jī)器周期和指令周期的區(qū)別和聯(lián)系、編寫(xiě)軟件延時(shí)程序所需相關(guān)指令的用法等方面,介紹軟件延時(shí)程序的設(shè)計(jì)。
一、機(jī)器周期和指令周期
1.機(jī)器周期
機(jī)器周期是指單片機(jī)完成一個(gè)基本操作所花費(fèi)的時(shí)間,一般使用μs來(lái)計(jì)量單片機(jī)的運(yùn)行速度。MCS-51單片機(jī)的一個(gè)機(jī)器周期包括12個(gè)振蕩脈沖周期,因此,一個(gè)機(jī)器周期就是振蕩脈沖的十二分頻。如果MCS-51單片機(jī)的振蕩脈沖頻率為12MHz時(shí),那么執(zhí)行一個(gè)機(jī)器周期就只需要1μs;如果采用的是6MHz的晶振,那么執(zhí)行一個(gè)機(jī)器周期就需要2μs。
2.指令周期
指令周期是指單片機(jī)執(zhí)行一條指令所需要的時(shí)間,一般以單片機(jī)的機(jī)器周期來(lái)計(jì)量指令周期。MCS-51單片機(jī)的指令周期根據(jù)指令的不同,分成單周期指令(執(zhí)行這條指令只需一個(gè)機(jī)器周期)、雙周期指令和四周期指令。除了乘、除兩條指令是四周期指令之外,其余MCS-51單片機(jī)指令均為單周期或雙周期指令。如果MCS-51單片機(jī)采用的是12MHz晶振,那么它執(zhí)行一條指令一般只需1~2μs的時(shí)間;如果采用的是6MHz晶振,執(zhí)行一條指令一般就需2~4μs的時(shí)間。
現(xiàn)在的單片機(jī)有很多種型號(hào),但每個(gè)型號(hào)的單片機(jī)器件手冊(cè)中都會(huì)詳細(xì)說(shuō)明執(zhí)行各種指令所需的機(jī)器周期。我們可以依據(jù)單片機(jī)器件手冊(cè)中的指令執(zhí)行周期和單片機(jī)所使用晶振頻率,來(lái)完成需要用軟件的方法進(jìn)行的延時(shí)的程序設(shè)計(jì)。
二、延時(shí)指令
在MCS-51單片機(jī)指令中并沒(méi)有真正的延時(shí)指令,從以上的概念我們知道單片機(jī)每執(zhí)行一條指令都需要一定的時(shí)間。所以可以讓單片機(jī)不斷地執(zhí)行沒(méi)有具體實(shí)際意義的指令(通常把這些指令稱(chēng)為啞指令),就可以達(dá)到軟件延時(shí)的效果。
1.數(shù)據(jù)傳送指令MOV
數(shù)據(jù)傳送指令功能是將數(shù)據(jù)從一個(gè)地方復(fù)制、拷貝到另一個(gè)地方。如:MOV R7,#80H,執(zhí)行這條指令的功能是將立即數(shù)80H送到寄存器R7。就單這條指令而言并沒(méi)有任何實(shí)際意義,而執(zhí)行該指令則需要一個(gè)機(jī)器周期。
2.空操作指令NOP
空操作指令功能只是讓單片機(jī)執(zhí)行沒(méi)有意義的操作,消耗一個(gè)機(jī)器周期。
3.減1條件轉(zhuǎn)移指令DJNZ
減1條件轉(zhuǎn)移指令功能是將第一個(gè)操作數(shù)的內(nèi)容減1,判斷所得結(jié)果是否為0,不為0則轉(zhuǎn)移到指定地點(diǎn),為0則順序往下執(zhí)行。
利用以上三條指令的組合就可以比較精確地用軟件的方法設(shè)計(jì)出所需要的延時(shí)程序。
三、50ms延時(shí)程序的設(shè)計(jì)
50ms延時(shí)程序的設(shè)計(jì)(設(shè)晶振頻率f=12MHz,則機(jī)器周期為1μs)(見(jiàn)下表)。
①M(fèi)OV R6,#100在整個(gè)程序中只被執(zhí)行一次,且為單周期指令,所以耗時(shí)1×1μs。
②MOV R7,#250從②看到④只要R6-1不為0,就會(huì)返回到這句,共執(zhí)行了R6次,共耗時(shí)1×100μs。
③DJNZ R7,I2只要R7-1不為0,就反復(fù)執(zhí)行此句(內(nèi)循環(huán)R7次),又受外循環(huán)R6控制,所以共執(zhí)行R7*R6次,因是雙周期指令,所以耗時(shí)2×R7×R6=2×250×100μs。
④DJNZ R6,I1從④看到②只要R6-1不為0,就會(huì)R6次執(zhí)行這句,因是雙周期指令,所以耗時(shí)2×100μs。
⑤RET是一條子程序返回指令。在整個(gè)程序中只被執(zhí)行一次,且為雙周期指令,所以耗時(shí)2×1μs。
所以總延時(shí)時(shí)間計(jì)算為:
t=(1×1+1×100+2×250×100+2×100+2×1)×機(jī)器周期=50303μs=50.3ms
最后說(shuō)明一點(diǎn),編寫(xiě)程序時(shí),一般將延時(shí)程序編寫(xiě)成獨(dú)立的子程序,而所謂子程序也就是一個(gè)實(shí)現(xiàn)某個(gè)功能的小模塊。這樣在主程序中就可以方便地反復(fù)調(diào)用編寫(xiě)好的延時(shí)子程序。
(作者單位:江蘇省常州技師學(xué)院)