求解串口多机通信设置

亿叶 2012-06-12 11:55:41
以下是本人写的程序,可是好像感觉在校验时不对,还请各种江湖豪杰指教,谢谢!
/*题目:*/
/*多机通信 主机程序*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar cs,adj,num,tyz,ryz;

uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
};

sbit key=P3^7;
sbit d1=P1^0;
void init();
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void main()
{
init();
while(1)
{
ES=0;
P3=0xff;
key=1;
if(key==0)
{
delay(20);
if(key==0)
{
num++;
if(num==255)
num=0;
P1=num;
SBUF=num;
}
while(!key);
delay(20);
while(!key);
ES=1;
}
else
{
P1=0xff;
}

}

}

void init()
{
// num=0x11;
adj=0x0f; //主机地址
TMOD=0x20;
TH1=0xFD;
TH1=0xFD;
EA=1;
TR1=1;
SM0=1;
SM1=1;
// SM2=1;
REN=1;
ES=1;
}

void scon() interrupt 4
{
TB8=1; //先置位
SBUF=adj; //当 A 机开始发送时,先送一个adj信号给B机
while(!TI); //发送地址帧
TI=0;
/******以上为接收*******/
while(!RI); //接收返回来的地址帧进行比较核对无误,通知从机进行一对一数据通信
RI=0;
if(RB8==1)
{
tyz=adj^0x0F; //字节异或
tyz=adj+tyz;
ryz=SBUF; //接收验证码
if(ryz==tyz)
{
SBUF=0x00; //若正确则回送正确信号00H
while(!TI);
TI=0;
}
else
{
SBUF=0xFF; //若校验和出错,则发送0FFH,命令该从机重发数据
while(!TI);
TI=0;
}
}
else
{
SBUF=adj; //若接收帧的RB8=0,则存数据到缓冲区,并准备接收下帧信息
}
/******以上为核对地址帧核对无误,通知从机进行一对一数据通信*******/

// while(!RI);
// RI=0;
if(SBUF==adj)
{
RB8=0;
SBUF=num;
while(!TI);
TI=0;
}
else
{
TB8=1;
SBUF=0x00; //复位信号
while(!TI);
TI=0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
/*题目:*/
/*多机通信 从机程序*/
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

uchar bdj,zs,num,ryz;

void init();

void main()
{
init();
while(1)
{



}
}

void init()
{
// num=0xaa;
bdj=0x55; //从机地址
TMOD=0x20;
TH1=0xFD;
TH1=0xFD;
EA=1;
TR1=1;
SM0=1;
SM1=1;
SM2=1; //多机通信控制位,此时处于接收地址帧状态
REN=1;
ES=1;
}

void scon() interrupt 4
{
RB8=1;
while(!RI);
RI=0;
zs=SBUF; //收到主机发出来的地址帧
if(zs==bdj) //接收进来的地址与本机进行比较
{
SM2=0; //如果相等,将SM2置0可进行双机通信,否则SM2保持
SBUF=bdj; //回答一个bdj信号给A机
while(!TI); //比较后相等,则用本机地址应答给主机,让主机确认
TI=0;
}
/*************以上为接收主机发来的地址帧并核对后,向主机返回本从机地址*******************/

ryz=bdj^0x0F; //字节异或
SBUF=bdj+ryz; //附加到数据块末尾
TB8=1;
while(!TI);
TI=0;
// while(!RI);
// RI=0;
if(SBUF==0x00) //从机收到复位命令后回到监听地址状态
SM2=1; //(SM2=1)
else //否则开始接收数据和命令
{
while(!RI);
RI=0;
num=SBUF;
P1=num;
}


}
...全文
37 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧