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 レジスタに常に書き込みを行っているため、前のデータが送信されるまで (TI フラグによって通知される) SBUF に書き込むべきではないという規則に違反していることです。

上記のコードで SBUF レジスタに常にデータを書き込むことは有効ですか? UART は正しいデータを送信しますか?

よろしく

4

1 に答える 1

1

あなたは間違いなく正しいです。裏ラベル内のコードは次のように書き直す必要があります。

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

前に行ったようにラベルをコーディングbackすると、最後のデータの送信が完了するまでデータを SBUF に移動しないことが保証されます。

ここで考慮すべき詳細が 1 つあります。シリアル ポート割り込み(受信または送信による) は自動的にクリアされないことに注意してください。そのため、前のコードでは、TI 割り込みフラグを手動でクリアしたと想定しています。

于 2013-06-07T06:46:22.123 に答える