【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;       
		 }
	 }

}

  • 16
    点赞
  • 151
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
要用51单片机做一个机械臂,需要以下步骤: 1. 确定机械臂的种类和结构:机械臂种类有很多,如2自由度、3自由度、4自由度等,需要选择适合自己的机械臂结构。 2. 确定控制方式:机械臂可以通过多种方式进行控制,如手动遥控、自动控制等,需要选择适合自己的控制方式。 3. 编写程序框架:根据机械臂控制逻辑,编写程序框架,包括初始化、循环等基本结构。 4. 实现舵机控制:通过舵机控制机械臂的运动。舵机是一种能够精确控制角度的电机,通过PWM控制舵机的占空比,可以控制舵机的转动角度。 5. 添加传感器:通过添加传感器,如光电传感器、超声波传感器等,实现机械臂对物体的感知和控制。 6. 调试程序:对程序进行调试,保证机械臂能够正常工作。 以下是一个简单的2自由度机械臂程序框架,供参考: ``` #include <reg52.h> sbit servo1 = P1^0; //舵机1控制引脚 sbit servo2 = P1^1; //舵机2控制引脚 sbit sensor1 = P2^0; //传感器1引脚 sbit sensor2 = P2^1; //传感器2引脚 void servo_control(int angle1, int angle2) { //通过PWM控制舵机角度 } void main() { //初始化程序 while(1) { //循环体 if(sensor1 == 1 && sensor2 == 0) { //物体在机械臂左侧,向左移动 servo_control(90, 0); } else if(sensor1 == 0 && sensor2 == 1) { //物体在机械臂右侧,向右移动 servo_control(90, 180); } else { //物体在机械臂正下方,停止运动 servo_control(0, 0); } } } ``` 以上仅为一个简单的程序框架,具体实现需要根据实际情况进行调整和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值