双机通信的硬件电路 

需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。 
双机通信C语言程序 
(1)主机程序 
#include 
#include 
#define _READY_ 0x06//主机握手信号 
#define _BUSY_ 0x15//从机忙应答 
#define_OK_ 0x00//从机准备好 
#define _SUCC_ 0x0f//数据传送成功 
#define _ERR_ 0xf0//数据传送失败 
unsigned charTable[9]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39}; 
unsigned char Buff[20]; //数据缓冲区 
unsigned char temp=_BUSY_; 
sbit KEY=P1^6; 
//延时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 chari; //将Table里的数据放到缓冲区里 
for(i=0;i 
{ 
Buff= Table; 
delay_1ms(100); 
} 
} 
//串口初始化函数 
void serial_init() 
{ 
TMOD=0x20; //定时器1工作于方式2 
TH1=0xfd; 
TL1=0xfd; //波特率为9600 
PCON=0; 
SCON=0x50; //串口工作于方式1 
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; //发送数据长度 
SBUF=lenth; 
while(!TI); 
TI=0; 
for(i=0;i 
{ 
check=check^Buff; 
SBUF=Buff; 
while(!TI); 
TI=0; 
} 
SBUF=check; //发送校验字节 
while(!TI); 
TI=0; 
} 
void main() 
{ 
Buff_init(); 
serial_init(); 
while(1) 
{ 
if(KEY==0) 
{ 
delay_1ms(5); 
if(KEY==0) 
{ 
while(!KEY); 
TI=0; //主机发送握手信号 
SBUF=_READY_; 
while(!TI); 
TI=0; 
while(temp!=_OK_) //主机等待从机应答信号 
{ 
RI=0; 
while(!RI); 
temp=SBUF; 
RI=0; 
} 
temp=_ERR_; //主机等待从机数据接收成功信号 
while(temp!=_SUCC_) 
{ 
SEND_data(Buff); 
RI=0; 
while(!RI); 
temp=SBUF; 
RI=0; 
} 
} 
} 
} 
} 
(2)从机程序 
#include 
#include 
#define _READY_ 0x06//主机握手信号 
#define _BUSY_ 0x15//从机忙应答 
#define_OK_ 0x00//从机准备好 
#define _SUCC_ 0x0f//数据传送成功 
#define _ERR_ 0xf0//数据传送失败 
unsigned char aa=_BUSY_;//主机与从机之间通信标志 
unsigned char Buff[20];//数据缓冲区 
//串口初始化函数 
void serial_init() 
{ 
TMOD=0x20; //定时器1工作于方式2 
TH1=0xfd; 
TL1=0xfd; //波特率为9600 
PCON=0; 
SCON=0x50; //串口工作于方式1 
TR1=1; //开启定时器 
TI=0; 
RI=0; 
} 
//接收数据函数 www.dgzj.com
unsigned char RECE_data(unsigned char *Buff) 
{ 
unsigned char i,temp; 
unsigned char lenth; 
unsigned char check; 
RI=0; //接收数据长度 
while(!RI); 
lenth=SBUF; 
RI=0; 
check=lenth; 
for(i=0;i 
{ 
while(!RI); 
Buff=SBUF; 
check=check^(Buff); 
RI=0; 
} 
while(!RI); //接收校验字节 
temp=SBUF; 
RI=0; 
check=temp^check; //将从主机接收到的校验码与自己计算的校验码比对 
if(check!=0) //校验码不一致,表明数据接收错误,向主机发送错误信号,函数返回0xff 
{ 
TI=0; 
SBUF=_ERR_; 
while(!TI); 
TI=0; 
return 0xff; 
} 
TI=0; //校验码一致,表明数据接收正确,向主机发送成功信号,函数返回0x00 
SBUF=_SUCC_; 
while(!TI); 
TI=0; 
return 0; 
} 
void main() 
{ 
serial_init(); 
while(1) 
{ 
while(aa!=_READY_) //从机等待主机发送的握手信号 
{ 
RI=0; 
while(!RI); 
aa=SBUF; 
RI=0; 
} 
TI=0; //一旦接收到握手信号,从机返回OK,等待接收数据 
SBUF=_OK_; 
while(!TI); 
TI=0; 
aa=0xff; //从机接收数据,并将数据保存到数据缓冲区 
while(aa==0xff) 
{ 
aa=RECE_data(Buff); 
} 
P1=Buff[0]; //查看接收到的数据 
} 
}