<nobr id="trllz"><thead id="trllz"></thead></nobr>

      <span id="trllz"></span>
        <progress id="trllz"></progress>

          <strike id="trllz"></strike>

              <em id="trllz"></em>

                專注電子技術學習與研究
                當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

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

                作者:51hei   來源:原創   點擊數:  更新時間:2009年09月29日   【字體:

                  最近在忙著單片機的項目,偶爾停下來小結了一下最近的收獲,還是有不少可貴的收益的。

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

                一:

                void delay(unsigned char k)
                {

                 unsigned char i,k;  //定義變量
                 for(i=0;i<k;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.qdxzsl.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.qdxzsl.com/bbs/dpj-4711-1.html

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

                關閉窗口

                相關文章

                中文一午夜乱理片无码

                    <nobr id="trllz"><thead id="trllz"></thead></nobr>

                    <span id="trllz"></span>
                      <progress id="trllz"></progress>

                        <strike id="trllz"></strike>

                            <em id="trllz"></em>