單片機(jī)精確軟件延時(shí)設(shè)計(jì)方法研究_第1頁
單片機(jī)精確軟件延時(shí)設(shè)計(jì)方法研究_第2頁
單片機(jī)精確軟件延時(shí)設(shè)計(jì)方法研究_第3頁
單片機(jī)精確軟件延時(shí)設(shè)計(jì)方法研究_第4頁
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡介

1、單片機(jī)精確軟件延時(shí)設(shè)計(jì)方法研究         摘要: 在單片機(jī)控制應(yīng)用中,經(jīng)常會遇到需要短時(shí)間延時(shí)的情況,有時(shí)還需要很高的精度。然而每次延時(shí)都使用定時(shí)器/計(jì)數(shù)器是沒有必要的也是不現(xiàn)實(shí)的,利用軟件延時(shí)程序來完成一些需要延時(shí)的部分勢在必行。從研究軟件延時(shí)程序模式出發(fā),指出計(jì)算整個(gè)延時(shí)時(shí)間的具體方法,并在此基礎(chǔ)上歸納一種設(shè)計(jì)精確軟件延時(shí)的數(shù)學(xué)算法。 關(guān)鍵詞: 單片機(jī);軟件延時(shí);數(shù)學(xué)算法 中圖分類號:NT 文獻(xiàn)標(biāo)識碼:A 文章編號:16717597(2011)031008102 1 軟件延時(shí)的基本原理 單片機(jī)在進(jìn)行控制時(shí)

2、,CPU過一段時(shí)間再去作某件事情,稱之為延時(shí)。延時(shí)分為硬件延時(shí)和軟件延時(shí)。硬件延時(shí)是指使用定時(shí)/計(jì)數(shù)器來實(shí)現(xiàn)延時(shí),這種方法不占用CPU的工作時(shí)間。軟件延時(shí)是利用程序中的指令在被執(zhí)行時(shí)要花費(fèi)一定的機(jī)器周期來實(shí)現(xiàn)的,占用CPU的工作時(shí)間。軟件延時(shí)主要與兩個(gè)因素有關(guān),一是所用的晶振,二是延時(shí)程序的循環(huán)次數(shù)。單片機(jī)所用的晶振一經(jīng)確定之后,延時(shí)時(shí)間就被指令的循環(huán)次數(shù)所唯一確定了,如單片機(jī)的晶振頻率為6MHz,則一個(gè)機(jī)器周期為2s。下面根據(jù)指令循環(huán)的次數(shù)的不同,先來介紹軟件延時(shí)時(shí)長的計(jì)算方法(設(shè)晶振頻率為12MHz)。 2 軟件延時(shí)時(shí)長的計(jì)算方法 軟件延時(shí)常用如表1的匯編指令。 1)單循環(huán)延時(shí)程序 DEL

3、:MOV R0,#X;1T DEL1:DJNZ R0,DEL1;2XT RET;2T 延時(shí)時(shí)間:t=1+2X+2=2X+3=2R0+3 因?yàn)閄的取值范圍是0,255,X=0時(shí)延時(shí)時(shí)間最長。所以延時(shí)時(shí)間t的取值范圍是5,515s。 2)二重循環(huán)程序 DEL:MOV R1,#Y ;1T DEL1:MOV R0,#X ;1YT DEL2:DJNZ R0,DEL2;2XYT DJNZ R1,DEL1;2YT RET;2T 延時(shí)時(shí)間:t=1+1Y+2XY+2Y+2 =2XY+3Y+3=2R0R1+3R1+3 因?yàn)閄、Y的取值范圍均為0,255,X=Y=0時(shí)延時(shí)時(shí)間最長。所以延時(shí)時(shí)間t的取值范圍是8,13

4、1843s。 3)三重循環(huán)程序 DEL:MOV R2,#Z ;1T DEL1:MOV R1,#Y ;1ZT DEL2:MOV R0,#X ;1YZT DEL3:DJNZ R0,DEL3;2XYZT DJNZ R1,DEL2;2YZT DJNZ R2,DEL1;2ZT RET;2T 延時(shí)時(shí)間: t=1+1Z+1YZ+2XYZ+2YZ+2Z+2 =2XYZ+3YZ+3Z+3 =2R0R1R2+3R1R2+3R2+3 同理,延時(shí)時(shí)間t的取值范圍是11,33751811s。 綜上分析,由數(shù)學(xué)歸納法可得出N(N一般不大于8)重循環(huán)的延時(shí)時(shí)間計(jì)算公式: 3 C語言中延時(shí)程序的設(shè)計(jì)方法 在用C語言進(jìn)行編程時(shí)

5、涉及到的軟件延時(shí)程序,其設(shè)計(jì)方法與匯編語言的設(shè)計(jì)方法本質(zhì)相同。例如,在C語言的一個(gè)實(shí)例程序中用for語句編寫了一個(gè)延時(shí)子程序(該程序要求延時(shí)100ms)。 delay(void) unsigned char i,j; for(i=250;i>=1;i-) for(j=200;j>=1;j-) 利用keil c的反匯編功能,通過調(diào)用disassembly window命令查看到的匯編程序如下。 C:0X0060 7F7D MOV R7,#0XFA C:0X0062 7F32 MOV R6,#0XC8 C:0X0064 DEFE DJNZ R6,C:0064 C:0X0066 DFFA

6、 DJNZ R7,C:0062 C:0X0068 RET 帶入所得公式計(jì)算結(jié)果是100753s,利用keil c的測試工具得出的延時(shí)時(shí)間為100755s,誤差是由調(diào)用指令引起,后有詳細(xì)分析??梢缘贸鼋Y(jié)論,此處C語言中的for語句不僅與匯編語言中的DJNZ命令起到的作用類似且計(jì)算延時(shí)的方法也完全相同。即上面得出的公式同樣適用于計(jì)算用C語言編寫的延時(shí)程序。下面考慮一個(gè)相反的問題,也是本文著重要討論的。 4 軟件延時(shí)程序的設(shè)計(jì)算法 在實(shí)際的編程過程中,人們往往想得到一個(gè)規(guī)定了延時(shí)長度的延時(shí)子程序,即在已知延時(shí)時(shí)間的前提下設(shè)計(jì)循環(huán)次數(shù)。設(shè)計(jì)延時(shí)程序時(shí)應(yīng)注意使循環(huán)的重?cái)?shù)盡量少,以減少寄存器的使用量,同時(shí)

7、也使程序更加簡單,出錯(cuò)的可能性隨之降低。其次盡量不使用寄存器R0、R1,因?yàn)樗鼈兘?jīng)常用在間接尋址及需要傳送外部數(shù)據(jù)的地方。延時(shí)程序具體的編寫步驟如下: 1)明確晶振頻率,定出延時(shí)時(shí)間所需的最小循環(huán)數(shù); 2)將內(nèi)層循環(huán)設(shè)為最大值,即內(nèi)層循環(huán)的寄存器值取0; 3)根據(jù)公式確定出不大于所要的延時(shí)時(shí)間的最外層循環(huán)的寄存器的取值; 4)用所要得的延時(shí)時(shí)間減去上述步驟得出的延時(shí)時(shí)間,差值作為第二個(gè)所要的延時(shí)時(shí)間,重復(fù)步驟1)的做法,直至差值縮小至10s以內(nèi); 5)最后用添加NOP指令的方式來得到精確的延時(shí)時(shí)間。 例如設(shè)計(jì)一個(gè)延時(shí)時(shí)間為1s的延時(shí)程序。首先1s所屬的最小循環(huán)為三重循環(huán),將內(nèi)部寄存器的值設(shè)置為

8、0,其次根據(jù)公式算出不大于1s的外層循環(huán)的最大取值為7,此時(shí)得到的延時(shí)時(shí)間為922904s,與1s相減余數(shù)為77096s。而77096s屬于的最小循環(huán)為二重,當(dāng)外重循環(huán)取149時(shí),得到的延時(shí)時(shí)間為76738s,與77096相減余數(shù)為358s。358s通過一次循環(huán)程序配合NOP指令就可以得到。注意到三重循環(huán)與二重循環(huán)計(jì)算公式中占兩個(gè)機(jī)器周期的RET指令已不存在,要用NOP指令補(bǔ)充。因此可得到延時(shí)時(shí)間為1s的精確程序。 DEL: MOV R5,#7 DEL1:MOV R6,#0 DEL2:MOV R7,#0 DEL3:DJNZ R7,DEL3 DJNZ R6,DEL2 DJNZ R5,DEL1 M

9、OV R6,#149 DEL4:MOV R7,#0 DEL5:DJNZ R7,DEL5 DJNZ R6,DEL4 MOV R7,#177 DEL6:DJNZ R7,DEL6 NOP NOP NOP NOP NOP RET 利用keil c的測試工具,在延時(shí)程序的開始與結(jié)尾設(shè)置兩個(gè)斷點(diǎn),兩個(gè)斷點(diǎn)處的時(shí)間差值為1.00000200s。以上程序中2s的誤差是由于沒有考慮調(diào)用延時(shí)程序的指令所占用的機(jī)器周期,如ACALL、LCALL指令,將這些指令考慮進(jìn)去后減去兩個(gè)NOP指令,這樣就得到了精確的1s延時(shí)程序。這種方法對于用C語言來設(shè)計(jì)的延時(shí)程序同樣適用,下面是利用此法并考慮了調(diào)用指令的C語言延時(shí)程序。

10、delay(void) unsigned char i,j,k; for(k=7;k>=1;k-) for(j=255;j>=1;j-) for(i=255;i>=1;i-) for(j=164;j>=1;j-) for(i=255;i>=1;i-) for(i=66;i>=1;i-) _NOP_(); _NOP_(); _NOP_(); 5 總結(jié) 本文通過對軟件延時(shí)程序計(jì)算方法的公式化推導(dǎo),總結(jié)了一種精確設(shè)計(jì)軟件延時(shí)的數(shù)學(xué)算法,為分析和設(shè)計(jì)程序提供了一種新的方法和技巧。無論是對設(shè)計(jì)精度要求較高的程序還是對設(shè)計(jì)精度要求一般的程序都應(yīng)當(dāng)有使程序更加精確的好習(xí)慣,這樣不僅可以提高程序的精確度,還可減少程序出錯(cuò)的幾率。希望本文在實(shí)際問題解決的過程中對大家有所幫助。 參考文獻(xiàn): 1余錫存、曹國華,單片機(jī)原理及接口技術(shù)(第二版)M.西安:西安電子科技大學(xué)出版社,2007. 2沈舷,延時(shí)程序延時(shí)時(shí)間的計(jì)算J.電工技術(shù)與自動化,2005,(5):154-157. 3王超峰,單片機(jī)延時(shí)程序時(shí)間長度的記憶方法J.單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2002,(7):77-78. 4彭志剛,51系列單片機(jī)延時(shí)程序運(yùn)行時(shí)間的計(jì)算J.儀器儀表用戶,2008,(5):102-103. 5文樺,彭彥華.單片機(jī)應(yīng)用系統(tǒng)定時(shí)時(shí)間的誤差分析J.

溫馨提示

  • 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論