您的位置:首页 > 其它

51 单片机的多机通信

2016-01-25 12:03 211 查看
;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 口显示主机发送过来的数据。

;题目链接:http://zhidao.baidu.com/question/570025341

;根据题目要求,做而论道画出了一个简化电路图如下:



;图片链接:http://xiangce.baidu.com/picture/detail/c924441ac59608d8565deef2c1782f2eefcf9eff

;做而论道修改成功的程序如下:
;==============================================

;主机: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 发送一次数据即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: