单片机同时控制4个舵机和一个串口通信


 #include<AT89x52.H>
 #include <intrins.h>
 
typedef unsigned int u16;	  //数据类型声明
typedef unsigned char u8;
 
 #define Sevro_moto_pwm4     P2_3	   //舵机信号输入端
 #define Sevro_moto_pwm1     P2_7
 #define Sevro_moto_pwm2 		P2_5
 #define Sevro_moto_pwm3 		P0_0
 
unsigned char pwm_val_left  = 0;//变量定义
unsigned char push_val_left =20;
   			
int sum=0;
int dj_select=0;	//	舵机选择

/*******************************************************************************
* 函数名         :UsartInit()
*函数功能		   :设置串口
*******************************************************************************/
void UsartInit()		//	9600bps
{
	SCON=0X50;			//设置为工作方式1
	//TMOD=0X20;			//计数器工作方式2
	PCON=0X80;			//波特率加倍
	//PCON &= 0x7F;	//波特率不加倍
	TH1=0XFA;				//计数器初始值设置,波特率是4800
	TL1=0XFA;
	ES=1;						//打开接收中断
	ET1 = 0;
	EA=1;						//总中断
	TR1=1;					//计数器
}

/************************************************************************/
/*                    PWM信号产生控制舵机                             */
/************************************************************************/
/*                                                                      */
/*调节push_val_left的值改变舵机占空比            */
void pwm_Servomoto(void)
{  
		if(dj_select==0x01)//选择哪个舵机转动
		{
			if(pwm_val_left<=push_val_left)
				Sevro_moto_pwm1=1;
			else 
					 Sevro_moto_pwm1=0;
			if(pwm_val_left>=200)
			{
				pwm_val_left=0;sum++;
			}
		}
		else if(dj_select==0x02)
		{
			if(pwm_val_left<=push_val_left)
				Sevro_moto_pwm2=1;
			else 
					 Sevro_moto_pwm2=0;
			if(pwm_val_left>=200)
			{
				pwm_val_left=0;sum++;
			}
		}
		else if(dj_select==0x03)
		{
			if(pwm_val_left<=push_val_left)
				Sevro_moto_pwm3=1;
			else 
					 Sevro_moto_pwm3=0;
			if(pwm_val_left>=200)
			{
				pwm_val_left=0;sum++;
			}
		}
		else if(dj_select==0x04)
		{
			if(pwm_val_left<=push_val_left)
				Sevro_moto_pwm4=1;
			else 
					 Sevro_moto_pwm4=0;
			if(pwm_val_left>=200)
			{
				pwm_val_left=0;sum++;
			}
		}
 
}
/***************************************************/
///*TIMER1中断服务子函数产生PWM信号*/
/***************************************************/
void time1()interrupt 1   using 2
{	
   TH0=(65536-100)/256;	  //100US定时
	 TL0=(65536-100)%256;		
	 pwm_val_left++;
	 pwm_Servomoto();
 }


 /*******************************************************************************
* 函数名         : Usart() interrupt 4
* 函数功能	    : 串口通信函数
*******************************************************************************/
void Usart() interrupt 4
{
	u8 receiveData;

	receiveData=SBUF;//出去接收到的数据
	RI = 0;//清除接收中断标记位
	SBUF=receiveData;//将接收到的数据放入发送寄存器
	
	if(SBUF==0x01)
			dj_select = 1;
	else if(SBUF==0x02)
			dj_select = 2;
	else if(SBUF==0x03)
			dj_select = 3;
	else if(SBUF==0x04)
			dj_select = 4;
	else if(SBUF==0x00)
			dj_select = 0;
	
	while(!TI);			 //等待发送数据完成
	TI=0;						 //清除发送完成标志位
}
 
void main(void)
{
	
	TMOD=0X21;//根据器件手册选择想要的功能进行设置,我这里同时用了定时器0,1
	TH0=(65536-100)/256;	  //100US
	TL0=(65536-100)%256;
	
	ET0= 1;					
	TR0= 1;//打开计数器
	UsartInit();		

  push_val_left=20;	  //舵机归中


	while(1)		       /*无限循环*/
	{ 
		if(sum==50)
		{
			sum=0;
			push_val_left=25-push_val_left;//舵机来回转动
		}

	}
	  
    
}
发布了99 篇原创文章 · 获赞 27 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_44391957/article/details/103753161