求51单片机直接控制舵机转动角度的程序

自制的AT89c51的最小系统,HC-06的蓝牙模块,锂电池通过升压模块对系统进行供电,我发送命令后,舵机转动角度后就会失去连接,需断开电源,重新连接,但会重复出现上述问题。

第1个回答  推荐于2017-09-14
#include<REG52.H>
#define OUT P0
#define CON P2
#define ms0_5Con 461
#define ms2_5Con 2304
typedef unsigned char unit8;
typedef unsigned short unit_16;

sbit servo0=OUT^0;
sbit servo1=OUT^1;
sbit servo2=OUT^2;
sbit servo3=OUT^3;
sbit servo4=OUT^4;
sbit servo5=OUT^5;
sbit servo6=OUT^6;
sbit servo7=OUT^7;

sbit KEY1=CON^0;
sbit KEY2=CON^1;

unit_16 pwm[8]={1382,1382,1382,1382,1382,1382,1382,1382}; //??90?,(???1382.4,???1382)

void Inter_Form()
{
TMOD|=0x01;
TH0 =0xf7;
TL0 =0x00;
TR0 =1;
ET0 =1;
EA =1;
}

void delay(unit8 x)
{
unit8 i=0;
while(x--)
{
for(i=0;i<125;i++);
}
}
/*------------------------?????--------------------------*/
/*unit_16 Transform(uchar val)
{
//0?=0.5ms, 45?=1ms, 90?=1.5ms, 135?=2ms, 180?=2.5ms
//2.5 ms??? F700, (12n/11059200=2.5/1000, n=2304, X=65536-2304=63232 > F700)
//return (unit_16)(((float)(2/180)*X+0.5)/1000*11059200/12);
unit_16 a = (val+46)*10;
if(a<ms0_5Con)
a=ms0_5Con;
if(a>ms2_5Con)
a=ms2_5Con;
return a;
} */

/*-------------------------???---------------------------*/

void Steering_UP(unit8 val)
{
if(pwm[val]>ms2_5Con)
pwm[val]=ms2_5Con;
pwm[val]=pwm[val]+10;
}

void Steering_Down(unit8 val)
{
if(pwm[val]<ms0_5Con)
pwm[val]=ms0_5Con;
pwm[val]=pwm[val]-10;
}

void main(void)
{
Inter_Form();
while(1)
{
if(!KEY1)
{
delay(2);
if(!KEY1)
Steering_UP(0);
}
else if(!KEY2)
{
delay(2);
if(!KEY2)
Steering_Down(0);
}
}
}

/*------------------------??????--------------------------*/
void SteeringGear() interrupt 1
{
static unit8 pwm_flag=0;
switch(pwm_flag)
{
case 1: servo0=1; TH0=-pwm[0]>>8; TL0=-pwm[0]; break;
case 2: servo0=0; TH0=-(ms2_5Con-pwm[0])>>8; TL0=-(ms2_5Con-pwm[0]); break;
case 3: servo1=1; TH0=-pwm[1]>>8; TL0=-pwm[1]; break;
case 4: servo1=0; TH0=-(ms2_5Con-pwm[1])>>8; TL0=-(ms2_5Con-pwm[1]); break;
case 5: servo2=1; TH0=-pwm[2]>>8; TL0=-pwm[2]; break;
case 6: servo2=0; TH0=-(ms2_5Con-pwm[2])>>8; TL0=-(ms2_5Con-pwm[2]); break;
case 7: servo3=1; TH0=-pwm[3]>>8; TL0=-pwm[3]; break;
case 8: servo3=0; TH0=-(ms2_5Con-pwm[3])>>8; TL0=-(ms2_5Con-pwm[3]); break;
case 9: servo4=1; TH0=-pwm[4]>>8; TL0=-pwm[4]; break;
case 10: servo4=0; TH0=-(ms2_5Con-pwm[4])>>8; TL0=-(ms2_5Con-pwm[4]); break;
case 11: servo5=1; TH0=-pwm[5]>>8; TL0=-pwm[5]; break;
case 12: servo5=0; TH0=-(ms2_5Con-pwm[5])>>8; TL0=-(ms2_5Con-pwm[5]); break;
case 13: servo6=1; TH0=-pwm[6]>>8; TL0=-pwm[6]; break;
case 14: servo6=0; TH0=-(ms2_5Con-pwm[6])>>8; TL0=-(ms2_5Con-pwm[6]); break;
case 15: servo7=1; TH0=-pwm[7]>>8; TL0=-pwm[7]; break;
case 16: servo7=0; TH0=-(ms2_5Con-pwm[7])>>8; TL0=-(ms2_5Con-pwm[7]); break;
default:TH0=0xff; TL0=0x80; pwm_flag=0;
}
pwm_flag++;
}
/*---------------------------------------------------------------------------------

如有问题可再咨询

-----------------------------------------------------------------------------------*/追问

可否解释下switch(pwm_flag)函数中的意思

可否解释下switch(pwm_flag)函数中的意思

可否解释下switch(pwm_flag)函数中的意思

追答

循环扫描pwm这个数组中8个元素的值,对应每个元素值的舵机数据引脚输出相应的pwm信号。
这个中断服务函数就是用来设置输出pwm信号的,然而具体要改变舵机的角度,只需改变pwm[0~8]中的值即可

追问

舵机只有4脚,线怎么连呢?连接好线后,怎么让它转动呢?

本回答被提问者和网友采纳