單片機延時C語言程式

來源:互聯網
上載者:User
(晶振12MHz,一個機器周期1us.)
一. 500ms延時子程式
程式: 
void delay500ms(void){
   unsigned char i,j,k;
   for(i=15;i>0;i--)
     for(j=202;j>0;j--)
       for(k=81;k>0;k--);
}
產生的彙編:
C:0x0800     7F0F      MOV       R7,#0x0F
C:0x0802     7ECA      MOV       R6,#0xCA
C:0x0804     7D51      MOV       R5,#0x51
C:0x0806     DDFE      DJNZ      R5,C:0806
C:0x0808     DEFA      DJNZ      R6,C:0804
C:0x080A     DFF6      DJNZ      R7,C:0802
C:0x080C     22        RET      
計算分析:
程式共有三層迴圈
一層迴圈n:R5*2 = 81*2 = 162us                   DJNZ   2us
二層迴圈m:R6*(n+3) = 202*165 = 33330us          DJNZ   2us + R5賦值 1us = 3us
三層迴圈: R7*(m+3) = 15*33333 = 499995us        DJNZ   2us + R6賦值 1us = 3us
迴圈外:    5us             子程式調用 2us + 子程式返回 2us + R7賦值 1us = 5us
延時總時間 = 三層迴圈 + 迴圈外 = 499995+5 = 500000us =500ms
計算公式:延時時間=[(2*R5+3)*R6+3]*R7+5

二. 200ms延時子程式
程式:
void delay200ms(void){
   unsigned char i,j,k;
   for(i=5;i>0;i--)
     for(j=132;j>0;j--)
       for(k=150;k>0;k--);
}
產生的彙編
C:0x0800     7F05      MOV       R7,#0x05
C:0x0802     7E84      MOV       R6,#0x84
C:0x0804     7D96      MOV       R5,#0x96
C:0x0806     DDFE      DJNZ      R5,C:0806
C:0x0808     DEFA      DJNZ      R6,C:0804
C:0x080A     DFF6      DJNZ      R7,C:0802
C:0x080C     22        RET

三. 10ms延時子程式
程式:
void delay10ms(void){
   unsigned char i,j,k;
   for(i=5;i>0;i--)
     for(j=4;j>0;j--)
       for(k=248;k>0;k--);
}
產生的彙編
C:0x0800     7F05      MOV       R7,#0x05
C:0x0802     7E04      MOV       R6,#0x04
C:0x0804     7DF8      MOV       R5,#0xF8
C:0x0806     DDFE      DJNZ      R5,C:0806
C:0x0808     DEFA      DJNZ      R6,C:0804
C:0x080A     DFF6      DJNZ      R7,C:0802
C:0x080C     22        RET      

四. 1s延時子程式
程式:
void delay1s(void){
   unsigned char h,i,j,k;
   for(h=5;h>0;h--)
     for(i=4;i>0;i--)
       for(j=116;j>0;j--)
         for(k=214;k>0;k--);
}
產生的彙編
C:0x0800     7F05      MOV       R7,#0x05
C:0x0802     7E04      MOV       R6,#0x04
C:0x0804     7D74      MOV       R5,#0x74
C:0x0806     7CD6      MOV       R4,#0xD6
C:0x0808     DCFE      DJNZ      R4,C:0808
C:0x080A     DDFA      DJNZ      R5,C:0806
C:0x080C     DEF6      DJNZ      R6,C:0804
C:0x080E     DFF2      DJNZ      R7,C:0802

C:0x0810     22        RET



刻度    刻度也稱為振蕩周期,定義為時鐘脈衝的倒數(可以這樣來理解,刻度就是單片機外接晶振的倒數,例如12M的晶振,它的時間周期就是1/12 us),是電腦中最基本的、最小的時間單位。   在一個刻度內,CPU僅完成一個最基本的動作。對於某種單片機,若採用了1MHZ的時鐘頻率,則刻度為1us;若採用4MHZ的時鐘頻率,則刻度為250us。由於時鐘脈衝是電腦的基本工作脈衝,它控制著電腦的工作節奏(使電腦的每一步都統一到它的步調上來)。顯然,對同一種機型的電腦,時鐘頻率越高,電腦的工作速度就越快。但是,由於不同的電腦硬體電路和器件的不完全相同,所以其所需要的時鐘周頻率範圍也不一定相同。我們學習的8051單片機的時鐘範圍是1.2MHz-12MHz。   在8051單片機中把一個刻度定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示)。機器周期    在電腦中,為了便於管理,常把一條指令的執行過程劃分為若干個階段,每一階段完成一項工作。例如,取指令、儲存空間讀、儲存空間寫等,這每一項工作稱為一個基本操作。完成一個基本操作所需要的時間稱為機器周期。一般情況下,一個機器周期由若干個S周期(狀態周期)組成。8051系列單片機的一個機器周期同6個S周期(狀態周期)組成。前面已說過一個刻度定義為一個節拍(用P表示),二個節拍定義為一個狀態周期(用S表示),8051單片機的機器周期由6個狀態周期組成,也就是說一個機器周期=6個狀態周期=12個刻度。指令周期    指令周期是執行一條指令所需要的時間,一般由若干個機器周期組成。指令不同,所需的機器周期數也不同。對於一些簡單的的單位元組指令,在取指令周期中,指令取出到指令寄存器後,立即解碼執行,不再需要其它的機器周期。對於一些比較複雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器周期。    通常含一個機器周期的指令稱為單周期指令,包含兩個機器周期的指令稱為雙周期指令。<h1 class="mb-5" style="margin: 0px; padding: 0px;"><span class="ask-title">當80C51單片機晶振頻率為12MHz時,刻度.機器周期各是多少。</span></h1><pre id="answer-content-375512566" class="answer-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word;">答:1.刻度為晶振頻率的倒數:1/12微秒;    2.機器周期為12個刻度:1微秒;
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.