51單片機(jī)延時(shí)程序的設(shè)計(jì)方法_第1頁
已閱讀1頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、應(yīng)用單片機(jī)的時(shí)候,經(jīng)常會遇到需要短時(shí)間延時(shí)的情況。需要的延時(shí)時(shí)間很短,一般都是幾十到幾百微妙(us)。有時(shí)候還需要很高的精度,比如用單片機(jī)驅(qū)動(dòng)DS18B20的時(shí)候,誤差容許的范圍在十幾u(yù)s以內(nèi),不然很容易出錯(cuò)。這種情況下,用計(jì)時(shí)器往往有點(diǎn)小題大做。而在極端的情況下,計(jì)時(shí)器甚至已經(jīng)全部派上了別的用途。這時(shí)就需要我們另想別的辦法了。以前用匯編語言寫單片機(jī)程序的時(shí)候,這個(gè)問題還是相對容易解決的。比如用的是12MHz晶振的51,打算延時(shí)20us

2、,只要用下面的代碼,就可以滿足一般的需要:movr0#09hloop:djnzr0loop51單片機(jī)的指令周期是晶振頻率的112,也就是1us一個(gè)周期。movr0#09h需要2個(gè)極其周期,djnz也需要2個(gè)極其周期。那么存在r0里的數(shù)就是(202)2。用這種方法,可以非常方便的實(shí)現(xiàn)256us以下時(shí)間的延時(shí)。如果需要更長時(shí)間,可以使用兩層嵌套。而且精度可以達(dá)到2us,一般來說,這已經(jīng)足夠了?,F(xiàn)在,應(yīng)用更廣泛的毫無疑問是Keil的C編譯器。

3、相對匯編來說,C固然有很多優(yōu)點(diǎn),比如程序易維護(hù),便于理解,適合大的項(xiàng)目。但缺點(diǎn)(我覺得這是C的唯一一個(gè)缺點(diǎn)了)就是實(shí)時(shí)性沒有保證,無法預(yù)測代碼執(zhí)行的指令周期。因而在實(shí)時(shí)性要求高的場合,還需要匯編和C的聯(lián)合應(yīng)用。但是是不是這樣一個(gè)延時(shí)程序,也需要用匯編來實(shí)現(xiàn)呢?為了找到這個(gè)答案,我做了一個(gè)實(shí)驗(yàn)。用C語言實(shí)現(xiàn)延時(shí)程序,首先想到的就是C常用的循環(huán)語句。下面這段代碼是我經(jīng)常在網(wǎng)上看到的:voiddelay2(unsignedi)f(i!=0i)

4、到底這段代碼能達(dá)到多高的精度呢?為了直接衡量這段代碼的效果,我把KeilC根據(jù)這段代碼產(chǎn)生的匯編代碼找了出來:FUNCTION_delay2(BEGIN)SOURCELINE#18VariableiassignedtoRegisterR7SOURCELINE#19SOURCELINE#200000C0007:0000EFMOVAR700016003JZC001000031FDECR7000480FASJMPC0007SOURCELINE

5、#210006C0010:000622RETFUNCTION_delay2(END)真是不看不知道~~~一看才知道這個(gè)延時(shí)程序是多么的不準(zhǔn)點(diǎn)~~~光看主要的那四條語句,就需要6個(gè)機(jī)器周期。也就是說,它的精度頂多也就是6us而已,這還沒算上一條lcall和一條ret。如果我們把調(diào)用函數(shù)時(shí)賦的i值根延時(shí)長度列一個(gè)表的話,就是:idelaytimeus060008E4CLRA0009FFMOVR7A000AFEMOVR6A000BFDMOVR

6、5A000CFCMOVR4A000DAB00RMOVR3i03H000FAA00RMOVR2i02H0011A900RMOVR1i01H0013A800RMOVR0i0015C3CLRC0016120000ELCALLCULCMP0019601AJZC0010001BE500RMOVAi03H001D24FFADDA#0FFH001FF500RMOVi03HA0021E500RMOVAi02H002334FFADDCA#0FFH0025

7、F500RMOVi02HA0027E500RMOVAi01H002934FFADDCA#0FFH002BF500RMOVi01HA002DE500RMOVAi002F34FFADDCA#0FFH0031F500RMOViA003380D3SJMPC0007SOURCELINE#210035C0010:003522RETFUNCTION_delay2(END)呵呵,這倒是的確可以延遲很長時(shí)間~~~但是毫無精度可言了。那么,用C到底能不能實(shí)

8、現(xiàn)精確的延時(shí)呢?我把代碼稍微改了一下:voiddelay1(unsignedi)while(i)因?yàn)楦鶕?jù)經(jīng)驗(yàn),越簡潔的C代碼往往也能得出越簡潔的機(jī)器代碼。那這樣結(jié)果如何呢?把它生成的匯編代碼拿出來看一看就知道了。滿懷希望的我按下了“Buildtarget”鍵,結(jié)果打擊是巨大的:FUNCTION_delay1(BEGIN)SOURCELINE#13VariableiassignedtoRegisterR7SOURCELINE#140000

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(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

提交評論