单片机高手请进!!!stc89c52单片机 能控制几个舵机?用什么样的程序控制?

用stc89c52单片机 最多能控制几个舵机啊?是同时还是不同时?用什么样的程序控制呢? 好心人如果能解决的话发个程序吧就是把12个舵机同时回0°的就行,万分感谢!!!

20ms为舵机周期,一个周期可以同时控制8个舵机,20/2.5=8.
用定时器产生脉冲,两个定时器T0,T1,8*2,同时可以控制16个舵机,
以下是用按键控制一个舵机的转动,你可以参考以下程序,多设个io口,在switch函数中的 条件语句中加各个io口脉宽,以下程序中的例如:case 0中的if可以多加几个io控制就可以同时控制多个了,程序前面也可以开定时器T0,以下就只开T1。懒得改以下程序,你参考下就明白了,原理明白就好搞,以下程序很基础,很简单明了了。
#include <reg52.h>
#define Stop 0 //宏定义,停止
#define Left 1 //宏定义,左转
#define Right 2 //宏定义,右转

sbit ControlPort = P1^1; //舵机信号端口
sbit KeyLeft = P3^2; //左转按键端口
sbit KeyRight = P3^3; //右转按键端口
sbit KeyStop = P1^3; //归位按键端口

unsigned char TimeOutCounter = 0,LeftOrRight = 0; //TimeOutCounter:定时器溢出计数 LeftOrRight:舵机左右旋转标志

void InitialTimer ( )
{
TMOD=0x10; //定时/计数器1工作于方式1
TH1 = ( 65535 -87 ) / 256; //0.1ms
TL1 = ( 65535 - 87 ) % 256;
EA=1; //开总中断
ET1=1; //允许定时/计数器1 中断
TR1=1; //启动定时/计数器1 中断
}

ControlLeftOrRight ( ) //控制舵机函数
{
if( KeyStop == 0 )
{
while ( !KeyStop ); //使标志等于Stop(0),在中断函数中将用到
LeftOrRight = Stop;
}

if( KeyLeft == 0 )
{
while ( !KeyLeft ); //使标志等于Left(1),在中断函数中将用到
LeftOrRight = Left;
}

if( KeyRight == 0 )
{
while ( !KeyRight ); //使标志等于Right(2),在中断函数中将用到
LeftOrRight = Right;
}

}

main ( ) //主函数
{
InitialTimer();
for(;;)
{
ControlLeftOrRight();
}
}

void Timer1 ( void ) interrupt 3 //定时器中断函数
{
TH1 = ( 65535 - 87 ) / 256;
TL1 = ( 65535 - 87 ) % 256;
TimeOutCounter ++;

switch ( LeftOrRight )
{

case 0 : //为0时,舵机归位,脉宽1.5ms
{

if( TimeOutCounter <= 15 )
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}

break;
}
case 1 : //为1时,舵机左转,脉宽1ms(理论值),实际可以调试得出
{
if( TimeOutCounter <= 10)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
{
if( TimeOutCounter <=22 )
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
default : break;
}

if( TimeOutCounter == 200 ) //周期20ms(理论值),比较可靠,最好不要修改
{
TimeOutCounter = 0;
}

}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-08-30
单片机控制12个舵机很简单,同时分时都可以,编程方法很多种,我以前写过的程序找不到了,不然可以给你发个,如果你要简单控制可以软件循环延时,不用定时器中断
第2个回答  2011-09-01
分别给12个想同的脉冲啊!!!这个要用定时器做,不然不会达到同时的效果