• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 用單片機C語言精確延時(定時)的方法

    用單片機C語言精確延時(定時)的方法

    作者: 時間:2012-11-10 來源:網絡 收藏

    本人在閑暇的時候對下的各類延時程序做了下總結。由于下利用軟件延時不容易做到精確的定時,所以很多人在編寫延時子程序的時候不能好好的把握延時的具體時間。下,延時程序主要有以下幾種:

    一:

    void delay(unsigned char k)
    {

     unsigned char i,k; //定義變量
     for(i=0;ik;i++); //for循環語句

    }

    該程序在Keil環境下,會先將C語言轉化成匯編語言那么我們就可以根據匯編語言來計算出精確的時間,轉化具體步驟如下:

     CLR A   ;指令1
     MOV R7,A ;指令2  
    LOOP:
    INC R7  ;指令3
    CJNE  R7,k,LOOP    ;指令4

    這里,指令1,指令2和指令3各消耗1個機器周期,指令4消耗兩個機器周期(可查此表得知:http://www.51hei.com/mcuteach/1312.html),而在12M的晶振下一個機器周期是1us,在這個過程中,指令1和指令2分別執行1次,即消耗1+1us,而指令3和指令4分別執行了k次,那么這樣加起來,這個延時子程序所消耗的具體時間就是t=1+1+(1+2)*k=3k+2us。

    呵呵,這樣說來,如果我們定義的k為100的話,這個延時子程序的精確時間就是302us。  

    二:

    void delay(unsigned char i)
    {
    while(--i)
    {;}
    } 

    同樣的道理,將其反匯編,可以看到,只有一條語句:DJNZ  i,$;

    該語句消耗2us,一共執行i次,所以總共消耗時間t=i*2us。

    三:

    下面的將形參換為整形int,這樣的話,反匯編所執行的語句完全不同,用個具體的數字做例子:

    void delay()
    {
    unsigned int i=10000;
    while(--i)
    ;
    }

    反匯編后:

    4: unsigned int i=10000;

    C:0x0003 7F10 MOV R7,#0x10
    C:0x0005 7E27 MOV R6,#0x27

    5: while(--i)
    6: ;
    C:0x0007 EF MOV A,R7
    C:0x0008 1F DEC R7
    C:0x0009 7001 JNZ C:000C
    C:0x000B 1E DEC R6
    C:0x000C 14 DEC A
    C:0x000D 4E ORL A,R6
    C:0x000E 70F7 JNZ C:0007

    具體計算如下

    1.R7經過10H(16)次循環減為0:
    t1=10H*(1+1+2+1+1+2)
    2.R6經過27H*256次循環減為0:
    t2=27H*256*(1+1+2+1+1+2)+27H*1
    3.最后R7的是變為255,因此還要多出255次的循環:
    t3=255*(1+1+2+1+1+2)
    4.加上之前消耗的2us,總消耗時間:
    T=2+10H*(1+1+2+1+1+2)+27H*256*(1+1+2+1+1+2)+27H*1+255*(1+1+2+1+1+2)
    =2+16*7+39*256*7+39*1+255*7
    =71826us
    大約為72ms吧
    如果定義一個unsigned int i,那么延時計算公式為T=2+(i%256)*7+(i/256)*256*7+i/256+255*7

    關于其他類型的延時程序都可以按照這個方法對時間進行較為精確的計算。

    如果你懶得計算我還給大家推薦一個簡單的方法:就是用keil的軟件仿真功能來仿真出C語句執行的時間,具體方法可以看這里:http://www.51hei.com/bbs/dispbbs.asp?boardid=10Id=4711

    昨天熬夜整理的,從這個程序中可以看出C語言和匯編語言的一些區別,希望對大家有幫助

    c語言相關文章:c語言教程




    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 阳信县| 大渡口区| 马公市| 抚远县| 仙游县| 凤庆县| 万年县| 子长县| 焉耆| 杂多县| 许昌县| 界首市| 晴隆县| 新干县| 灵台县| 方正县| 海兴县| 九江县| 申扎县| 扎赉特旗| 万州区| 宝坻区| 岱山县| 阿鲁科尔沁旗| 榆树市| 区。| 鹤庆县| 揭阳市| 定远县| 固安县| 洞口县| 当阳市| 新乡市| 常熟市| 綦江县| 张家川| 嘉峪关市| 卢龙县| 确山县| 拉萨市| 武定县|