急求高手解决51单片机串行口3机通信的问题!!!

在做课设,三机通信,开关由ADC0804模数转换后,当V>3V时主机A(地址01H)与从机B(地址02H)通信;反之与从机C(地址03H)通信。各机数码管显示与之通信机的地址。
主机程序:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN: MOV SCON, #0D0H ;//设置串行口工作在模式3下,接收使能
MOV TMOD, #20H ;//使用定时器1,工作在模式2下
MOV TH1, #0E6H ;//波特率1200
MOV TL1, #0E6H
SETB TR1 ;//启动定时器
START:CLR P3.3
CLR P3.6
CLR P3.7
MOV P1,#0FFH

CLR P3.2
CLR P3.6
SETB P3.6

JB P3.3,$

CLR P3.7
CALL DELAY
MOV A,P1
SETB P3.2
SETB P3.7

CLR C
SUBB A,#153
JNC CASE1
AJMP CASE2
;//***与B机(地址为2)通信***//
CASE1: SETB TB8 ;//第9位发送1
CLR TI ;//清发送中断标志位
MOV SBUF, #02H ;//发送地址02H
JNB TI, $ ;//等待发送结束
CLR TI ;//清发送中断标志位
CLR TB8 ;//第9位发送0
MOV SBUF, #06H ;//发送本机地址01H,06H为共阴极LED显示1字型编码
JNB TI, $ ;//等待发送结束
CLR RI ;//清接收中断标志位
JNB RI, $ ;//等待接收结束
MOV P0, SBUF ;//显示接收信息
SJMP MAIN ;//开始新的判断
;//***与C机(地址为3)通信***//
CASE2: SETB TB8 ;//第9位发送1
CLR TI ;//清发送中断标志位
MOV SBUF, #03H ;//发送地址03H
JNB TI, $ ;//等待发送结束
CLR TI ;//清发送中断标志位
CLR TB8 ;//第9位发送0
MOV SBUF, #06H ;//发送本机地址01H,06H为共阴极LED显示1字型编码
JNB TI, $ ;//等待发送结束
CLR RI ;//清接收中断标志位
JNB RI, $ ;//等待接收结束
MOV P0, SBUF ;//显示接收信息
SJMP MAIN ;//开始新的判断

DELAY:MOV R6,#25
DL1: MOV R7,#200
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
END
从机程序:
ORG 0000H
MOV TMOD,#00100000B ;//令定时器1工作在模式2
MOV TH1,#230
MOV TL1,#230
SETB TR1 ;//启动定时器1

MOV SCON,#11010000B ;//设置串行端口为模式3
MOV P0,#3FH ;//数码管初始状态显示0
LOOP:SETB SM2 ;//接收主机发出的地址码
CLR RI
JNB RI,$
MOV A,SBUF
CJNE A,#01,LOOP ;//判断地址码是否为01

CLR SM2 ;//接收主机送来的开关状态
CLR RI
JNB RI,$
MOV A,SBUF
JNB ACC.0,L1 ;//若按钮往上打,则与A机通信执行L1
AJMP L0

L1: MOV P0,#06H ;//与A建立起通信,数码管显示1
AJMP SEND ;//回报主机

L0: MOV P0,#3FH ;//开关断开,数码管显示0
AJMP LOOP

SEND:CLR TI ;//将数码管的状态回报给主机
MOV A,#06H
MOV SBUF,A
JNB TI,$
AJMP LOOP
END
运行后会出现三片单片机都停留在JNB RI,$这一条。请问这是为什么啊?
希望有好心的高手来帮帮忙,不胜感激!

你的主机第一字节发送的是02H或03H,从机在收到后 CJNE A,#01,LOOP就回去了,主机就一直等从机回复了,从机就等主机发下一次,死锁了。
程序调通后,主机控制也应加个超时限制,防止实际使用时出现干扰,接受不到信息时死机。
另外建议将CASE1和CASE2合并,MOV SBUF, #03H改为MOV SBUF,A,在跳转前给A赋值,或用其他寄存器也可以。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-01-29
JNB RI,$为等待串口接收到数据才能继续执行。
主机在发送完后不要加 JNB RI, $ ;//等待接收结束
建议把串口数据接收放在串口中断中来执行。
从机地址写错了 CJNE A,#01,LOOP ;//判断地址码是否为01 应为02。
先做个简单的测试,只有主机往从机发送数据,看看能否正常,再写从机给主机返回信息。

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网