单片机双机通信需要设置相同的波特率以及串口通信数据格式,同时为了长距离传输的需要,经常需要转换为标准的串行通信接口。
发送方程序设计:
#include<reg52.h>
#define uchar unsigned char
uchar idata buf[10];
uchar CheckSum; //检验和
void main(void)
{
uchar i;
SCON = 0x50; //设置串行口: 方式 1, 8位UART, 允许接收
TMOD |= 0x20; //设置定时器T1, 方式 2, 8位自动重装
PCON =0x80; //设置SMOD=1
TL1 =0xF4; //波特率4800bit/s,初值
TH1 =0xF4;
TR1 = 1; //启动定时器T1
for(i=0;i<10;i++) //初始化数据
{
buf[i]=i;
}
do
{
SBUF=0xAB; //发送联络信号"AB"
while(TI==0); //等待发送结束
TI=0;
while(RI==0); //等待B机回答
RI=0;
}while((SBUF^0xBA)!=0); //B机未准备好,继续联络
do
{
CheckSum=0; //清检验和
for(i=0;i<10;i++)
{
SBUF=buf[i];
CheckSum+=buf[i]; //求校验和
while(TI==0);
TI=0;
}
SBUF=CheckSum; //发送校验和
while(TI==0);
TI=0;
while(RI==0);
RI=0; //等待B机应答
}while(SBUF!=0); //出错则重发
}
接收方程序设计
接收方B可以按照同样的方式建立项目。接收方B的程序源代码示例如下
#include<reg52.h>
#define uchar unsigned char
uchar idata buf[10];
uchar CheckSum; //检验和
void main(void)
{
uchar i;
SCON = 0x50; //设置串行口: 方式 1, 8位UART, 允许接收
TMOD |= 0x20; //设置定时器T1, 方式 2, 8位自动重装
PCON =0x80; //设置SMOD=1
TL1 =0xF4; //波特率4800bit/s,初值
TH1 =0xF4;
TR1 = 1; //启动定时器T1
do
{
}while(RI==0);
RI=0;
while((SBUF^0xAB)!=0) //判断A机是否发出请求
SBUF=0xBA; //发送应答信号"BA"
while(TI==0); //等待发送结束
TI=0;
while(1)
{
CheckSum=0; //清校验和
for(i=0;i<10;i++)
{
while(RI==0);
RI=0;
buf[i]=SBUF; //接收一个数据
CheckSum+=buf[i]; //求校验和
}
while(RI==0);
RI=0; //接收A机校验和
if((SBUF^CheckSum)==0) //比较检验和
{
SBUF=0x00;
break;
} //校验和相同则发"00"
else
{
SBUF=0xEE; //出错发"EE",重新接收
while(TI==0);
TI=0;
}
}
}
( |