文档介绍:一、多机通信原理在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。二、多机通信电路图此处,U1作为主机,U2为从机1,U3为从机2。三、C语言程序(1)主机程序#include<>#include<>#_0x0f//数据传送成功#define_ERR_0xf0//数据传送失败unsignedcharTable[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};unsignedcharBuff[20];//数据缓冲区unsignedchartemp=0xff;sbitKEY1=P1^6;sbitKEY2=P1^7;//unsignedcharaddr;//延时1ms函数voiddelay_1ms(unsignedintt){unsignedintx,y;for(x=t;x>0;x--)for(y=110;y>0;y--);}//缓冲区初始化voidBuff_init(){unsignedchari;//将Table里的数据放到缓冲区里for(i=0;i<9;i++){Buff[i]=Table[i];delay_1ms(100);}}//串口初始化函数voidserial_init(){TMOD=0x20;//定时器1工作于方式2TH1=0xfd;TL1=0xfd;//波特率为9600PCON=0;SCON=0xd0;//串口工作于方式3TR1=1;//开启定时器TI=0;RI=0;}//发送数据函数voidSEND_data(unsignedchar*Buff){unsignedchari;unsignedcharlenth;unsignedcharcheck;lenth=strlen(Buff);//计算数据长度check=lenth;TI=0;//发送数据长度TB8=0;//发送数据帧SBUF=lenth;while(!TI);TI=0;for(i=0;i<lenth;i++)//发送数据{check=check^Buff[i];TB8=0;SBUF=Buff[i];while(!TI);TI=0;}TB8=0;//发送校验字节SBUF=check;while(!TI);TI=0;}//向指定从机地址发送数据voidADDR_data(unsignedaddr){while(temp!=addr)//主机等待从机返回其地址作为应答信号{TI=0;//发送从机地址TB8=1;//发送地址帧SBUF=addr;while(!TI);TI=0;RI=0;while(!RI);temp=SBUF;RI=0;}temp=_ERR_;//主机等待从机数据接收成功信号while(temp!=_){SEND_data(Buff);RI=0;while(!RI);temp=SBUF;RI=