新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機延時精確計算

        單片機延時精確計算

        作者: 時間:2016-11-18 來源:網絡 收藏
        在不同單片機中,有不同的單片機指令。每個指令都占用不同的時鐘周期。一般延時程序就是通過循環去達到延時的作用。

        下面以最基礎的51單片機去做說明:

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

        我這邊用我之前debug過的2個延時程序,晶振使用12M:

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

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

        匯編好點的話也可以直接看匯編計算或者直接寫匯編程序。

        這時我們可以使用下面宏去調用上面的接口

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

        這邊顯然有點誤差的。但是數值越大,誤差就相對小點。

        僅僅需要幾us的延時,使用_NOP_();

        下面ms級延時一樣。

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

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

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

        總而言之,就是根據單片機的指令,還有每個指令占用的時鐘周期計算出相對應的精確延時。



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 南靖县| 兰考县| 九龙县| 禄丰县| 呼伦贝尔市| 白玉县| 灌云县| 方城县| 张掖市| 开化县| 南靖县| 灵山县| 灵丘县| 安吉县| 广昌县| 永安市| 南靖县| 怀安县| 喀喇沁旗| 方山县| 安多县| 翁源县| 招远市| 山西省| 中方县| 郎溪县| 岚皋县| 新泰市| 平罗县| 长垣县| 玉田县| 那坡县| 东宁县| 稻城县| 吉木萨尔县| 招远市| 莱阳市| 丹江口市| 六盘水市| 清涧县| 施秉县|