📄 单片机通信程序.c
字号:
/*===========================================================
/= 程序说明:
/= 通信协议的约定:
/= 假定A机是发送者,B机是接收者.当A机开始发送时,先送一个"AA"
/= 信号,B机收到后回答一个"BB",表示同意接收.当A机收到"BB"后,开始
/= 发送数据,每发送一次求"校验和",假定数据块长度为16个字节,数据缓
/= 冲区为BUF,数据块发送完后马上发送"校验和".
/= B机接收数据并将其转储到数据缓冲区BUF,每接收到一个数据便计
/= 算一次"校验和",当收齐一个数据块后,再接收A机发来的校验和,并将它
/= 与B机求出的校验和进行比较.若两者相等,说明接收正确,B机回答00H;
/= 若两者不等,说明说明接收不正确,B机回答0FFH,请示重发.
/= A机收到00H的回答后,结束发送;若收到的答复非零,则将数据再重
/= 发一次.双方约定的传输速率若为1200b/s,查表可知,在双方的
/= fosc=11.0592MHZ下,T1工作在定时器模式2,TH1=TL1=0E8H,PCON寄
/= 存器的SMOD位为0.
=============================================================*/
//A机发送程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define TR 0 //发送接收差别值TR=0发送
sbit work_flag=P1^0; //通信工作指示
uchar idata buf[10]={1,2,3,4,5,6};
uchar pf;
void delay(uchar x)
{
uint i;
while(x>0)
{
x--;
for(i=0;i<=2500;i++)
{};
}
}
void init(void)
{
TMOD=0x10; //串行口初始化
TH1=0xfe; //设T1为定时模式2
TL1=0xeb;
PCON=0x00; //设波特率
TR1=1; //启动T1;
SCON=0x50; //串行口工作在方式1并允许接收
}
void send(uchar idata *d)
{
uchar i;
do
{
SBUF=0xaa; //发送联络信号“AA”
while(TI==0); //等待发送出去
TI=0;
while(RI==0); //等待B机回答
RI=0;
work_flag=1;
}while((SBUF^0xbb)!=0); //B机未准备好,继续联络(收到“BB”吗)
work_flag=0;
do
{
pf=0; //清校验和
for(i=0;i<16;i++)
{
SBUF=d[i]; //发送一个数据
pf+=d[i]; //求校验和
while(TI==0);
TI=0;
}
SBUF=pf; //发送校验和
while(TI==0);
TI=0;
while(RI==0); //等待B机回答
RI=0;
work_flag=1;
}while(SBUF!=0); //回答出错,则重发
work_flag=0;
}
//B机接收程序
void receive(uchar idata *d)
{
uchar i;
do
{
while(RI==0);
RI=0;
}while((SBUF^0xaa)!=0); //判A机请求否
SBUF=0xbb;
while(TI==0);
TI=0;
while(1)
{
pf=0; //清校验和
for(i=0;i<16;i++)
{
while(RI==0);
RI=0;
d[i]=SBUF; //接收一个数据
pf+=d[i]; //求校验和
}
while(RI==0);
RI=0; //接收A机校验和
if((SBUF^pf)==0) //比较绞验和
{
SBUF=0x00; //校验和相同则发“00”
break;
}
else
{
SBUF=0xff; //出错则发“FF”,重新接收
while(TI==0);
TI=0;
}
}
}
void main(void)
{
uchar n;
for(n=0;n<=20;n++)
{
delay(20);
work_flag=1;
delay(20);
work_flag=0;
}
init();
while(1)
{
work_flag=0;
if(TR==0)
{
send(buf);
}
else
{
receive(buf);
}
work_flag=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -