<pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

          <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

          <p id="bbfd9"></p>

          <p id="bbfd9"><cite id="bbfd9"></cite></p>

            <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

            <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
            <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>

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

            時間:2025-11-27 14:12:37 C語言

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

              C語言的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。那么用單片機C語言精確延時(定時)的方法都是怎樣的呢?以下僅供參考!

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

              一:

              void delay(unsigned char k)

              {

              unsigned char i,k; /pic/p>

              for(i=0;i<k;i++); /pic/p>

              }

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

              CLR A ;指令1

              MOV R7,A ;指令2

              LOOP:

              INC R7 ;指令3

              CJNE R7,k,LOOP ;指令4

              這里,指令1,指令2和指令3各消耗1個機器周期,指令4消耗兩個機器周期(可查文末附錄表),而在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

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

            【用單片機C語言精確延時(定時)的方法】相關文章:

            單片機C語言的好處12-03

            單片機C語言的誤用12-24

            如何優化C語言(單片機)01-10

            學習C語言的方法11-20

            C語言在單片機開發中的問題12-31

            單片機C語言入門教程03-13

            單片機C語言的內存泄露總結10-25

            單片機c語言教程:C51循環語句11-18

            如何提高單片機C語言代碼效率02-20

                    <pre id="bbfd9"><del id="bbfd9"><dfn id="bbfd9"></dfn></del></pre>

                    <ruby id="bbfd9"></ruby><p id="bbfd9"><mark id="bbfd9"></mark></p>

                    <p id="bbfd9"></p>

                    <p id="bbfd9"><cite id="bbfd9"></cite></p>

                      <th id="bbfd9"><form id="bbfd9"><dl id="bbfd9"></dl></form></th>

                      <p id="bbfd9"><cite id="bbfd9"></cite></p><p id="bbfd9"></p>
                      <p id="bbfd9"><cite id="bbfd9"><progress id="bbfd9"></progress></cite></p>
                      飘沙影院