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

📄 ckwl.c

📁 51串口实现多机通信
💻 C
字号:


//#include "stdarg.h"
#include <REG52.H>

#define  Bit(i)     (0x01<<i)
#define  Motor      P1

unsigned char code gDriveData[4]={0x03,0x06,0x0c,0x09};
unsigned char code bDriveData[4]={0x09,0x0c,0x06,0x03};
void mOtor(bit Way);
static bit tK;

#define MyAdd ('1')

sbit TX      = P3^1;
sbit Light   = P2^0;
static bit dRive,mDriv;
static unsigned char dRiveCnt;
void SerialInit()
{
	TMOD |= 0x21;//选择定时器T1模式2,计时方式,T1工作模式1
	TH0   = 0xd8;
	TL0   = 0xf0;
	//TR0   = 1;
	ET0   = 1;
	TH1   = 0xf3;//波特率6M 2400
	TL1   = 0xf3;
	SCON  = 0xf0;//串口工作方式3 SM2 = 1;接收的第9位数据必须为1,接收才有效
	SM2   = 1;
	PCON  = 0x80;//SMOD=1
	PS    = 1;//设置串口中断优先级
	TR1   = 1;//启动定时器T1
	ES    = 1;
	EA    = 1;
	TX    = 1;
}

//串口发送一个字节
void SerialSendData(const unsigned char Dat )
{
	while(TI);
	SBUF = Dat;
	while(!TI);
	TI = 0;		
}

//串口接收一个字节
unsigned char SerialRecvData(const bit rEN)
{
	unsigned char Temp;
	REN = rEN;
	while(!RI);
	Temp = SBUF;
	RI = 0;
	return Temp;	
}
//串口发送字符串
void SerialSendStr(unsigned char *ptr)
{
	while(*ptr != '\0')
	{
		SerialSendData(*ptr);
		ptr++;	
	}	
}


void main(void)
{
	SerialInit();
	mDriv = 1;
	while(1)
	{
		mOtor(tK);	
	}
}

void Note_Task(void)
{
	switch(SerialRecvData(1))
	{
		case '4':Light = 0;//开LED
				SerialSendStr("Light ON ");
				break;
		case '5':Light = 1;//关LED
				SerialSendStr("Light OFF ");
				break;
		case 'a':dRive = 1;//电机正转
				TR0   = 1;
				tK = 1;
				SerialSendStr("Motor R ");
				break;
		case 'b':dRive = 1;//电机反转
				TR0   = 1;
				tK = 0;
				SerialSendStr("Motor L ");
				break;
		case 's':dRive = 0;//电机停止
				TR0   = 0;
				tK = 1;
				SerialSendStr("Motor Stop ");
				break;
		default:break;
	}	
}

void Serial_ISR(void) interrupt 4 using 1
{
	ES = 0;//关中断
	if(RI)//接收中断
	{
		RI = 0;
		if(SBUF == MyAdd)//地址匹配则返回从机名字
		{
			SM2 = 0;//退出监听状态	
			SerialSendStr("Slave-No.1: ");
			Note_Task();
			SM2 = 1;
		}
		else
		{	TX  = 1;//锁定TX脚
			//SM2 = 1;//地址不匹配继续监听
		}	
	}
	if(TI)//发送中断
	{
		TI = 0;
	}
	ES  = 1;
}

void T0_ISR(void) interrupt 1 using 2
{

	TH0   = 0xd8;
	TL0   = 0xf0;

	mDriv = 1;	
	if(++dRiveCnt == 4)
	{
		dRiveCnt = 0;//电机相位选择
	}

}

void mOtor(bit Way)
{
	if(Way)
	{
		if(dRive && mDriv)//启动命令dRive是否为1
		{
			mDriv = 0;
			Motor = gDriveData[dRiveCnt];//电机正转
		}
		if(!dRive)
		{
			Motor |= 0x00;//电机停止
		}
	}
	else
	{
		if(dRive && mDriv)
		{
			mDriv = 0;
			Motor = bDriveData[dRiveCnt];//电机反转
		}
		if(!dRive) 
		{
			Motor |= 0x00;//电机停止	
		}		
	}
}

⌨️ 快捷键说明

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