0

我正在使用 UART 和中断研究 8051 中的串行通信。今天我遇到了这段代码,作者说他一直在传输来自端口 0 的数据。传输发生的方式,我认为违反了 8051 中的串行通信规则。

org 00h
ljmp main

org 23h
ljmp serial_ISR


org 30h

main:

   mov TMOD,#20h
   mov TH1,#-03h
   mov SCON,#50h

   setb IE.7
   setb IE.4

   setb TR1

back:

    mov A,P0
    mov SBUF,A
    sjmp back

serial_ISR:

    jb TI,trans

    mov R0,SBUF

    clr RI

    RETI

trans:

   clr TI

   RETI

让我感到困惑的是,在back标签中我们不断地在 SBUF 寄存器上写入,这违反了我们不应该在之前的数据发送之前写入 SBUF 的规则(由 TI 标志通知)。

上述代码中不断向 SBUF 寄存器写入数据是否有效?UART会发送正确的数据吗?

问候

4

1 回答 1

1

你绝对是对的,背面标签内的代码应该这样重写:

back:
    jb TI,$
    mov A,P0
    mov SBUF,A
    sjmp back

像我之前所做的编码back标签向您保证,在它完成发送最后一个数据之前,您不会将任何数据移动到 SBUF。

这里有一个细节需要考虑,记住串口中断(通过接收或发送)不会自动清除,所以在我之前的代码中我假设你手动清除了 TI 中断标志​​。

于 2013-06-07T06:46:22.123 回答