【51单片机】按键控制多个舵机(可用于机械臂控制)

51单片机控制多个舵机

硬件使用的是STC89C52,P30-P31 IO口对应控制的八个按键,一个舵机由两个按键控制,P24-P27对应舵机的控制端(SG90的橙色线)。按键可以自己焊接,从IO口接出到按键再到GND。(原本想设计一个矩阵键盘的,结果发现代码写出来有问题,如果能解决的话就可以设计一个利用串口来控制的机械臂)
有关占空比的原理的话不赘述,一搜一大堆。整体的工作原理的话主要是利用定时器的分时复用,51的T0定时器50ms溢出一次,每溢出一次产生一次中断。我就利用这个概念给它们加上flag,每一个flag对一个舵机进行控制,每当一个flag=1时,都会产生中断,对应的舵机就会动作。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char

sbit up1=P3^0;
sbit down1=P3^1;

sbit up2=P3^2;
sbit down2=P3^3;

sbit up3=P3^4;
sbit down3=P3^5;

sbit up4=P3^6;
sbit down4=P3^7;

sbit pwm1=P2^7;
sbit pwm2=P2^6;
sbit pwm3=P2^5;
sbit pwm4=P2^4;

unsigned char K,Key;

uchar flag1=0,flag2=0,flag3=0,flag4=0;

uint t2 = 0;
uint PWM_T2 = 0;   //占空比控制变

uint t1 = 0;
uint PWM_T1 = 0;   //占空比控制变

uint t3 = 0;
uint PWM_T3 = 0;   //占空比控制变

uint t4 = 0;
uint PWM_T4 = 0;   //占空比控制变

//延时函数/
void delay_1ms(uchar t)
{
	uint x,y;
	for(x=t;x>0;x--)
		for(y=120;y>0;y--);
}




舵机1控制//
void Servo1()
{		 flag1=0;
	  	 if(!up1)
		 	{
				if(PWM_T1<250)
					{
					  PWM_T1++;flag1=1;
					}				
				delay_1ms(10);
			}
		 if(!down1)
		 	{
				if(PWM_T1>0)
					{
					  PWM_T1--;flag1=1;
					}
				
				delay_1ms(10);
			}
}

舵机2控制//
void Servo2()
{		 flag2=0;
	  	 if(!up2)
		 	{
				if(PWM_T2<250)
					{
					  PWM_T2++;flag2=1;
					}				
				delay_1ms(10);
			}
		 if(!down2)
		 	{
				if(PWM_T2>0)
					{
					  PWM_T2--;flag2=1;
					}
				
				delay_1ms(10);
			}
}

舵机3控制//
void Servo3()
{		 flag3=0;
	  	 if(!up3)
		 	{
				if(PWM_T3<250)
					{
					  PWM_T3++;flag3=1;
					}				
				delay_1ms(10);
			}
		 if(!down3)
		 	{
				if(PWM_T3>0)
					{
					  PWM_T3--;flag3=1;
					}
				
				delay_1ms(10);
			}
}

舵机4控制//
void Servo4()
{		 flag4=0;
	  	 if(!up4)
		 	{
				if(PWM_T4<250)
					{
					  PWM_T4++;flag4=1;
					}				
				delay_1ms(10);
			}
		 if(!down4)
		 	{
				if(PWM_T4>0)
					{
					  PWM_T4--;flag4=1;
					}
				
				delay_1ms(10);
			}
}

void main(void)      
{

	TMOD = 0x02;   
	TH0=210;     
	TL0=210;     
	TR0=1;      
	ET0=1;      
	EA=1;       
	pwm2=0;
	pwm1=0; 	 
//	PWM_T=300;
	 while(1)      	
	 {   
		Servo1();
		Servo2();
		Servo3();
		Servo4();
	 }      
}

timer0() interrupt 1  
{ 
	//舵机1
	if(flag1 == 1){	 
	 t1++;    
	 if(t1==250)  
		 {
			  t1=0;  
			  pwm1=1; 
		 }
	 
	 if(PWM_T1==t1) 
		 {  
		 	pwm1=0;       
		 }
	 }

	//舵机2
	if(flag2 == 1){	 
	 t2++;    
	 if(t2==250)  
		 {
			  t2=0;  
			  pwm2=1; 
		 }
	 
	 if(PWM_T2==t2) 
		 {  
		 	pwm2=0;       
		 }
	 }
	//舵机3
	if(flag3 == 1){	 
	 t3++;    
	 if(t3==250)  
		 {
			  t3=0;  
			  pwm3=1; 
		 }
	 
	 if(PWM_T3==t3) 
		 {  
		 	pwm3=0;       
		 }
	 }
	 	//舵机4
	if(flag4 == 1){	 
	 t4++;    
	 if(t4==250)  
		 {
			  t4=0;  
			  pwm4=1; 
		 }
	 
	 if(PWM_T4==t4) 
		 {  
		 	pwm4=0;       
		 }
	 }

}

  • 17
    点赞
  • 159
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值