您的位置: 网站首页 > 电子与嵌入式 > 单片机原理与应用 > 第7章 串行通信接口 > 【7.3 多 机 通 信】

7.3 多 机 通 信

 

7.3 

MCS-51单片机串行通信口控制寄存器SCON中的SM2为方式2或方式3的多机通信控制位。当串行口以方式2或方式3工作时,若SM2设为1,此时只有当串行口接收到的第9位数据RB8=1时,才置“l”中断标志RI;若接收到的RB8=0,则不产生中断标志,信息被丢掉。利用串行口的这个特性,可方便地实现多机通信。

设在一个多机系统中有一个MCS-51单片机做主机和3MCS-51单片机为从机,如图7-11所示。

7-11  多机通信连接示意图

从机的地址分别为00H01H02H,从机系统由初始化程序(或相关处理程序)将串行口设定为方式2或方式3接收,即9位异步通信方式,且置“1SM2REN,允许串行口中断。在主机和某一个从机通信之前,先将从机地址发送给各个从机系统,接着才传送数据或命令,主机发出的地址信息的第9位为“1”,数据(包括命令)信息的第9位为“0”。当主机向各从机发送地址时,各从机的串行口接收到的第9位的信息即RB8为“1”,则置中断标志位RI为“1”,各从机响应中断,执行中断服务程序,判断主机送来的地址是否和本机(从机)地址相符合,若为本机(从机)的地址,则该从机清零SM2位,准备接收主机的数据或命令;若地址不相符,则保持SM2为“1”状态。接着主机发送数据,此时各从机串行口接收到的RB8=0,只有与前面地址相符合的从机系统(即已将SM2清零的从机)才能激活中断标志位RI,从而进入中断服务程序,在中断服务程序中接收主机的数据或执行主机的命令,实现和主机的信息传送;其他的从机因SM2保持为“l”,又RB8=0不激活中断标志RI,所接收的数据丢失不作处理。

7-11所示的多机系统是总线型主从式通信系统,由主机控制多机之间的通信,从机和从机之间的通信只能经主机才能实现。

综上所述,现把多机通信的过程总结如下。

·    把全部从机的串行口初始化为工作方式2或方式3,置位SM2,允许中断。

·    主机置位TB8,发送要寻址的从机地址。

·    所有从机均接收主机发送的地址,并各自进入中断服务程序,进行地址比较。

·    被寻址的从机确认后,把自身的SM2清零,并向主机返回地址供主机校对。

·    核对无误后,主机向被寻址的从机发送命令,通知从机是进行数据接收还是进行数据发送。

·    主从机之间进行数据通信。

【例7-2总线型主从式通信系统程序设计。

解:1)主机向02号从机发送30H3FH单元内的数据。

ORG 8000H

MAIN:  MOV SCON,#98H       ;串行口方式2,令SM2=0REN=1TB8=1

MCALL:  MOV SBUF,#02H       ;呼叫02主机

CJDZ:  JBC TI,WDZ         

         SJMP CJDZ          

WDZ:  JBC RI,YDDZ         ;等待应答地址

SJMP L2            

YDDZ:  MOV A,SBUF          ;取出应答地址

XRL A,02H         ;判断是否02号机应答

JZ RIGHT            ;若是02号机,转发送数据

AJMP MCALL          ;若不是02号机,重新呼叫

RICHT:CLR TB8              ;联络成功,清除地址标志

MOV R0,#30H         ;数据区首址送R0

MOV R2,#16          ;字节数送R2

LOOP:  MOV A,@R0            ;取发送数据

         MOV SBUF,A           ;启动发送

WTI:  JBC TI,NEXD          ;判发送中断标志

         SJMP WTI

NEXD:  INC R0               ;调整地址指针

DJNZ R2,LOOP        ;未发完继续发送

AJMP MAIN

2)从机(02号)响应主机呼叫的联络程序。

         ORG 8000H

         MOV R0,#30H          ;从机数据区首址

         MOV R2,#16           ;接收字节长度

C02:  MOV SCON,#0BOH       ;串行口工作方式2SM=2REN=1

WTZJ:  JBC RI,QDZ           ;等待主机发送

         SJMP WTZJ

QDZ:  MOV A,SBUF           ;取出呼叫地址

         XRL A,#02H           ;判断是否呼叫本机(02号)

         JNZ WTZJ             ;不是本机,继续等待

         CLR SM2              ;是本机,清SM2

         MOV SBUF,#02H        ;向主机发应答地址

SDZ:  JBC TI,WZD           ;等待本机发完地址

         SJMP SDZ             ;未发完继续

WZD:  JBC RI,ZCOK         ;等待主机发送数据

         SJMP WDZ

ZCOK:  JNB RB8,RIGHT        ;再判断联络成功否

         SETB SM2             ;未联络成功,恢复等待主机发送

         SJMP WTZJ

RIGHT:  MOV A,SBUF           ;联络成功,取主机发来的信息

         MOV @R0,A            ;数据送缓冲区

         INC R0               ;调整地址指针

         DJNZ R2,WZD          ;未接收完继续接收主机数据

         AJMP C02