單片機延時程序的設計:一直不是很明白C語言的延時程序,前些天看到一個講解單片機C語言延時程序的文章,非常不錯。
很多單片機開發(fā)人員都喜歡使用C語言來編寫單片機程序,相對于匯編語言,C語言確實很方便,但是應用單片機的時候,經(jīng)常會遇到需要短時間延時的情況。需要的延時時間很短,一般都是幾十到幾百微妙(us)。有時候還需要很高的精度,比如用單片機驅(qū)動 DS18B20的時候,誤差容許的范圍在十幾us以內(nèi),不然很容易出錯。這種情況下,用計時器往往有點小題大做。而在極端的情況下,計時器甚至已經(jīng)全部派上了別的用途。這時就需要我們另想別的辦法了。
以前用匯編語言寫單片機程序的時候,這個問題還是相對容易解決的。比如用的是12MHz晶振的51,打算延時20us,只要用下面的代碼,就可以滿足一般的需要:
mov r0, #09h
loop: djnz r0, loop
51 單片機的指令周期是晶振頻率的1/12,也就是1us一個周期。mov r0, #09h需要2個極其周期,djnz也需要2個極其周期。那么存在r0里的數(shù)就是(20-2)/2。用這種方法,可以非常方便的實現(xiàn)256us以下時間的延時。如果需要更長時間,可以使用兩層嵌套。而且精度可以達到2us,一般來說,這已經(jīng)足夠了。
現(xiàn)在,應用更廣泛的毫無疑問是Keil的 C編譯器。相對匯編來說,C固然有很多優(yōu)點,比如程序易維護,便于理解,適合大的項目。但缺點就是實時性沒有保證,無法預測代碼執(zhí)行的指令周期。因而在實時性要求高的場合,還需要匯編和C的聯(lián)合應用。但是是不是這樣一個延時程序,也需要用匯編來實現(xiàn)呢?
根據(jù)這個,筆者做了一個實驗,通過幾個C語言延時方式和其相應的匯編程序做了很詳細的說明。
另外再附上一個單片機C語言教程