利用舵機製作簡單機械臂程序分享

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

** 編寫時間:2017.07.11

**使用晶元:stc12c2052ad

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

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

程序

#include <stc12c2052ad.h>

#include <intrins.h>

typedef unsigned char u8;

typedef unsigned short int u16;

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

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

Advertisements

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;

Advertisements

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 <Min_cTimes?Min_cTimes:cTimes_u_d;

打破;

情況2://向左移動

cTimes_l_r = --cTimes_l_r <Min_cTimes?Min_cTimes: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:倍;

}

Advertisements

你可能會喜歡