关于SBUF的用法不太理解,请高手指教...

来源:百度知道 编辑:UC知道 时间:2024/07/02 19:44:05
这段程序是实现单片机与PC之间的数据通讯,我不明白的是单片机将数据放到SBUF后它自己为什么不能接收,只能被PC接收到呢?

org 0000H
AJMP START
ORG 30H
START:
mov SP,#5fh ;
mov TMOD,#20h ;T1: 工作模式2
mov PCON,#80h ;SMOD=1
mov TH1,#0FDH ;初始化波特率(参见表)
mov SCON,#50h ;Standard UART settings
MOV R0,#0AAH ;准备送出的数
SETB REN ;允许接收
SETB TR1 ;T1开始工作
WAIT:
MOV A,R0
CPL A
MOV R0,A
MOV SBUF,A
LCALL DELAY
JBC TI,WAIT1 ;如果TI等于1,则清TI并转WAIT1
AJMP WAIT
WAIT1: JBC RI,READ ;如果RI等于1,则清RI并转READ
AJMP WAIT1
READ:
MOV A,SBUF ;将取得的数送P1口
MOV P1,A
LJMP WAIT
DELAY: ;延时子程序
MOV R7,#0ffH
DJNZ R7,$
RET
END

我这段程序为什么实现不了流水灯? 现在对于以SBUF为中介的单片机内部通讯和单片机与PC的通信有点混了...请高手指教啊...
org 00h

mov 38h,#00000001b

loop:
mov a,38h
rl a
mov 38h,a
mov sbuf,a
call delay

loop2:
jbc ri,loop3
ajmp loop2

loop3:
mov a,sbuf
mov p1,a
call d

SBUF是串行口缓冲寄存器,包括发送寄存器和接收寄存器。他们有相同的名字和地址,但不会冲突,因为一个只能被读出,一个被写入。
单片机把数据放到SBUF后,用到的是发送寄存器,你要想单片机接收到数据,接收寄存器要被触发,就是接收到PC机的数据,触发RI

虽然公用的SBUF,但是发送和接收的条件不一样,所以自己接收不到自己发送的数据。