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