新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 有關單片機延時程序

        有關單片機延時程序

        作者: 時間:2013-05-18 來源:網絡 收藏

        應用的時候,經常會遇到需要短時間延時的情況。需要的延時時間很短,一般都是幾十到幾百微妙(us)。有時候還需要很高的精度,比如用驅動 DS18B20的時候,誤差容許的范圍在十幾us以內,不然很容易出錯。這種情況下,用計時器往往有點小題大做。而在極端的情況下,計時器甚至已經全部派上了別的用途。這時就需要我們另想別的辦法了。

        以前用匯編語言寫程序的時候,這個問題還是相對容易解決的。比如用的是12MHz晶振的51,打算延時20us,只要用下面的代碼,就可以滿足一般的需要:

        mov r0, #09h

        loop: djnz r0, loop

        51 單片機的指令周期是晶振頻率的1/12,也就是1us一個周期。mov r0, #09h需要2個極其周期,djnz也需要2個極其周期。那么存在r0里的數就是(20-2)/2。用這種方法,可以非常方便的實現256us以下時間的延時。如果需要更長時間,可以使用兩層嵌套。而且精度可以達到2us,一般來說,這已經足夠了。

        現在,應用更廣泛的毫無疑問是Keil的 C編譯器。相對匯編來說,C固然有很多優點,比如程序易維護,便于理解,適合大的項目。但缺點(我覺得這是C的唯一一個缺點了)就是實時性沒有保證,無法預測代碼執行的指令周期。因而在實時性要求高的場合,還需要匯編和C的聯合應用。但是是不是這樣一個,也需要用匯編來實現呢?為了找到這個答案,我做了一個實驗。

        用C語言實現,首先想到的就是C常用的循環語句。下面這段代碼是我經常在網上看到的:

        void delay2(unsigned char i)

        {

        for(; i != 0; i--);

        }

        到底這段代碼能達到多高的精度呢?為了直接衡量這段代碼的效果,我把 Keil C 根據這段代碼產生的匯編代碼找了出來:

        ; FUNCTION _delay2 (BEGIN)

        ; SOURCE LINE # 18

        ;---- Variable i assigned to Register R7 ----

        ; SOURCE LINE # 19

        ; SOURCE LINE # 20

        0000 ?C0007:

        0000 EF MOV A,R7

        0001 6003 JZ ?C0010

        0003 1F DEC R7

        0004 80FA SJMP ?C0007

        ; SOURCE LINE # 21

        0006 ?C0010:

        0006 22 RET

        ; FUNCTION _delay2 (END)


        上一頁 1 2 3 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 柘城县| 黄浦区| 普兰店市| 永新县| 涟源市| 太仓市| 防城港市| 凤山市| 嘉鱼县| 改则县| 肇庆市| 普洱| 阳城县| 麻阳| 循化| 秦安县| 怀安县| 鄂尔多斯市| 营山县| 巩留县| 墨脱县| 荔波县| 安阳市| 青浦区| 屏东市| 永顺县| 临漳县| 资阳市| 奈曼旗| 洛扎县| 株洲市| 湾仔区| 安义县| 马尔康县| 宁德市| 曲松县| 高台县| 定兴县| 平陆县| 闻喜县| 三明市|