C語言延時程序_第1頁
C語言延時程序_第2頁
C語言延時程序_第3頁
C語言延時程序_第4頁
C語言延時程序_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、標(biāo)準(zhǔn)的 c 語言中沒有空語句。但在單片機(jī)的c 語言編程中,經(jīng)常需要用幾個空指令產(chǎn)生短延時的效果。這在匯編語言中很容易實現(xiàn),寫幾個nop 就行了。在 keil c51 中,直接調(diào)用庫函數(shù):#include / 聲明了 void _nop_(void); _nop_(); / 產(chǎn)生一條nop 指令作用:對于延時很短的,要求在us 級的,采用“ _nop_”函數(shù),這個函數(shù)相當(dāng)匯編nop指令,延時幾微秒。nop 指令為單周期指令,可由晶振頻率算出延時時間,對于12m 晶振,延時1us。對于延時比較長的,要求在大于10us,采用 c51 中的循環(huán)語句來實現(xiàn)。在選擇 c51 中循環(huán)語句時,要注意以下幾個問

2、題第一、定義的c51 中循環(huán)變量,盡量采用無符號字符型變量。第二、在for 循環(huán)語句中,盡量采用變量減減來做循環(huán)。第三、在do,while,while 語句中,循環(huán)體內(nèi)變量也采用減減方法。這因為在c51 編譯器中,對不同的循環(huán)方法,采用不同的指令來完成的。下面舉例說明:unsigned char i; for(i=0;i0;i-); 其中,第二個循環(huán)語句c51 編譯后,就用djnz 指令來完成,相當(dāng)于如下指令:mov09h, 0ffh loop:djnz09h, loop 指令相當(dāng)簡潔,也很好計算精確的延時時間。同樣對 do,while,while 循環(huán)語句中,也是如此例:unsigned c

3、har n; n=255; don- while(n); 或n=255; while(n) n-; 這兩個循環(huán)語句經(jīng)過c51 編譯之后,形成djnz 來完成的方法,故其精確時間的計算也很方便。其三:對于要求精確延時時間更長,這時就要采用循環(huán)嵌套的方法來實現(xiàn),因此,循環(huán)嵌套的方法常用于達(dá)到ms 級的延時。對于循環(huán)語句同樣可以采用for ,do, while,while 結(jié)構(gòu)來完成,每個循環(huán)體內(nèi)的變量仍然采用無符號字符變量。unsigned char i,j for(i=255;i0;i-) for(j=255;j0;j-); 或unsigned char i,j i=255; doj=255;

4、doj- while(j); i-; while(i); 或unsigned char i,j i=255; while(i) j=255; while(j) j-; i-; 這三種方法都是用djnz 指令嵌套實現(xiàn)循環(huán)的,由c51 編譯器用下面的指令組合來完成的movr7, 0ffh loop2:movr6, 0ffh loop1:djnzr6,loop1 djnzr7,loop2 這些指令的組合在匯編語言中采用djnz 指令來做延時用,因此它的時間精確計算也是很簡單,假上面變量i 的初值為 m,變量 j 的初值為n,則總延時時間為:m( ntt) ,其中 t 為 djnz 指令執(zhí)行時間(dj

5、nz 指令為雙周期指令) 。這里的 +t 為 mov 這條指令所使用的時間。同樣對于更長時間的延時,可以采用多重循環(huán)來完成。只要在程序設(shè)計循環(huán)語句時注意以上幾個問題。下面給出有關(guān)在c51 中延時子程序設(shè)計時要注意的問題1、在 c51 中進(jìn)行精確的延時子程序設(shè)計時,盡量不要或少在延時子程序中定義局部變量,所有的延時子程序中變量通過有參函數(shù)傳遞。2、在延時子程序設(shè)計時,采用do,while,結(jié)構(gòu)做循環(huán)體要比for 結(jié)構(gòu)做循環(huán)體好。3、在延時子程序設(shè)計時,要進(jìn)行循環(huán)體嵌套時,采用先內(nèi)循環(huán),再減減比先減減,再內(nèi)循環(huán)要好。unsigned char delay(unsigned char i,unsig

6、ned char j,unsigned char k) unsigned char b,c; b=j; c=k; do do dok-; while(k); k=c; j-; while(j); j=b; i-; while(i); 這精確延時子程序就被c51 編譯為有下面的指令組合完成delay 延時子程序如下:mov r6,05h mov r4,03h c0012:djnz r3, c0012 mov r3,04h djnz r5, c0012 mov r5,06h djnz r7, c0012 ret 假設(shè)參數(shù)變量i 的初值為m,參數(shù)變量j 的初值為 n,參數(shù)變量 k 的初值為l,則總延

7、時時間為:l( n( mt2t) 2t) 3t,其中 t 為 djnz 和 mov 指令執(zhí)行的時間。當(dāng)m=n=l 時,精確延時為9t,最短;當(dāng) m=n=l=256 時,精確延時到16908803t,最長。- 采用軟件定時的計算方法利用指令執(zhí)行周期設(shè)定,以下為一段延時程序:指令周期mov 1 djnz 2 nop 1 采用循環(huán)方式定時,有程序:mov r5,#time2 ;周期 1 loop1: mov r6,#time1 ; 1 loop2: nop ; 1 nop ; 1 djnz r6,loop2 ; 2 djnz r5,loop1 ; 2 定時數(shù) =(time1*4+2+1)*tim2*

8、2+4 剛剛又學(xué)了一條,用_nop_(); 時記得加上 #include 頭文件如:/= #include /包含庫函數(shù). . /= . . _nop_(); /引用庫函數(shù)敬禮。我一直都是借助仿真軟件編。一點一點試時間。c 語言最大的缺點就是實時性差,我在網(wǎng)上到看了一些關(guān)于延時的討論,其中有篇文章51 單片機(jī)keil c 延時程序的簡單研究,作者: infinitespace studio/isjfk 寫得不錯 ,他是用 while(-i); 產(chǎn)生 djnz 來實現(xiàn)精確延時,后來有人說如果while 里面不能放其它語句 ,否則也不行 ,用 do-while 就可以 ,具體怎樣我沒有去試.所有這

9、些都沒有給出具體的實例程序來 .還看到一些延時的例子多多少少總有點延時差.為此我用for 循環(huán)寫了幾個延時的子程序貼上來 ,希望能對初學(xué)者有所幫助.(晶振 12mhz, 一個機(jī)器周期1us.) 一. 500ms 延時子程序程序 : void delay500ms(void) unsigned char i,j,k; for(i=15;i0;i-) for(j=202;j0;j-) for(k=81;k0;k-); 產(chǎn)生的匯編 : c:0 x0800 7f0f mov r7,#0 x0f c:0 x0802 7ecamov r6,#0 xca c:0 x0804 7d51 mov r5,#0 x

10、51 c:0 x0806 ddfe djnz r5,c:0806 c:0 x0808 defadjnz r6,c:0804 c:0 x080adff6 djnz r7,c:0802 c:0 x080c 22 ret 計算分析 : 程序共有三層循環(huán)一層循環(huán)n:r5*2 = 81*2 = 162us djnz 2us 二層循環(huán)m:r6*(n+3) = 202*165 = 33330us djnz 2us + r5 賦值1us = 3us 三層循環(huán) : r7*(m+3) = 15*33333 = 499995us djnz 2us + r6 賦值1us = 3us 循環(huán)外 : 5us 子程序調(diào)用2u

11、s + 子程序返回2us + r7 賦值1us = 5us 延時總時間= 三層循環(huán)+ 循環(huán)外= 499995+5 = 500000us =500ms 計算公式 :延時時間 =(2*r5+3)*r6+3*r7+5 二. 200ms 延時子程序程序 : void delay200ms(void) unsigned char i,j,k; for(i=5;i0;i-) for(j=132;j0;j-) for(k=150;k0;k-); 產(chǎn)生的匯編c:0 x0800 7f05 mov r7,#0 x05 c:0 x0802 7e84 mov r6,#0 x84 c:0 x0804 7d96 mov

12、r5,#0 x96 c:0 x0806 ddfe djnz r5,c:0806 c:0 x0808 defadjnz r6,c:0804 c:0 x080adff6 djnz r7,c:0802 c:0 x080c 22 ret 三. 10ms 延時子程序程序 : void delay10ms(void) unsigned char i,j,k; for(i=5;i0;i-) for(j=4;j0;j-) for(k=248;k0;k-); 產(chǎn)生的匯編c:0 x0800 7f05 mov r7,#0 x05 c:0 x0802 7e04 mov r6,#0 x04 c:0 x0804 7df8

13、 mov r5,#0 xf8 c:0 x0806 ddfe djnz r5,c:0806 c:0 x0808 defadjnz r6,c:0804 c:0 x080adff6 djnz r7,c:0802 c:0 x080c 22 ret 四. 1s 延時子程序程序 : void delay1s(void) unsigned char h,i,j,k; for(h=5;h0;h-) for(i=4;i0;i-) for(j=116;j0;j-) for(k=214;k0;k-); 產(chǎn)生的匯編c:0 x0800 7f05 mov r7,#0 x05 c:0 x0802 7e04 mov r6,#0 x04 c:0 x0804 7d74 mov r5,#0 x74 c:0 x0806 7cd6

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論