📄 点对点通信?.txt
字号:
#include<reg52.h>
#define uchar unsigned char
#define TR 1 //??
uchar idata buf[10]; //设置接收存储器
uchar pf; //检验奇偶效验和
void init(void) //初始化函数
{
TMOD=20; //抽口通信初始化
TH1=0XE8; //设定定时器1,工作方式2
TL1=0XE8;
PCON=0X00;
TR1=1; //开定时器1
SCON=0X50; //串口工作方式1.SM0=0,SM1=1.REN=1
}
void send(uchar idata *d) //发送数据函数
{
uchar i;
do
{
SBUF=0xaa; //发送联络信号
while(TI==0);TI=0; //发送结束
while(RI==0);RI=0; //等待应答
}while((SBUF^0Xbb)!=0); //一直等待,直到应答成功
do //发送数据
{
pf=0; //效验和清零
for(i=0;i<16;i++) //发送16位数据
{
SBUF=d[i]; //发送数据
pf+=d[i]; //记录效验和
while(TI==0);TI=0; //发送一位结束,并清除发送结束标志
}
SBUF=pf; //发送效验和
while(TI==0);TI=0; //等待发送结束
while(TI==0);TI=0; //等待回应
}while(SBUF!=0); //应答出错,重发,直正确回应
}
void receive(uchar idata *d) //接受数据函数
{
uchar i;
do
{
while(RI==0);RI=0; //判断是否有接收
}while((SBUF^0XAA)!=0); //判断是否是接收请求
SBUF=0XBB; //发送应答
while(TI==0);TI=0; //等待发送结束,并清除标志位
while(1) //接受数据
{
pf=0; //效验和清零
for(i=0;i<16;i++) //接收16为数据
{
while(RI==0);RI=0; //等待发送结束,清楚标志位
d[i]=SBUF; //存储一位数据
pf+=d[i]; //记录效验和
}
while(RI==0);RI=0; //等待发送效验和结束
if((SBUF^pf)==0) //判断效验和与否
{
SBUF=0x00;break; //效验和相同,发回完毕指令
}
else
{
SBUF=0xff;
while(TI==0);TI=0; //否则发回重发指令,重新接受
}
}
}
void main()
{
init(); //函数初始化
if(TR==0) //发送
{
send(buf);
}
else //接收
{
receive(buf);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -