51单片机串口通信(汇编)

请问能否把51的发送与接收口连接,来完成自己与自己的通信下面的程序有问题吗,先谢了
ORG 0000H
AJMP START
ORG 0023H
AJMP SINT
ORG 0100H
START: MOV TMOD,#20H
MOV TL1,#00H
MOV TH1,#00H
SETB ES
SETB EA
SETB TR1
MOV SCON,#50H

MOV 20H,#FCH;这几行我是用来测试的的数据
MOV 21H,#FDH
MOV 22H,#FEH

MOV R0,#20H
MOV R7,#03H
LOOP: MOV A,@R0
MOV C,P
CPL C
MOV ACC.7,C
MOV SBUF,A
HERE: AJMP HERE
SINT: MOV P1,R0
JB RI,RECV
JB TI,SEND
AJMP HERE
SEND: CLR TI
INC R0
AJMP LOOP
RECV: MOV R2,SBUF
CLR RI
CPL P1.7
AJMP HERE
END
最后发现只能发送一次后就不行了,记只能把第一个数据发出去,望高手不吝赐教

HERE: AJMP HERE
SINT: MOV P1,R0
JB RI,RECV
JB TI,SEND
AJMP HERE

中断里面直接用这种方式直接跳到主程序,我以前还是真没试过,不过估计能行吧。 我一直用RETI 返回堆栈地址位置的。

但下面这地方肯定有错的,就是执行MOV SBUF,A 后没有等待!!
正确的顺序是: CLR TI ;清发送标记
MOV SBUF,A ;发送
JNB TI,$ ; 这里是如果TI没有被置1就等待,因为送数可能还没有完成。。就去执行别的动作,可能会有问题。
接收也一样要等待:
MOV A,SBUF
JNB RI,$ ;等待接收完成标志。

另外:
CPL P1.7 有问题,我猜你是用P1.7来观察接收次数,
但由于CPL P1.7取反命令是读一下P1.7再取反输出的,如果你的p1.7外接电路不科学,不合理,可能会出现你每次不管发1,还是发0,p1.7都是低电平,比如你将p1.7直接接在npn三管基极就会一直是0V或0.7V , P1.7的读入值会总为0,CPL 输出会总是为1
你可以用内部(非P口的位地址过度一下),比如: CPL 01H
MOV C,01H
MOV P1.7,C
你先试验吧。。。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-07
呵呵,发送三次,你的程序,确实是只发送了一次。可考虑使用循环结构来发送三次。

另外,发送(和接收)后,将进入中断程序;
在中断的末尾,应该是RETI指令,不应该用AJMP指令。

再有,你 没有 延时程序,那么,收到了数据,人的眼睛也是来不及看的。
相似回答