8051的DELAY算法

MOV R7,#60

CALL DELAY

DELAY:

MOV R6,#10

D1: MOV R5,#249

D2: DJNZ R5,D2

DJNZ R6,D1

DJNZ R7,DELAY

RET

我的老師給的答案是這樣

{[(2*249)+1+2]*10+1+2}*60+2=總DELAY

我不懂怎麼是這樣算

我想問2*249的2怎麼來ㄉ

還有249後面+1跟+2怎麼來ㄉ

*10後面+1跟+2怎麼來ㄉ

3 Answers

Rating
  • 1 decade ago
    Best Answer

    副程式中一共有三個迴圈, 圖示如下:

    DELAY: ---------------+-> 3

    MOV R6,#10 1 |

    D1: ---------+-> 2 |

    MOV R5,#249 1 | |

    D2: ---+-> 1 | |

    DJNZ R5,D2 2 -/ | |

    DJNZ R6,D1 2 -------/ |

    DJNZ R7,DELAY 2 -------------/

    RET 2

    總執行週期計算如下:

    第一圈: A = 2 * 249 (R5)

    其中 2 => DJNZ R5,D2

    第二圈: B = (A + 1 + 2) * 10 (R6)

    其中 1 => MOV R5,#249

    2 => DJNZ R6,D1

    第三圈: C = (B + 1 + 2) * 60 (R7)

    其中 1 => MOV R6,#10

    2 => DJNZ R7,DELAY

    結果為: D = C + 2

    其中 2 => RET

    以上為 DELAY 副程式所需時間計算圖解, 希望能解答您的疑惑!

  • John
    Lv 6
    1 decade ago

    越多括號表示越內層,從迴圈中來看,就是最中間的位置。

    (2*249) => D2: DJNZ

    2個指令週期 * R5(#249)

    249)+1+2 =>

    +1 = D1: mov的指令週期

    +2 = DJNZ R6的指令週期 (為後面*10做準備)

    以此類推,所謂+1, +2,

    是加上mov跟計算下一個DJNZ的指令週期。

    此處總DELAY是指令週期,

    要換算實際的clock才會是時間單位。

    2009-11-17 08:56:51 補充:

    不是有說明了,怎麼要投票,還是看不懂嗎?

    雖然兩個答案講同樣的東西,

    但二號比較仔細,我投他一票~

    要是你仍然看不懂,投票選出哪一個,都一樣....沒用。

    Source(s): 自己
  • K Di
    Lv 7
    1 decade ago

    上次我們上過8051的DELAY

    但還是不知道要怎麼算,我大概只能回答你第一個問題

    那個2是D1這動作延遲2(單位不知道是ms還是us還是其他@@),249是重複的次數

Still have questions? Get your answers by asking now.