組合語言 DELAY 問題

ORG 0000H

MAIN:

MOV R1,#50 ;設R1暫存器跑50次

LOOP:

SETB P1.0 ;設置P1.0為1 High

CALL DELAY1 ;呼叫延遲0.005ms

CLR P1.0 ;清除為0 Low

MOV R0,#38 ;設R0暫存器跑38 38*0.5(Delay)=19

WAIT19R0:

CALL DELAY ;呼叫延遲0.5ms

DJNZ R0,WAIT19R0 ;R0不為零則跳到WAIT19R0 共跑38次19ms

DJNZ R1,LOOP ;重複(1ms high) (0 low) 週期 20ms 共50次 才換下個狀態

JMP MAIN ;跳回迴圈

DELAY: ;Delay 0.5ms

MOV TMOD,#00010000B

D1:

MOV TH1,#0FEH

MOV TL1,#0CH

SETB TR1

JNB TF1,$

CLR TF1

RET

DELAY1: ;Delay 0.005ms

MOV R3,#0 ;1 週期

DJNZ R3,$ ;2 週期

RET ;2 週期

;1+2+2

END

-------------------------------------------------------------------------------

為何high動作輸出的DELAY1 不是0.005ms,而是0.5ms

已更新項目:

MOV 暫存器的值 最多可以設多少呢?

EX:

MOV R1,#1000 對?錯? 還是

MOV R1,#255 數值只能在#0~#255之間?

另外還有另一個問題能否請您幫我解答 :

知識家 : http://tw.knowledge.yahoo.com/question/question?qi...

論壇 : http://www.robofun.net/forum/viewthread.php?tid=69...

2 個已更新項目:

我要的週期是

0.005 以下這樣寫因該就對了吧!!

MOV R3,#1 ;1 週期

MOV R3,#1 ;1 週期

MOV R3,#1 ;1 週期

RET ;2 週期

3 個已更新項目:

所以更改後:

DELAY1: ;Delay 0.005ms

NOP1 週期

DJNZ R3,$ ;2 週期

RET ;2 週期

;1+2+2

END

4 個已更新項目:

謝謝東邪大大的指導 我以為呼叫DELAY這個動作不會延遲

之所以會用0.005ms 是要用來控制伺服馬達 每按一個按鍵 就會旋轉0.9度 以及正.反轉的轉速

1ms~2ms之間 一共有1ms角度變化 (180度),因此我把它劃分成 200個 所以當我按一次按鍵就會變成 :

第一次按下:1ms+0.005ms (0度+0.9度)

第二次按下:1ms+0.005ms+0.005ms (0度+0.9*2) 以此類推

另外轉速的部份還在設計 就是另外一篇知識的提問

按鍵K1~K5 正轉 反轉 高速 中速 低速

我的想法是 不改變電壓下 改變週期 

5 個已更新項目:

改變週期 LOW的延遲時間 但HIGH都是固定的 舉個例:

6 個已更新項目:

當按鍵按了高速 :

第一次P1.0輸出HIGH(1)延遲1ms後,清除LOW(0)延遲10ms 經過10次HIGH LOW迴圈

第二次P1.0輸出HIGH(1)延遲1.005ms後,清除LOW(0)延遲10ms 10次HIGH LOW迴圈

當按鍵按了低速 :

第一次P1.0輸出HIGH(1)延遲1ms後,清除LOW(0)延遲20ms 10次HIGH LOW迴圈

第二次P1.0輸出HIGH(1)延遲1.005ms後,清除LOW(0)延遲20ms 10次HIGH LOW迴圈

7 個已更新項目:

不知道這樣的邏輯是否可以不用改變電壓 而是改變LOW的週期 來達到伺服馬達轉速的效果

2 個解答

評分
  • 8 年前
    最佳解答

    DJNZ R3,$

    第一次執行這指令時, R3會先減一,

    所以 R3=0-1=255,

    這指令會執行 256次,

    總週期=1+2*256+2=515 =0.515 ms

    若要精準一點,可把

    MOV R3,#0 改成

    MOV R3,#248

    總週期=1+2*248+2=499 =0.499 ms

    2012-02-15 18:38:38 補充:

    編輯有點失誤:

    請把

    第一次執行這指令時

    這句話的「第一次」移至次行「所以」的後面。

    原意是:

    執行這指令時, R3會先減一,

    所以第一次 R3=0-1=255。

    2012-02-16 00:31:42 補充:

    回應版主的補提問:MOV R1,#255 數值只能在#0~#255之間?

    以8051而言,R1是8位元暫存器,故只能賦值0~255。

    至於你在補充說明中所述0.005ms的寫法是可行的,

    (建議改成三個nop,再加一個ret。)

    但一般在應用上較少delay這麼短的時間,

    唯若你有特別用途,那另當別論。

    2012-02-16 00:35:03 補充:

    別忘了 call 這個delay 還要 2 個週期,

    故你這個0.005ms 的delay 應改為更精簡的:

    NOP

    RET

    2012-02-16 12:16:24 補充:

    快速的ON_OFF週期,馬達的電路可正確回應嗎?對馬達是否有不良影響?

    (我沒學過電子硬體或單晶片,以上純屬臆測,)

  • 8 年前

    菩提薩埵。即菩薩之稱。

    依。因也。

    謂依般若之本智本慧。自悟自修。

    以登彼岸之故。

還有問題?馬上發問,尋求解答。