51 单片机的多机通信

来源:互联网 发布:js导出excel表格兼容 编辑:程序博客网 时间:2024/06/18 11:19

;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


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


51 单片机的多机通信 - 非著名博主 - 电子信息角落

;图片链接: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 发送一次数据即可。


0 0
原创粉丝点击