用定時器產生脈沖,兩個定時器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;
}
}