里歐 發問時間: 電腦與網際網路程式設計 · 1 0 年前

8051程式的語法錯誤?

我目前正在寫8051控制步進馬達的程式指令碼,突然在延遲時間的

部份出現了錯誤? 我是照著書上面打的 指令如下

movtl0,#<(2**16-10000).mod.32

movth0,#>(2**16-10000)/32

有錯誤的地方應該是(2**16-10000)這部份 但是我不知道是要怎麼

改,麻煩大家告知一下 謝謝

已更新項目:

我把延遲時間的部份貼上來 這樣比較容易了解問題原因

Delay_10ms:

movtmod,#00000001b

movtl0,#<(2**16-10000).mod.32

movth0,#>(2**16-10000)/32

setbtr0

Timer_wait:

jbctf0,Timer_Ok

jmpTimer_wait

Timer_Ok:

djnzr7,Delay_10ms

clrtr0

ret

end

2 個解答

評分
  • 最佳解答

    movtl0,#<(2**16-10000).mod.32

    movth0,#>(2**16-10000)/32

    這兩行我用2500AD的編譯器是沒發生錯誤

    但是這兩行的運算用法有點怪怪的

    第一行看起來像是要取出除以32之餘數

    第二行看起來像是要取出除以32之商數

    可是在算式最前都用了 < 及 >

    這< 及 > 是用來取出算式結果的低位元組與高位元組

    所以看起來用法不合邏輯

    合理的算式,要不是應該為

    movtl0,#(2**16-10000).mod.32

    movth0,#(2**16-10000)/32

    或者是

    movtl0,#<(2**16-10000)/32

    movth0,#>(2**16-10000)/32

    你必須要了解你的程式要得到什麼運算結果,才知道算式要怎樣寫

    2007-08-28 08:17:24 補充:

    如果是delay 10mS,最後式子應該是

    movtl0,#<(2**16-10000)

    movth0,#>(2**16-10000)

  • 1 0 年前

    或許你的組譯器沒有支援這部份的運算,

    不過你的式子真的有點怪,

    所以你還是用計算機直接算出

    計時10ms所需的TH0,TL0的值,

    這樣反而會比較容易些

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