當前位置:編程學習大全網 - 編程語言 - 單片機高手請進!!!stc89c52單片機 能控制幾個舵機?用什麽樣的程序控制?

單片機高手請進!!!stc89c52單片機 能控制幾個舵機?用什麽樣的程序控制?

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;

}

}

  • 上一篇:幼兒園建構遊戲《機器人》大班教案含反思
  • 下一篇:認識英語學習英語需要多長時間?
  • copyright 2024編程學習大全網