文档介绍:51单片机多机通信
一、多机通信原理
    在多机通信中,主机必须要能对各个从机进行识别,在51系列单片机中可以通过SCON寄存器的SM2位来实现。当串口以方式2或方式3发送数据时,每一帧信息都是11位,第9位是数据可编程位,通过给TB8置1或置0来区别地址帧和数据帧,当该位为1时,发送地址帧;该位为0时,发送数据帧。
    在多机通信过程中,主机先发送某一从机的地址,等待从机的应答,所有的从机接收到地址帧后与本机地址进行比较,若相同,则将SM2置0准备接收数据;若不同,则丢弃当前数据,SM2位不变。
二、多机通信电路图
    此处,U1作为主机,U2为从机1,U3为从机2。
三、C语言程序
(1)主机程序
#include<>
#include<>
#define _   0x0f//数据传送成功
#define _ERR_    0xf0//数据传送失败
unsigned char Table[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char Buff[20];  //数据缓冲区
unsigned char temp=0xff;
sbit KEY1=P1^6;
sbit KEY2=P1^7;
//unsigned char addr;
//延时1ms函数
void delay_1ms(unsigned int t)
{
 unsigned int x,y;
 for(x=t;x>0;x--)
  for(y=110;y>0;y--);
}
//缓冲区初始化
void Buff_init()
{
 unsigned char i;    //将Table里的数据放到缓冲区里
 for(i=0;i<9;i++)  
 {
  Buff[i]= Table[i];
  delay_1ms(100);
 } 
}
//串口初始化函数
void serial_init()
{
 TMOD=0x20; //定时器1工作于方式2
 TH1=0xfd;  
 TL1=0xfd; //波特率为9600
 PCON=0;
 SCON=0xd0;  //串口工作于方式3
 TR1=1;  //开启定时器
 TI=0;
 RI=0;
}
//发送数据函数
void SEND_data(unsigned char *Buff)
{
 unsigned char i;
 unsigned char lenth;
 unsigned char check;
 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