我正在使用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会发送正确的数据吗?
此致
答案 0 :(得分:1)
你是对的,后面标签里面的代码应该像这样重写:
back:
jb TI,$
mov A,P0
mov SBUF,A
sjmp back
像我之前编写的 back
标签保证您在完成最后一次数据发送之前不会将任何数据移动到SBUF。
此处有一个细节需要考虑,请记住 串口中断 (通过接收或传输) 不会自动清除 ,所以在我假设您手动清除TI中断标志之前的代码中。