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

📄 单片机通信程序.c

📁 该程序实现了多个单片机之间的通信
💻 C
字号:
/*===========================================================
/=			程序说明:
/=	通信协议的约定:
/=	    假定A机是发送者,B机是接收者.当A机开始发送时,先送一个"AA"
/=	信号,B机收到后回答一个"BB",表示同意接收.当A机收到"BB"后,开始
/=	发送数据,每发送一次求"校验和",假定数据块长度为16个字节,数据缓
/=	冲区为BUF,数据块发送完后马上发送"校验和".
/=	    B机接收数据并将其转储到数据缓冲区BUF,每接收到一个数据便计
/=	算一次"校验和",当收齐一个数据块后,再接收A机发来的校验和,并将它
/=	与B机求出的校验和进行比较.若两者相等,说明接收正确,B机回答00H;
/=	若两者不等,说明说明接收不正确,B机回答0FFH,请示重发.
/=	    A机收到00H的回答后,结束发送;若收到的答复非零,则将数据再重
/=	发一次.双方约定的传输速率若为1200b/s,查表可知,在双方的
/=	fosc=11.0592MHZ下,T1工作在定时器模式2,TH1=TL1=0E8H,PCON寄
/=	存器的SMOD位为0.
=============================================================*/

//A机发送程序
#include <reg51.h>

#define uchar unsigned char
#define uint unsigned int
#define TR 0		//发送接收差别值TR=0发送

sbit work_flag=P1^0;	//通信工作指示

uchar idata buf[10]={1,2,3,4,5,6};
uchar pf;

void delay(uchar x)
{
	uint i;
	while(x>0)
	{
		x--;
		for(i=0;i<=2500;i++)
		{};		
	}
}

void init(void)
{
	TMOD=0x10;	//串行口初始化
	TH1=0xfe;	//设T1为定时模式2
	TL1=0xeb;
	PCON=0x00;	//设波特率
	TR1=1;		//启动T1;
	SCON=0x50;	//串行口工作在方式1并允许接收
}

void send(uchar idata *d)
{
	uchar i;
	
	do
	{
		SBUF=0xaa;	//发送联络信号“AA”
		
		while(TI==0);	//等待发送出去
		TI=0;
		
		while(RI==0);	//等待B机回答
		RI=0;

		work_flag=1;

	}while((SBUF^0xbb)!=0);	//B机未准备好,继续联络(收到“BB”吗)

	work_flag=0;
	
	do
	{
		pf=0;		//清校验和
		for(i=0;i<16;i++)
		{
			SBUF=d[i];	//发送一个数据
			pf+=d[i];	//求校验和
			
			while(TI==0);
			TI=0;
		}
		SBUF=pf;	//发送校验和
		while(TI==0);
		TI=0;
		
		while(RI==0);	//等待B机回答
		RI=0;
		
		work_flag=1;
		
	}while(SBUF!=0);	//回答出错,则重发

	work_flag=0;
}

//B机接收程序
void receive(uchar idata *d)
{
	uchar i;
	
	do
	{
		while(RI==0);
		RI=0;
	}while((SBUF^0xaa)!=0);	//判A机请求否
	SBUF=0xbb;
	while(TI==0);
	TI=0;
	while(1)
	{
		pf=0;		//清校验和
		for(i=0;i<16;i++)
		{
			while(RI==0);
			RI=0;
			d[i]=SBUF;	//接收一个数据
			pf+=d[i];	//求校验和
		}
		while(RI==0);
		RI=0;			//接收A机校验和
		if((SBUF^pf)==0)	//比较绞验和
		{
			SBUF=0x00;	//校验和相同则发“00”
			break;
		}
		else
		{
			SBUF=0xff;	//出错则发“FF”,重新接收
			while(TI==0);
			TI=0;
		}
	}
}

void main(void)
{
	uchar n;
	
	for(n=0;n<=20;n++)
	{
		delay(20);
		work_flag=1;
		delay(20);
		work_flag=0;
	}
	
	init();
	while(1)
	{
		work_flag=0;
		if(TR==0)
		{
			send(buf);	
		}
		else
		{
			receive(buf);
		}
		work_flag=1;
	}
}























⌨️ 快捷键说明

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