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

📄 masterdevice.c

📁 零基础单片机C语言设计全套教程
💻 C
字号:
#include<reg52.h>
#define uchar unsigned char
#define BN 16						//传送一次的字节数

uchar SLAVE=0x00;					//从机地址
uchar idata ReceiveData[16];
uchar idata SendData[16]={"0123456789abcdef"};

void error(void)	;					//出错子函数
void SendDataFun(void)	;				//发送数据子函数
void ReceiveDataFun();					//接收数据子函数

void main(void)						//主函数
{
SCON  = 0x50;					//设置串行口: 方式 1, 8位UART, 允许接收
TMOD  |= 0x20;       				//设置定时器T1, 方式 2, 8位自动重装
PCON  =0x80;						//设置SMOD=1
TL1    =0xF4;						//波特率4800bit/s,初值
TH1    =0xF4;
TR1    = 1;                         	//启动定时器T1

SendDataFun();					//发送数据
ReceiveDataFun();					//接收数据
}

void error(void)						//出错子函数
{
  SBUF=0xEE;						//发给出错标志
  while(TI!=1);						//等待发送完
  TI=0;
}

void SendDataFun(void)					//发送数据子函数
{
uchar a,i,p,comond,addrs;
comond=0x01;					//发送数据指令
addrs=SLAVE;					//从机地址
  SBUF=addrs;					//发送呼叫地址 
  while(TI!=1);						//等待发送完
  TI=0;
while(RI!=1);						//等待从机应答
RI=0;
if(SBUF!=addrs)
	error();						//若地址出错,发出错标志,从机复位
else
{
	TB8=0;						//清地址标志位,准备接收数据
	SBUF=comond;				//发送数据指令
	while(TI!=1);
	TI=0;
while(RI!=1);
RI=0;
	a=SBUF;						//接收从机返回的地址帧
if((a&0x80)==0x80) 				//若主机命令非法,发复位信号给从机
{
TB8=1;
error();
	}	
	else
	{
		if((a&0x01)==0x01)			//从机准备接收就绪
		{
			do
			{
            		p=0;				//清校验和
				for(i=0;i<BN;i++)
				{
					SBUF=SendData[i];	//发送数据
 					p=p+SendData;	//计算校验和
 					while(TI!=1);
					TI=0;
				}
				SBUF=p;			//发送校验和给从机
				while(TI!=1);
				TI=0;
				while(RI!=1);
				RI=0;
			}while(SBUF!=0);		//从机接收不正确,主机重新发送
			TB8=1;				//重置地址标志位
		}
	}
}
}

void ReceiveDataFun()					//接收数据子函数
{
uchar a,i,p,comond,addrs;
comond=0x02;					//接收数据指令
addrs=SLAVE;					//从机地址
  SBUF=addrs;					//发送呼叫地址 
  while(TI!=1);						//等待发送完
  TI=0;
while(RI!=1);						//等待从机应答
RI=0;
if(SBUF!=addrs)
	error();						//若地址出错,发出错标志,从机复位
else
{
	TB8=0;						//清地址标志位,准备接收数据
	SBUF=comond;				//发送接收数据指令
	while(TI!=1);
	TI=0;
while(RI!=1);
RI=0;
	a=SBUF;						//接收从机的返回地址帧
if((a&0x80)==0x80) 				//若主机命令非法,发复位信号给从机
{
TB8=1;
error();
	}	
	else
	{
		if((a&0x02)==0x02)		   	//从机准备发送就绪
		{
			while(1)
			{
				p=0;
 				for(i=0;i<BN;i++)
				{
					while(RI!=1);
					RI=0;
					ReceiveData[i]=SBUF;	//主机接收数据
					p+=ReceiveData[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;				//重置地址标志位
		}
	}
}
}

⌨️ 快捷键说明

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