📄 双机通信.c
字号:
/*8051双机点对点通信程序联系
//来自张银华《黑皮书》Peg.231*/
#include <reg51.h>
#define flag 1 //发送或接收标记
unsigned char temp;
unsigned idata buf[10];
void main (void)
{
init(); //串口初始化
if(flag==0)
send(buf);
else
receive(buf);
}
void init(void)
{
TMOD = 0x20; //定时器1,工作方式2
TH1 = 0xE8; //fosc=11.0592MHz,Bod=1200
TL1 = 0xE8;
PCON = 0x00; //SMOD=0
flag = 1;
SCON =0x50; //8位UART,允许接收
}
void send (unsigned char idata *p) //发送函数
{
unsigned char i;
do
{
SBUF=0xAA;
while(TI==0); //等待发送信号
TI=0; //发送完毕,清标志
while(RI==0); //等待接收反馈应答信号
RI=0; //接收应答信号完毕,清标志
}while((SBUF^0xBB)!=0) ; //接收到的是应答允许信号0xBB吗?Y,向下执行;N,重复请求
do
{
temp = 0;
for(i=0;i<16;i++)
{
SBUF = p[i]; //阀数据
temp += p[i];
while(TI==0);
TI=0; //发送完毕,清标志
}
SBUF=temp; //接着发 校验和
while(TI==0);
TI=0; //校验和发送完毕
while(RI==0); //接收反馈信号
RI=0;
}while(SBUF!=0); //若接收到的反馈信号不是0,则重发
}
void receive(unsigned char idata *p) //接收函数
{
unsigned char i;
do
{
while(RI==0);
RI=0;
}while((SBUF^0xAA)!=0) ; //等待接收0xAA信息
SBUF=0xBB; //接收到0xAA后,回发0xBB允许信号
while(TI==0);
TI=0; //0xBB发送完毕,清标志
while(1) //开始接收数据
{
temp = 0;
for(i=0;i<16;i++)
{
while(RI==0);
RI=0;
p[i]=SBUF;
temp+=p[i];
}
while(RI==0)
{
RI=0;
if((SBUF^pf)==0))
SBUF=0x00; //通信成功
break;
else
{
SBUF=0xFF;
while(TI==0);
TI=0;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -