您的位置:首頁>正文

利用舵機制作簡單機械臂程式分享

*項目名稱:利用舵機制作簡單機械臂

** 編寫時間:2017.07.11

**使用晶片:stc12c2052ad

** 時鐘頻率:使用外部晶振頻率12MHz

**簡要說明:本次製作的機械臂共用了3個舵機, 可以控制機械臂上下, 左右移動和抓放動作。

程式

#include

#include

typedef unsigned char u8;

typedef unsigned short int u16;

sbit CTRL_u_d = P3 ^ 3; //控制上, 下方向的舵機控制埠

sbit CTRL_l_r = P3 ^ 4; //控制左, 右方向的舵機控制埠

sbit CTRL_g = P3 ^ 5; //控制抓起的舵機控制埠

void delay_20ms(u16 x);

u8 KeyScan();

u16 TIME = 20000; // PWM週期時間(單位美國)

u16 Min = 700; //高電平最小持續時間

u16 Max = 2300; //高電平最大持續時間

u8 Degree = 50; //單位時間寬度(最小是舵機死區設定大約10us)

u16 Times = 0; // TIME / Degree(PWM週期除於單位時間寬度)

//高電平持續時間除於單位時間寬度

u16 cTimes_u_d = 0;

u8 cTimes_l_r = 0;

u8 cTimes_g = 0;

u8 Min_cTimes = 0;

u8 Max_cTimes = 0;

u8 R_TH0 = 0, R_TL0 = 0; //計時器0計數重載值

u8 KeyValue = 0; // 1-上, 2-左, 3-抓, 4-右, 5-下

void main()

{

Times = TIME / Degree;

cTimes_u_d = 1500 /學位;

cTimes_l_r = 1500 /學位;

cTimes_g = Min_cTimes;

Min_cTimes = Min / Degree;

Max_cTimes =最大/度;

P1 = 0xff;

CTRL_u_d = 0;

CTRL_l_r = 0;

CTRL_g = 0;

R_TL0 = 65536 - 學位;

R_TH0 =(65536 - 度)>> 8;

//設置計時器0

TMOD = 0x01; // 16位元數目

TL0 = R_TL0;

TH0 = R_TH0;

ET0 = 1; //計時器0中斷開關打開

TR0 = 1; //計時器0計數開始

EA = 1; //中斷總開關打開

while(1)

{

u8 temp = 0;

KeyValue = KeyScan();

開關(KeyValue)

{

案例1://向上移動

cTimes_u_d = --cTimes_u_d

打破;

情況2://向左移動

cTimes_l_r = --cTimes_l_r

打破;

案例3://抓, 放動作

if(cTimes_g == Min_cTimes)

cTimes_g = Max_cTimes;

其他

cTimes_g = Min_cTimes;

delay_20ms(15);

打破;

案例4://向右移動

cTimes_l_r = ++ cTimes_l_r> Max_cTimes?Max_cTimes:cTimes_l_r;

打破;

情況5://向下移動

cTimes_u_d = ++ cTimes_u_d> Max_cTimes?Max_cTimes:cTimes_u_d;

打破;

}

}

}

u8 KeyScan()

{

u8 key = 0;

如果(P1!= 0xff)

{

delay_20ms(2);

如果(P1!= 0xff)

{

u8 temp = P1;

key = 1;

while(temp&0x01)

{

temp = temp >> 1;

鍵++;

}

}

}

return key;

}

void Delay20ms()//@12.000MHz

{

unsigned char i, j, k;

_nop_();

_nop_();

我= 1;

j = 234;

k = 113;

{

do

{

while(--k);

( - j);

} 當我);

}

void delay_20ms(u16 x)

{

while(x--)Delay20ms();

}

//計時器0中斷函數每次進入中斷間隔時間為度(單位時間寬度)

void timer0()interrupt 1 using 1

{

static u16 times = 0;

TL0 = R_TL0;

TH0 = R_TH0;

//每次只控制一個舵機移動

if(times == 0)

{

switch(KeyValue)

{

case 1:

case 5:

CTRL_u_d = 1;

CTRL_l_r = 0;

CTRL_g = 0;

打破;

情況2:

情況4:

CTRL_u_d = 0;

CTRL_l_r = 1;

CTRL_g = 0;

打破;

情況3:

CTRL_u_d = 0;

CTRL_l_r = 0;

CTRL_g = 1;

打破;

}

}

else

{

switch(KeyValue)

{

case 1:

case 5:

if(times> = cTimes_u_d)

{

CTRL_u_d = 0;

}

break;

情況2:

情況4:

if(times> = cTimes_l_r)

{

CTRL_l_r = 0;

}

break;

情況3:

if(times> = cTimes_g)

{

CTRL_g = 0;

}

break;

}

}

times = ++ times> = Times?0:倍;

}

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示