#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 中断
}
void 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;
}
//return -1;
}
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 <= 6)
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
case 2 : //为2时,舵机右转,脉宽2ms(理论值),实际可以调试得出
{
if( TimeOutCounter <=25 )
{
ControlPort = 1;
}
else
{
ControlPort = 0;
}
break;
}
default : break;
}
if( TimeOutCounter == 200 ) //周期20ms(理论值),比较可靠,最好不要修改
{
TimeOutCounter = 0;
}
}
我想问一下,这个程序是不是让舵机再按keyright时向右转90度,然后保持不动,同理keyleft。然后keystop让舵机保持0度,但我把程序烧到单片机里控制舵机,按keyright就会先向右转,然后再向左转超过0度一点点,然后又想右转。如此往复几次,最后停在0度。
舵机不是一定的占空比对应一定的角度吗?是不是一定角度所对应的占空比不是很精确,但我想至少不会出现我说的情况啊,应该只会向右转一定角度,然后停住啊?还是我的程序写错了,或者我对舵机理解错了。。。
还有舵机转动的速度可不可以调节? |