#include<reg52.h>
#define uchar unsigned char
#define BN 4 //传送一次的字节数
#define Receve 0x01
#define Send 0x02
uchar SLAVE = 0x01; //从机地址
uchar idata rdata0[1]; //接收从机0返回的数据
uchar idata tdata0[4]={1,2,3,4}; //向从机0发送的数据
uchar idata rdata1[1]; //接收从机1返回的数据
uchar idata tdata1[4]={0,15,0,15}; //向从机1发送的数据
uchar idata rdata2[1]; //接收从机2返回的数据
uchar idata tdata2[1]; //向从机2发送的数据
/****************************************************
函数名称:延时
功能:
****************************************************/
void delay(unsigned int tc) //显示延时程序
{
while(tc!= 0 )
{
unsigned int i;
for(i=0; i<100; i++);
tc--;
}
}
/****************************************************
函数名称:发送错误标志函数
功能:
****************************************************/
void error()
{
SBUF = 0xff; //发给从机数据出错标志
while(TI!=1); //等待发送完毕
TI = 0;
}
/****************************************************
函数名称:收、发函数
功能:addrs:从机地址 comd:从机工作方式命令 send[]:发送数据 receve[]:接收数据
****************************************************/
uchar master (uchar addrs,uchar comnd,uchar send[],uchar receve[])
{
uchar a,i,p;
while(1)
{
SBUF=SLAVE; //发呼叫地址
while(TI!=1); //等待发送完毕
TI = 0;
while(RI!=1) //等待从机应答
{
delay(5);
if(RI!=1) goto reti; //等待一段时间无从机回复则跳过
};
RI = 0;
if(SBUF!=addrs) {error();break;} //若地址出错,发出错标志,从机复位,主机跳出此次发送
else
{
TB8 = 0; //清地址标志位,准备接收数据
SBUF = comnd; //发命令帧
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
a=SBUF; //接收从机的返回地址帧
if((a&0x80) == 0x80) //若主机非法,发复位信号给从机
{
TB8=1;
error();
break;
}
else
{
if(comnd == 0x01) //主机发送的命令是请求从机接收数据
{
if((a&0x01) == 0x01) //从机准备接收就绪
{
do{
p=0; //清校验和
for(i=0;i<BN;i++)
{
SBUF=send[i]; //发送数据
p=p+send[i]; //计算校验和
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
}
SBUF = p; //发送校验和给从机
while(TI!=1);
TI=0;
while(RI!=1);
RI=0;
}while(SBUF!=0); //从机接收不正确,主机从新发送
TB8=1; //重置地址标志位
return(0);
}
}
else
{
if(comnd == 0x02) //主机发送的是接收数据命令,从机发送数据
{
if((a&0x02) == 0x02) //从机准备发送就绪
{
// P0=0x0f;
// delay(2000);
while(1)
{
p=0;
for(i=0;i<BN;i++)
{
while(RI!=1);RI=0;
receve[i]=SBUF; //从从机接收数据
p+=receve[i];
SBUF=0x11;
while(TI!=1);
TI=0;
}
while(RI==0);
RI=0;
if(SBUF == p)
{
SBUF = 0x00; //校验和相同,发0x00给从机
while(TI!=1);
TI=0;
break;
}
else
{
SBUF=0x0f; //校验和不同,发0x0f给从机
while(TI!=1);
TI=0;
}
}
TB8=1; //重置地址标志位
return(0);
}
}
}
}
}
}
reti:;
}
/****************************************************
函数名称:主函数
功能:
****************************************************/
void main()
{
TMOD = 0x20; //定时器T1定义为模式2
TL1=0xfd; //初值
TH1=0xfd;
PCON=0x00;
TR1=1;
SCON=0XD8; //设置串口控制字,方式3,允许接收,TB8=1,发地址;
master(SLAVE,Receve,tdata0,rdata0);
delay(10000);
master(SLAVE,Receve,tdata1,rdata0);
while(1);
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
.rar (52个子文件)
多机串口通信
存档
RECEVE
STARTUP.LST 14KB
receve.Uv2 2KB
RECEVE.OBJ 6KB
RECEVE.PLG 8KB
STARTUP.A51 6KB
RECEVE.HEX 1KB
RECEVE.C 3KB
receve.Opt 1KB
RECEVE.LNP 60B
RECEVE 6KB
STARTUP.OBJ 749B
RECEVE.M51 11KB
RECEVE.LST 10KB
SEND
STARTUP.LST 14KB
多机串口通信.hex 1KB
MAIN.C 3KB
多机串口通信.lnp 64B
STARTUP.A51 6KB
MAIN.OBJ 6KB
STARTUP.OBJ 749B
多机串口通信.plg 181B
MAIN.LST 12KB
多机串口通信.M51 10KB
多机串口通信.Opt 1KB
多机串口通信 6KB
多机串口通信.Uv2 2KB
RECEVE
STARTUP.LST 14KB
receve.Uv2 2KB
RECEVE.OBJ 7KB
receve.hex 2KB
receve 7KB
STARTUP.A51 6KB
receve.plg 198B
RECEVE.C 3KB
receve.Opt 1023B
receve.M51 12KB
STARTUP.OBJ 749B
RECEVE.LST 10KB
receve.lnp 60B
SEND
STARTUP.LST 14KB
MAIN.C 4KB
send.hex 2KB
STARTUP.A51 6KB
send 7KB
MAIN.OBJ 7KB
send.lnp 56B
send.plg 168B
send.Opt 1KB
STARTUP.OBJ 749B
MAIN.LST 14KB
send.M51 11KB
send.Uv2 2KB
共 52 条
- 1
mkowenhuang
- 粉丝: 0
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页