匿名使用者
匿名使用者 發問時間: 電腦與網際網路其他:電腦 · 2 0 年前

關於8051

小弟最近為8051的事苦惱...不知道下列程式該如何解釋...

希望各位大大會的話能夠幫幫我....謝謝

ORG 0000H

MOV A,#01111111B

LOOP: MOV P1,A

ACALL DELAY

RR A

AJMP LOOP

DELAY: MOV R4,#10

MOV TOMD,#00000001B

TIMER: MOV TH0,#3CH

MOV TL0,#0B0H

SETB TR0

WAIT: JB TF0,OK

AJMP WAIT

OK: CLR 0

DJNZ R4,TIMER

RET

END

2 個解答

評分
  • 匿名使用者
    2 0 年前
    最佳解答

    ORG 0000H //宣告起始位址在0x0000

    MOV A,#01111111B //把0x7F丟到A暫存器

    LOOP: MOV P1,A // LOOP程序起始, A 內值丟到P1暫存器

    ACALL DELAY //呼叫DELAY程序

    RR A //右旋 A

    AJMP LOOP //跳到LOOP:地方執行

    DELAY: MOV R4,#10 //DELAY程序起始, 將0xA丟給R4 register

    MOV TOMD,#00000001B //將00000001B丟到TOMD register (應該是TMOD)

    //設為mode1,16位元計時器

    TIMER: MOV TH0,#3CH //Timer程序起始,將0x3C丟到TH0 register

    MOV TL0,#0B0H //將 0xB0丟到TL0 register

    //計時器0起始值為0x3CB0

    SETB TR0 //將TR0bit設為1,計時器0開始動作

    WAIT: JB TF0,OK //Wait程序起始,如果TF0=1(計時器0溢位)

    //跳到OK程序

    AJMP WAIT //跳到WAIT:

    OK: CLR 0 //OK程序起始,清空bit 0

    DJNZ R4,TIMER //if R4-1不等於0,跳到Timer

    RET //Return

    END

    整體程式大略的動作為 將A register 設入01111111B值,經過一段delay時間後,右旋A, 類似跑馬燈程式.

    主要要注意A的變化

    01111111 -> 10111111 -> 11011111 -> 11101111 -> ....

    至於Delay多少時間,必須先知道系統時脈,才能算的出來.

    2005-06-07 21:03:14 補充:

    沒什麼特殊用意 只是純粹丟值進去A暫存器而已

  • 匿名使用者
    2 0 年前

    MOV A,#01111111B //把0x7F丟到A暫存器

    0x7F丟到A暫存器的0x7F是啥意思呀??

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