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

📄 cxz.c

📁 单片机三机通信
💻 C
字号:
/*****************************************************************
   多机通信,以三机为例,从机地址0x01,0x02
   可以正确的发送命令和地址以及地址的返回,
   发送数据0xd1,0xd2,接收数据0xc1,0xc2.
   
******************************************************************/
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
sbit P32=P3^2;
sbit P16=P1^6;
sbit P17=P1^7;

uchar anjian=0; //anjian值:0,1,2,3,4,分别对应:复位,send-->0x01,send-->0x02,receive<--0x01,receive<--0x02
uchar address[2]={0x01,0x02};      //从机地址0x01,0x02
uchar command[2]={0x11,0x12};      //命令:11--send,12--receive
uchar adr;
uchar flag_receive=0;              //从机返回地址标志,
uchar adr_choice;                  //从机选择标志
uchar com_choice;                  //命令选择标志
uchar flag_dat=0;                  //接受从机发送数据标志

void delay()                       //短延时
{
	uint i;
	for(i=0;i<10000;i++)
		;
}

void del()                          //长延时
{
	uint i;
	uchar m;
	for(m=0;m<4;m++)
	{
		for(i=0;i<20000;i++)
			;
	}
}


void string() interrupt 4                    //串行中断处理函数
{
	if(RI==1)
	{
		RI=0;
		adr=SBUF;
		if(adr==address[adr_choice])         //若从机返回地址正确flag_receive=1
			flag_receive=1;
		else if(adr==0xc1||adr==0xc2)        //若接收数据正确flag_dat=1
			flag_dat=1;
	}
	else
		TI = 0;
}

void fasong()                                //发送函数 
{
	if(TB8==1)
	{
		SBUF=address[adr_choice];           //发送地址
        del();
	}
	if(flag_receive)
	{
		TB8=0;
		delay();
		SBUF=command[com_choice];           //发送命令
		del();
		while(anjian==1&&flag_receive==1)    //循环发送数据
		{
			P1=0x00;
			P16=1;
			del();
			SBUF=0Xd1;
			P16=0;
			del();
		}
		while(anjian==2&&flag_receive==1)
		{
			P1=0x00;
			P17=1;
			del();
			SBUF=0Xd2;
			P17=0;
			del();
		}
	}
}


void jieshou()                     //接受函数
{
	if(TB8==1)
	{
		SBUF=address[adr_choice];      //发送地址
        del();
	}
	if(flag_receive)
	{
		TB8=0;
		delay();
		SBUF=command[com_choice];     //发送命令
		del();
		while(anjian==3&&flag_dat==1)   //循环等待从机发送数据
		{
			P16=1;
			del();
			P16=0;
			P17=1;
			del();
			P17=0;
			del();
			flag_dat=0;
		}
		while(anjian==4&&flag_dat==1)
		{
			P17=1;
			del();
			P17=0;
			P16=1;
			del();
			P16=0;
			del();
			flag_dat=0;
		}

	}
}
void int0(void) interrupt 0
{
	delay();
	if(P32 == 0)
	{
		while (P32==0)            // 若按键不释放,则等待
		{;}
		anjian++;
		if(anjian==1)             
		{
			adr_choice=0;        //地址选择
			com_choice=0;        //命令选择
			flag_receive=0;      //anjian值改变,终止fasong()内的循环发送数据
		}
		else if(anjian==2)
		{
			adr_choice=1;
			com_choice=0;
			flag_receive=0;
		}
		else if(anjian==3)
		{
			adr_choice=0;
			com_choice=1;
			flag_receive=0;     //jieshou()函数内的循环等待由 flag_dat=0 终止
		}
		else if(anjian==4)
		{
			adr_choice=1;
			com_choice=1;
			flag_receive=0;
		}
		if(anjian>=5)
			anjian=0;
	}
}

void main (void)
{
	SCON=0xf0;                  //SCON:SM0,SM1,SM2,REN,TB8,RB8,TI,RI=1 1 1 1 0 0 0 0 串行方式3工作
	PCON=0X00;                  //SMOD=0
	TMOD=0x20;                  //T1 方式2工作
	TH1=0xe8;                   //晶振11.0592MHz,1200 bit/s
	TL1=0xe8;
	TB8=1;
	ES=1;
    EA=1;
	EX0=1;
	SM2=0;
	P1=0x00;
	TR1=1;
	while(1)
	{
		if(anjian==1)              //anjian 值选择对应操作
		{
			TB8=1;
			fasong();
		}
		else if(anjian==2)
		{
			TB8=1;
			fasong();
		}
		else if(anjian==3)
		{
			TB8=1;
            jieshou();
		}
		else if(anjian==4)
		{
            TB8=1;
			jieshou();
		}
		else if(anjian==0)           // 令从机01,02复位
		{
			TB8=1;
			SBUF=0xff;
			del();
			P1=0xff;
		}
	}
}

⌨️ 快捷键说明

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