在應(yīng)用單片機(jī)編制各種程序時(shí),經(jīng)常會(huì)遇到實(shí)現(xiàn)精確延時(shí)的問題,時(shí)間從幾十微秒到幾秒,甚至更高的精度。單片機(jī)實(shí)現(xiàn)延時(shí)通常有兩種方法:一種是用定時(shí)器/計(jì)數(shù)器硬件延時(shí),這種方法可以提高CPU的工作效率,也能做到精確延時(shí),另一種是采用循環(huán)體進(jìn)行軟件延時(shí)。
一、使用定時(shí)器/計(jì)數(shù)器
單片機(jī)系統(tǒng)若使用頻率為12MHz的晶振,一個(gè)機(jī)器周期為1μs,最長的延時(shí)時(shí)間可達(dá)2的16次方。在實(shí)際應(yīng)用中,定時(shí)常采用中斷方式,如進(jìn)行適當(dāng)?shù)难h(huán)可實(shí)現(xiàn)幾秒甚至更長時(shí)間的延時(shí)。使用定時(shí)器/計(jì)數(shù)器延時(shí),從程序的執(zhí)行效率和穩(wěn)定性兩方面考慮,都是最佳的方案,但需要注意的是,用C51編寫的中斷服務(wù)程序,編譯后會(huì)自動(dòng)加上PUSH ACC、PUSH PSW、POP PSW和POP ACC語句,執(zhí)行時(shí)將占用4個(gè)機(jī)器周期,如程序中還有計(jì)數(shù)值加1語句,則又會(huì)占用1個(gè)機(jī)器周期。這些語句所消耗的時(shí)間要從初值中減去,以達(dá)到最小誤差的目的。
二、使用軟件嵌套循環(huán)程序
在很多情況下,定時(shí)器/計(jì)數(shù)器經(jīng)常被用作其他用途,這時(shí)候就只能用軟件方法延時(shí)。常用的軟件延時(shí)的方法有:
1. 短暫延時(shí)
通過使用帶_NOP_( )語句的函數(shù)實(shí)現(xiàn),定義一系列不同的延時(shí)函數(shù),如Delay10μs( )、Delay25μs( )等存放在一個(gè)自定義的文件中,需要時(shí)在主程序中直接調(diào)用。如延時(shí)10μs可編寫如下:
void Delay10μs ( ) {
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
上面函數(shù)中共用了6個(gè)_NOP_( )語句,每個(gè)語句執(zhí)行時(shí)間為1μs。主函數(shù)調(diào)用Delay 10μs( )時(shí),先執(zhí)行一個(gè)LCALL指令(2 μs),然后執(zhí)行6個(gè)_NOP_( )語句(6μs),最后執(zhí)行了一個(gè)RET指令(2μs),所以執(zhí)行上述函數(shù)時(shí)共需要10μs。可以把這一函數(shù)當(dāng)做基本延時(shí)函數(shù),在其他函數(shù)中調(diào)用,即嵌套調(diào)用,以實(shí)現(xiàn)較長時(shí)間的延時(shí)。
2. C51中嵌套匯編程序段實(shí)現(xiàn)延時(shí)
在C51中通過嵌套匯編語言語句,實(shí)現(xiàn)多次循環(huán)達(dá)到延時(shí)的目的。例1:50ms 延時(shí)子程序:
DELAY:MOVR7,#200①
LOOP1:MOVR6,#125 ②
LOOP2:DJNZR6,L00P2③
DJNZR7,LOOP1④
RET⑤
精確延時(shí)時(shí)間為:1+(1×200)+(2×125×200)+(2×200)+2=(2×125+3)×200+3 =50603us≈50ms⑥
由⑥整理出公式:延時(shí)時(shí)間=(2×內(nèi)循環(huán)+3)×外循環(huán)+3 ⑦
詳解:DELAY這個(gè)子程序共有五條指令,現(xiàn)在分別就每一條指令被執(zhí)行的次數(shù)和所耗時(shí)間進(jìn)行分析。第一句:MOVR7,#200在整個(gè)子程序中只被執(zhí)行一次,且為單周期指令,所以耗時(shí)1us。第二句:MOVR6,#125從②看到④只要R7-1不為0,就會(huì)返回到這句,共執(zhí)行了R7次,共耗時(shí)200us。第三句:DJNZ R6,LOOP2,只要R6-1不為0,就反復(fù)執(zhí)行此句(內(nèi)循環(huán)R6次),又受外循環(huán)R7控制,所以共執(zhí)行R6×R7次,因是雙周期指令,所以耗時(shí)2×R6×R7us。
例2:1秒延時(shí)子程序:
DELAY:MOV R7,#10 ①
LOOP1:MOV R6,#200②
LOOP2:MOV R5,#248③
DJNZ R5,$ ④
DJNZ R6,LOOP2 ⑤
DJNZ R7,LOOP1 ⑥
RET⑦
對(duì)每條指令進(jìn)行計(jì)算得出精確延時(shí)時(shí)間為:1+(1×10)+(1×200×10)+(2×248×200×10)+(2×200×10)+(2×10)+2=[(2×248+3)×200+3]×10+3=998033us≈1s ⑧
由⑧整理得:延時(shí)時(shí)間=[(2×第一層循環(huán)+3)×第二層循環(huán)+3]×第三層循環(huán)+3 ⑨
此式適用三層循環(huán)以內(nèi)的程序,也驗(yàn)證了例1中式⑦(第三層循環(huán)相當(dāng)于1)的成立。注意,要實(shí)現(xiàn)較長時(shí)間的延時(shí),一般采用多重循環(huán),有時(shí)會(huì)在程序里加入NOP指令。
三、使用其他方法實(shí)現(xiàn)延時(shí)
如示波器、反匯編工具、性能分析器等確定延時(shí)時(shí)間。
四、總結(jié)
中職學(xué)生對(duì)單片機(jī)編程掌握較為薄弱。本文所介紹的多種實(shí)現(xiàn)并計(jì)算延時(shí)程序執(zhí)行時(shí)間的方法,使用定時(shí)器進(jìn)行延時(shí)是最佳的選擇,可以提高M(jìn)CU工作效率。編寫延時(shí)程序是一項(xiàng)很煩瑣的任務(wù),需要多次修改才能滿足要求。
?。ê幽鲜〗?jīng)濟(jì)管理學(xué)校)
注:“本文中所涉及到的圖表、公式、注解等請(qǐng)以PDF格式閱讀”