⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 多机通讯 主机程序.c

📁 单片机用485协议进行远程通信的主机程序和从机程序。在差错方面用了“校验和”的办法排除通信干扰
💻 C
字号:
//多机通讯主机程序
#include<reg51.h>
#define uchar unsigned char
#define BN 16						//传送一次的字节数

uchar master(uchar addrs,uchar comnd);
uchar SLAVE=0x00;					//从机地址
uchar idata rdata[16];
uchar idata tdata[16]={"abcdefghijklmnop"};
void main(void)
{
 uchar i;
 for(i=0;i<10;i++)
 TMOD=0x20;						//定时器T1定义为模式2
  TL1=0xfd;TH1=0xfd;				//置初值
  PCON=0x00;
TR1=1;
SCON=0xD0;					//设置串行口控制字,方式3,允许接收
master(SLAVE,0x01);
master(SLAVE,0x02);
SLAVE++;
}

void error(void)
{
  SBUF=0xFF;					//发给从机数据出错标志
  while(TI!=1);						//等待发送完
  TI=0;
}

uchar master(uchar addrs,uchar comnd)
{ uchar a,i,p;
while(1)
{
  SBUF=SLAVE;					//发呼叫地址 
  while(TI!=1);						//等待发送完
  TI=0;
while(RI!=1);						//等待从机应答
RI=0;
if(SBUF!=addrs)
error();							//若地址出错,发出错标志,从机复位
else{
TB8=0;						//清地址标志位,准备接收数据
SBUF=comnd;					//发命令帧
while(TI!=1);TI=0;
while(RI!=1);RI=0;
a=SBUF;						//接收从机的返回地址帧
if((a&0x80)==0x80){TB8=1;error();}	//若主机命令非法,发复位信号给从机
else
{
	 if(comnd==0x01)				//主机发送的命令是请求从机接收数据
       {if((a&0x01)==0x01)			//从机准备接收就绪
{do{
            p=0;					//清校验和
			for(i=0;i<BN;i++)
{SBUF=tdata[i];			//发送数据
 p=p+tdata;				//计算校验和
 while(TI!=1);TI=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)		   	//从机准备发送就绪
{while(1)
{p=0;
 for(i=0;i<BN;i++)
{while(RI!=1);RI=0;
rdata[i]=SBUF;		//主机接收数据
p+=rdata[i];
}
while(RI==0);RI=0;
if(SBUF==p)
{
SBUF=0x00;		//校验和相同,发0x00给从机
while(TI!=1);TI=0;
}
else
{SBUF=0x0F;			//校验和不同,发0x0F给从机
 while(TI!=1);TI=0;
}
}
	TB8=1;				//重置地址标志位
	return(0);
}
}
}
}
}
}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -