单片机点对点通讯程序(c51)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机点对点通讯程序(c51)
#include
#define uchar unsigned char
#define TR 1
uchar idata buf[10];
uchar pf;
void init(void)
{TMOD=0X20; /*定时方式2*/
TH1=0XE8; /*波特率*/
TL1=0XE8;
PCON=0X00;
TR1=1;
SCON=0X50;
}
void send(uchar idata *d)
{uchar i;
do{SBUF=0XAA; /*发送联络信号*/
while(TI==0);TI=0; /*等待发送出去*/
while(RI==0);RI=0; /*等待B机回答*/
}while((SBUF^0xbb)!=0); /*B机未准备好,继续联络*/ do{pf=0; /*清校验和*/
for(i=0;i<16;i++)
{SBUF=d[i];
pf+=d[i]; /*求校验和*/
while(TI==0);TI=0;
}
SBUF=pf; /*发送校验和,并等待B机回答*/
while(TI==0);TI=0;
while(RI==0);RI=0;
}while(SBUF!=0); /*回答出错,重发*/
}
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;break;} /*相同发“00”*/
else{SBUF=0xff; /*出错发“FF”,重新接收*/ while(TI==0);TI=0;
}
}
}
void main(void)
{
init();
if(TR==0){send(buf);}
else{receive(buf);}
}。