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