求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脚,线怎么连呢?连接好线后,怎么让它转动呢?

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

求51单片机直接控制舵机转动角度的程序
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 serv...

如何用51单片机控制舵机的??单片机程序是怎么写的?希望你也能给我发...
单片机系统实现对舵机输出转角的控制,必须首先完成两项任务:首先,产生基本的PWM周期信号,即产生20ms的周期信号;其次,调整脉宽,即单片机调节PWM信号的占空比。单片机能使PWM信号的脉冲宽度实现微秒级的变化,从而提高舵机的转角精度。单片机完成控制算法,再将PWM信号输出到舵机。发一个自己原来写的简单的。

怎么用51单片机控制舵机?
操作步骤:1 单片机,舵机,电源共地;2 用两个稳压芯片进行供电,将电源分开来;3 舵机信号端没有直接连接单片机IO口,我串了一个10K的电阻,也就是这一步之后就可以控制舵机。

如何在51中写程序使舵机从90转到180度
1. 周期T=20ms(即50HZ),占空比500us-2500us。2. 500us舵机逆时针转90度,2500us舵机顺时针转90读。 (其中0度是1500us)3. 即: TL+TH=20ms 改变TH的值,舵机角度随之改变。参数参照以上1.2点。TL TH ___ ___| |___| | ___| 4. 电路原理很简单,接好电源,...

51单片机里如何控制舵机按键操作转动的角度为1度?
打开定时器1,并在某个引脚输出高电平,定时器1中断时再将这个引脚置低电平,这样就 产生了PWM波 定义一个变量,主程序检测按键,根据按键按下次数改变变量的值,再根据变量值决定定时器1的初值,即可改变PWM占空比,从而改变舵机角度 当然你要计算出舵机每转一度,PWM波的占空比应该变化多少。

51单片机如何控制舵机左转和右转,以及舵机左右转的原理,谢谢
一般来讲,舵机主要由以下几个部分组成,舵盘、减速齿轮组、位置反馈电位计、直流电机、控制电路等 图4 舵机的组成示意图 图5 舵机组成 舵机的输入线共有三条,如图6所示,红色中间,是电源线,一边黑色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。电源有两种规格,一是4....

51单片机控制舵机,网上都是45度90度之类的,假如,我想控制37度,就是任意...
舵机控制要求的是一个周期20ms高电平1ms-2ms(也有说是0.5ms-2ms的 这个可以用信号发生器测出来)的pwm信号 高电平时间与转过的角度是成正比的 比如1ms是0度 2ms是180度 那么1.5ms就是(1.5ms-1ms)*(180-0)=90度 37度所对应的高电平时间就是37\/180*(2ms-1ms)+1ms=1.21ms就行了 ...

设计分享 | 基于51单片机理解SG90舵机原理并用按键控制
设计分享:基于51单片机的SG90舵机控制与按键操作本文主要介绍了如何利用51单片机(如AT89C52)配合SG90舵机,通过按键实现舵机角度的精确控制。当按下开关时,舵机将按照预定顺序运行至0°、45°、90°、135°、180°,然后回到0°。每个角度转动时间间隔为1秒,涉及外部中断和PWM脉宽调制技术的运用。SG90舵机...

51单片机控制舵机(MG995).
舵机是通过占空比,来控制它的旋转角度,控制信号从单片机输出之后,不能直接接舵机,因为功率不够,中间接一个非门就可以了。控制信号的编程应该来说是很简单的,就是总周期是固定的,角度不同,高电平的持续时间就不同,然后,比如,50的高电平,150的低电平,那么这样的周期要多少个呢,这也是一个...

用51单片机控制3路舵机
回答:这个可以用三个I\/o口,用定时器0分时启动三路PWM波,代码的话,每次中断给计数器赋下次中断的时间,void T0_time() interrupt 1 \/\/通过定时器0产生多路PWM,每次中断赋值下一次中断的时间, { \/\/两个t[]一组,在20ms周期内分时启动各路PWM高电平, TH0=(65536-9.216*t[i])\/256; \/\/各...

相似回答