1、主机发送的数据格式:
字节数n,数据1,数据2......数据n,字节校验;其中字节校验是将字节数和所有数据进行相异或的结果。
2、双机通信的硬件电路
需要注意的是,两单片机要保证正确通信,主机的RXD连接从机的TXD,从机的RXD连接主机的TXD。
3、C语言程序
(1)主机程序
#include
#include
#define _READY_ 0x06//主机握手信号
#define _BUSY_ 0x15//从机忙应答
#define _OK_ 0x00//从机准备好
#define _SUCC_ 0x0f//数据传送成功
#define _ERR_ 0xf0//数据传送失败
unsigned char Table[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 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=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<lenth;i++) //发送数据
{
check=check^Buff[i];
SBUF=Buff[i];
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;
}
//接收数据函数
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<lenth;i++)//接收数据
{
while(!RI);
Buff[i]=SBUF;
check=check^(Buff[i]);
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]; //查看接收到的数据
}
}