51 单片机的多机通信
扫描二维码
随时随地手机看文章
;51 单片机的多机通信,有些特殊。它专有一个控制位 SM2 。
;当把 SM2 设置为 1 后,单片机的串口,就仅仅接收《第 9 位为 1 的数据》。
;对方发送的《第 9 位为 0 的数据》 ,接收机的串口是不理会的。
;本来,串行通信的第 9 位数据,通常都理解成奇偶校验位,还是可有可无的。
;但是,在 51 单片机多机通信的场合,第 9 位的意义就变了,而且还不可缺少。
;嗯,看来,还得把串口设置成方式 2 或方式 3,这才是《9 位数据》的通信方式。
;为了用 T1 控制波特率,还是用方式 3 比较合适。
;
;多机通信的流程如下:
;
;1.各从机,先设置 SM2 为 1,处于只接收《第 9 位为 1》的状态。
;2.主机,以《第 9 位为 1》的形式发送一个字节到全部从机。
;3.各从机把收到字节,与本机的号码相对比,应该只有一台从机是相同的。
;4.该从机,可以把自己的 SM2 清零了,此后,它就可以和主机进行双机通信。
;5.主机和该从机双机通信时,应该用《第 9 位为 0》的形式,以免被其它从机窃听。
;6.当该从机收到表示结束通信的字节时,再把自己的 SM2 置 1。
;看到了吧 ?
;SM2=1、SM2=0,都是在从机中进行修改,主机的 SM2 是 1 还是 0,无所谓。
;
;主机还是用 SM2=0 吧,省去从机发送的时,设定第九位的麻烦。
;如果非得想要设定,也可以把第九位当做奇偶校验位。
;
;有一个关于多机通信的题目:
;单片机通信,一个主机,二个从机。
;主机 P1 口设置要送的地址,P2 口设置要送的数据。
;从机 P1 口设置本机的地址,P2 口显示主机发送过来的数据。
;根据题目要求,做而论道画出了一个简化电路图如下:
;做而论道修改成功的程序如下:
;==============================================
;主机:P1 口设置要送的地址,P2 口设置要送的数据
;----------------------------------------------
ORG 0000H
JMP MAIN
ORG 0023H
LJMP UART_INT
MAIN:
MOV SCON, #0D0H ;方式3(9位数据),双机通信
MOV TMOD, #20H ;T1定时模式2
MOV TH1, #0FDH ;9600 bps @ 11.0592MHz
MOV TL1, #0FDH ;
SETB TR1 ;启动T1
SETB ES
SETB EA
;-----------------------
WAIT:
JB P3.7, $ ;等待按下
MOV R6, #20
DJNZ R7, $ ;延时
DJNZ R6, $ - 2
JB P3.7, WAIT ;消抖
JNB P3.7, $ ;等待释放
;-----------------------
SETB TB8 ;和全部从机通信
MOV SBUF, P1 ;给从机发送地址
CLR F0
JNB F0, $ ;等待发送完毕
CLR F0
;-----------------------下面等待从机回信
MOV R6, #3
WAIT2:
DJNZ R7, $
JB F0, SEND_DATA;
DJNZ R6, WAIT2 ;等三次
SJMP WAIT ;从机未开机,不等了
;-----------------------
SEND_DATA:
CLR TB8 ;只和叫通的从机通信
CLR F0
MOV SBUF, P2 ;发送数据
SJMP WAIT
;-----------------------
UART_INT:
JBC TI, ACK1 ;发送完毕转移
CLR RI
MOV A, SBUF
CJNE A, #55H, ACK0;回信不正确转移
ACK1: SETB F0 ;设置标志
ACK0: RETI
;-----------------------
END
;==============================================
;==============================================
;从机:P1 口设置本机的地址,P2 口显示主机发来的数据
;----------------------------------------------
ORG 0000H
JMP MAIN
ORG 0023H
JMP RCE
MAIN:
MOV SCON, #0F0H ;方式3(9位数据),多机通信
MOV TMOD, #20H ;T1定时模式2
MOV TH1, #0FDH ;9600 bps @ 11.0592MHz
MOV TL1, #0FDH ;
SETB TR1 ;启动T1
SETB ES
SETB EA
LJMP $
;-----------------------
RCE:
JBC TI, DIFF
CLR RI
JNB SM2, DATA1
MOV A, SBUF
CJNE A, P1, DIFF
CLR SM2 ;地址正确,改为双机通信
MOV SBUF, #55H ;发送回信
DIFF:
RETI
;-----------------------
DATA1:
MOV P2, SBUF
SETB SM2 ;设为多机通信
RETI
;--------------------------------------------
END
;============================================
;这个题目的要求比较简单,主从叫通后,仅仅通信了一个字节就完事了。
;这么简单,也可以不用交互式的通信,叫通从机后,主机只要再用 TB8=0 发送一次数据即可。