2013-05-31 80 views
0

我正在使用UART和中斷研究8051中的串行通信。今天,我偶然發現這段代碼中,作者說他不斷transfering數據來P0口的方式轉移正在發生,我認爲是voilating串行通信的規則在8051串行通信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將發送正確的數據?

問候

回答

1

你是絕對正確的,背面的標籤裏面的代碼應該改寫這樣的:

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

編碼back標籤就像我保證之前沒有你,你是不會動任何數據到SBUF直到完成發送最後的數據。

這裏有一個細節要考慮到,記得串口interrrupts(由接收或發送)是不會自動清除,所以在代碼之前我假設你清除了TI中斷標誌手動。