<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 會員中心 會員注冊
      搜索: 您現在的位置: 電子開發網 >> 電子開發 >> 單片機 >> 正文

      單片機編寫延時函數的簡單方法

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

        這也是大家最常在QQ里問我的一個問題,如果從keil里看了c語言的反匯編代碼然后根據晶振和指令計算延時的時間這樣雖然非常的準確但是相當的麻煩而且容易搞錯,我這里介紹一個最簡單的方法.可以驗證你的延時函數

       

         這里用一個例程詳細介紹一下。
          過程參考如下:
          在編譯器下建立一個新項目,也可以利用已有項目。此過程中需要注意,單片機晶振的選擇,因為for循環里指令的執行時間和晶振有直接關系,本例中晶振使用11.0592M。


      單片機編寫延時函數的簡單方法 
       
          編寫一段關于延時的函數,主要利用for循環,代碼如下:
      void delay_ms(unsigned int ms)
      {
      unsigned int i;
      unsigned char j;
          for(i=0;i<ms;i++)
          {
              for(j=0;j<200;j++);
              for(j=0;j<102;j++);
          }

      }
      其中ms是輸入參數,如果輸入1,就是要求程序延時1ms。
      j變量是調整程序運行的時間參數。調整j的數值,使1次循環的時間在1ms。
          將此程序編譯通過,然后利用軟件仿真,調整時間。

      單片機編寫延時函數的簡單方法 

      下面這個sec就是程序運行到現在的這一行所用的時間。

      單片機編寫延時函數的簡單方法 

        兩次時間差就是延時函數使用的時間,如果與1ms相差比較多,用戶可以調整j參數的值,使延時時間盡量接近1ms。如增大j的值for(j=0;j<105;j++);
          此方法得出延時函數,在晶振不同的情況下,延時時間會不準。軟件調試結果,這個程序的延時時間為:1.01779ms,一般的單片機系統中都可以應用。

       

      下面來說說匯編的傳統計算方法:

       

      指令周期、機器周期與時鐘周期
             指令周期:CPU執行一條指令所需要的時間稱為指令周期,它是以機器周期為單位的,指令不同,所需的機器周期也不同。
             時鐘周期:也稱為振蕩周期,一個時鐘周期 =晶振的倒數。
             MCS-51單片機的一個機器周期=6個狀態周期=12個時鐘周期。
             MCS-單片機的指令有單字節、雙字節和三字節的,它們的指令周期不盡相同,一個單周期指令包含一個機器周期,即12個時鐘周期,所以一條單周期指令被執行所占時間為12*(1/12000000)=1us。

      了解了上面這些我們來看一個例子

      ;============延時1秒子程序========================
      DELAY_1S:         ;延時子程序,12M晶振延時1.002035秒
      MOV R4,#10
      L3: MOV R2 ,#200  ;1指令周期
      L1: MOV R3 ,#249  ;1指令周期
      L2: DJNZ R3 ,L2     ;2指令周期
      DJNZ R2 ,L1          ;2指令周期
      DJNZ R4 ,L3          ;2指令周期
      RET                      ;2指令周期
      ;循環體延時時間: [(249*2+1+2)*200+1+2]*10*12/12000000=1.002030s
      ;加上ACALL指令和第一條mov指令以及最后一條RET指令算出來整個函數的時間為1.002035s
      ;===================================================
      通常選用的是11.0592MHZ的晶振:
      [(249*2+1+2)*200+1+2]*10*12/11059200=1.08727213541666666...S

      匯編延時子程序的延時計算問題
      對于程序
      DELAY:  MOV R0,#00H
      DELAY1: MOV R1,#0B3H
      DJNZ R1,$
      DJNZ R0,DELAY1

        查指令表可知 MOV一個機器周期,DJNZ 指令需用兩個機器周期,而一個機器周期時間長度為12/11.0592MHz,所以該段程序執行時間為:

      ((0B3×2+1+2)×256+1)×12÷11059200=100.2789mS

        第一層:DJNZ R1,$:執行了B3H次,一次兩個周期,所以為0B3×2;

        第二層:MOV R1,#0B3H為一個周期,DJNZ R0,DELAY1為兩個周期,這樣循環一次就是0B3×2+1+2個周期;第二層的執行次數本來是255次,但因為賦首值為0,而DJNZ是先減1,再比較的,所以就應該是256次。

        這樣的話,整個循環執行完應該是(0B3×2+1+2)×256+1次。再加上開始賦值這一句,就是((0B3×2+1+2)×256+1)了

       

       

      還說明一下:

      nop指令或者_nop_(); 函數占一個機器周期,
         在stc單片機的12T模式下一個機器周期是一個振蕩周期的12分頻,如果你的晶振是12MHZ,那你的一個機器周期就是1微秒.一個nop指令的執行時間也就是1US

         當在6T模式(下載的時候可選擇模式)下12M晶振的時候,一個nop就是0.5US了.

      Tags:編寫延時函數的簡單方法,單片機教程,延時函數  
      責任編輯:admin
      請文明參與討論,禁止漫罵攻擊,不要惡意評論、違禁詞語。 昵稱:
      1分 2分 3分 4分 5分

      還可以輸入 200 個字
      [ 查看全部 ] 網友評論
      關于我們 - 聯系我們 - 廣告服務 - 友情鏈接 - 網站地圖 - 版權聲明 - 在線幫助 - 文章列表
      返回頂部
      刷新頁面
      下到頁底
      晶體管查詢
      主站蜘蛛池模板: 久久综合给合久久狠狠狠97色69| 亚洲综合激情六月婷婷在线观看| 一本久道综合在线无码人妻| 狠狠狠色丁香婷婷综合久久五月 | 久久青青草原综合伊人| 狠狠色丁香婷综合久久| 91精品一区二区综合在线| 亚洲国产免费综合| 成人综合激情另类小说| 色欲天天天综合网| 亚洲Av综合色区无码专区桃色 | 98精品国产综合久久| 综合久久国产九一剧情麻豆| 天天躁夜夜躁狂狂躁综合| 久久综合视频网站| 色综合久久98天天综合| 亚洲私人无码综合久久网| 久久综合九色综合网站| 久久综合噜噜激激的五月天| 亚洲色婷婷综合久久| 久久久久综合网久久| 久久综合噜噜激激的五月天| 亚洲综合在线视频| 亚洲国产欧美国产综合一区| 色综合久久综精品| 亚洲综合激情九月婷婷| 亚洲综合一区无码精品| 伊人色综合视频一区二区三区| 婷婷色香五月激情综合2020| 91精品国产综合久久香蕉| 色综合天天做天天爱| 色狠狠久久综合网| 激情综合婷婷丁香五月俺来也| 日本一道综合久久aⅴ免费| 狠狠色丁香婷婷综合久久片| 天天欲色成人综合网站| 狠狠色噜噜狠狠狠狠色综合久| 中文字幕国产综合| 久久综合综合久久综合| 色先锋资源久久综合5566| 久久九色综合九色99伊人|