*項目名稱:利用舵機制作簡單機械臂
** 編寫時間: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:倍; }