新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)延時(shí)精確計(jì)算

        單片機(jī)延時(shí)精確計(jì)算

        作者: 時(shí)間:2016-11-18 來(lái)源:網(wǎng)絡(luò) 收藏
        在不同單片機(jī)中,有不同的單片機(jī)指令。每個(gè)指令都占用不同的時(shí)鐘周期。一般延時(shí)程序就是通過(guò)循環(huán)去達(dá)到延時(shí)的作用。

        下面以最基礎(chǔ)的51單片機(jī)去做說(shuō)明:

        本文引用地址:http://www.104case.com/article/201611/315776.htm

        我這邊用我之前debug過(guò)的2個(gè)延時(shí)程序,晶振使用12M:

        void delay_us_fun (unsigned int i)//us延時(shí)
        {
        while (i--);
        }

        這個(gè)是用來(lái)微秒級(jí)延時(shí)的,他在不同的參數(shù)i下,延時(shí)時(shí)間分別為實(shí)際為(9*i+16)us,這些延時(shí)的實(shí)際時(shí)間一般可以通過(guò)開發(fā)環(huán)境keil C51中模擬一下,看下時(shí)鐘就知道了。

        匯編好點(diǎn)的話也可以直接看匯編計(jì)算或者直接寫匯編程序。

        這時(shí)我們可以使用下面宏去調(diào)用上面的接口

        #define _delay_us(i)delay_us_fun((i)/9)

        這邊顯然有點(diǎn)誤差的。但是數(shù)值越大,誤差就相對(duì)小點(diǎn)。

        僅僅需要幾u(yù)s的延時(shí),使用_NOP_();

        下面ms級(jí)延時(shí)一樣。

        void delay_ms_fun (unsigned int mDelay1)//ms延時(shí)
        {
        unsigned int mDelay2;

        for (; mDelay1 > 0; mDelay1--)
        {
        for (mDelay2 = 0; mDelay2 < 123; mDelay2++)
        {
        }
        }
        }

        #define _delay_ms(i)delay_ms_fun((i*1000L)/998L)//實(shí)際為(i*1000-13)/998

        總而言之,就是根據(jù)單片機(jī)的指令,還有每個(gè)指令占用的時(shí)鐘周期計(jì)算出相對(duì)應(yīng)的精確延時(shí)。



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 盘锦市| 通道| 淮滨县| 新平| 银川市| 安吉县| 大荔县| 汤阴县| 江达县| 扎兰屯市| 陆良县| 萝北县| 阳春市| 余庆县| 辽宁省| 开江县| 台东县| 深水埗区| 新乡市| 金华市| 阿拉善右旗| 南召县| 枞阳县| 长白| 岑巩县| 中牟县| 赞皇县| 舟曲县| 奉化市| 区。| 玉山县| 甘德县| 正阳县| 奎屯市| 昆山市| 通许县| 盐亭县| 白银市| 孝义市| 当涂县| 平和县|