<li id="8g3ty"><tbody id="8g3ty"><th id="8g3ty"></th></tbody></li>
    <label id="8g3ty"><samp id="8g3ty"></samp></label>
  • <span id="8g3ty"></span>

    1. <center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
    2. <bdo id="8g3ty"><meter id="8g3ty"><bdo id="8g3ty"></bdo></meter></bdo><center id="8g3ty"><optgroup id="8g3ty"></optgroup></center>
      <label id="8g3ty"><samp id="8g3ty"></samp></label>

    3. 電子開發網

      電子開發網電子設計 | 電子開發網Rss 2.0 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

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

      作者:佚名    文章來源:本站原創    點擊數:    更新時間:2017-5-20

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

        本人在閑暇的時候對單片機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.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語句執行的時間,具體方法可以看這里:/Article/danpianji/1956.html

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

      Tags:單片機C語言精確延時,單片機,延時  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 国产91色综合久久免费分享| 亚洲综合男人的天堂色婷婷| 中文字幕亚洲综合小综合在线| 狠狠色综合网站久久久久久久高清 | 国产成人无码综合亚洲日韩| 狠狠色丁香婷婷综合精品视频| 亚洲精品综合在线影院| 国产天堂一区二区综合| 亚洲欧洲日产国产综合网| 国产成人综合野草| 99sescom色综合| 亚洲婷婷五月综合狠狠爱| 天天做天天做天天综合网| 久久久综合九色合综国产| 五月综合色婷婷在线观看| 亚洲国产综合AV在线观看| 国产色综合天天综合网| 色综合色综合色综合| 精品综合久久久久久98| 亚洲综合精品香蕉久久网97| 狠狠色综合久久久久尤物| 天天色天天射综合网| 91在线亚洲综合在线| 天天在线天天综合网色| 久久婷婷激情综合色综合俺也去| 狠狠色噜噜狠狠狠狠色综合久AV | 狠狠综合久久av一区二区| 久久久久综合国产| 久久综合日韩亚洲精品色| 国产色婷婷五月精品综合在线 | 91综合精品网站久久| 国内偷自视频区视频综合| 国产成人综合久久精品| 欧美激情综合亚洲一二区| 狠狠综合久久久久综合小说网| 99久久婷婷国产综合精品| 狠狠色丁香婷婷综合| 亚洲综合区图片小说区| 国产精品一区二区综合| 狠狠色丁香久久综合五月| 色婷婷天天综合在线|