#inc" />
当前位置:文档之家› 51单片机控制五自由度机械手臂源程序

51单片机控制五自由度机械手臂源程序

/*****五自由度机器手臂舵机控制**********/
/*****中国地质大学(武汉)**************/
/***机械与电子信息学院071082班王聪***/
#include<reg
52."h>
#include<zlg
7289."h>
/************************************************************/#defi ne uint unsigned int
#define uchar unsigned char
sbit P00=P0^0; //底座旋转舵机
sbit P01=P0^1; //腰部舵机
sbit P02=P0^2; //肘部舵机
sbit P03=P0^3; //腕部舵机
sbit P04=P0^4; //夹持舵机
uchar Key=0xff;//默认键值
uchar k=0xff;
uchar flag=0;
uchar dat;
uchar M=11;
uchar dj0,dj1,dj2,dj3,dj4;
uchar a=0;
uchar c=0;
uchar beep=1;
/***********************************************************/void Delay(uchar n)//毫秒延时{uint i,j;
for(i=n;i>0;i--)
for(j=0;j<1140;j++);}
void Init_Timer0(void){TMOD |= 0x01;
TH0=0xff;//定时器初值,定时100us
TL0=0x9c;
EA=1;
ET0=1;
TR0=1;}void INT0_SVC() interrupt 0{Key = ZLG7289_Key();
k = Key; //Key的值复制到临时变量k中
Key = 0xFF; //Key恢复为无按键状态
flag=1;}void Init_zlg(void){Delay
(10); //延时30ms,等待ZLG7289复位完毕
ZLG7289_Init
(4); //调用ZLG7289的初始化函数
Delay
(20);
ZLG7289_Reset();
Delay
(10);}void Timer0_isr(void) interrupt 1 using 1
//中断函数内部太过复杂,影响定时器计时精度,堆栈是否会溢出出问题?有待测试...{a+=1;
c+=1;
TH0=0xff;
TL0=0x9c;
if(a==M)//高电平持续时间{a=0;
beep=0;}if(c==200)//低电平持续时间为(200-M)*100us{a=c=0;
beep=1;}}
void mov(uchar t ,uchar p,uchar n)//单步动作完成函数,t为控制执行时间参数,n为舵机编号选择{uchar i,j;
M=p;//所需位置信息赋给舵机脉宽变量
for(i=0;i<150;i++){if(flag)
break;
for(j=0;j<t;j++){switch(n){case 0:{P00=beep;dj0=p;break;}
case 1:{P01=beep;dj1=p;break;}
case 2:{P02=beep;dj2=p;break;}
case 3:{P03=beep;dj3=p;break;}
case 4:{P04=beep;dj4=p;break;}
default:
break;}}}}
void auto_mov()//自动执行一串动作{mov(100,5,0);
mov(60,7,1);
mov(100,22,3);
mov(200,17,4);
mov(60,10,1);
mov(60,8,2);
mov(100,22,0);
mov(80,7,1);
mov(80,10,2);
// mov(100,20,3);
mov(200,8,4);
mov(60,11,1);
mov(60,11,2);
mov(60,18,3);}void key_test(){for (;;){flag=0;
if ( k != 0xFF ) //通过临时变量k判断是否有键按下,有则显示出来{ dat = k / 10;
ZLG7289_Download(1,2,0,dat);
dat = k - dat * 10;
ZLG7289_Download(1,3,0,dat);
//以下部分调节高电平脉宽,控制舵机转角
switch(k){case 0:{ if(dj0>=5)dj0--;M=dj0;break;}
case 1:{ if(dj1>=5)dj1--;M=dj1;break;} case 2:{ if(dj2>=5)dj2--;M=dj2;break;} case 3:{ if(dj3>=5)dj3--;M=dj3;break;} case 4:{ if(dj0<=23)dj0++;M=dj0;break;} case 5:{ if(dj1<=23)dj1++;M=dj1;break;} case 6:{ if(dj2<=23)dj2++;M=dj2;break;} case 7:{ if(dj3<=23)dj3++;M=dj3;break;} case 8:{ if(dj4<=23)dj4++;M=dj4;break;} case 9:{ if(dj4>=5)dj4--;M=dj4;break;} case 10:{auto_mov();k=0xff;break;} default:
break;}while(k==0||k==4){P00=beep; if(flag)
break;}while(k==1||k==5){P01=beep; if(flag)
break;}while(k==2||k==6){P02=beep; if(flag)
break;}while(k==3||k==7){P03=beep; if(flag)
break;}while(k==8||k==9){P04=beep; if(flag)
break;}}
Delay
(5);}}
void main(){Init_Timer0();//初始化定时器设置Init_zlg();//初始化周立功7289
IT0 = 1; //负边沿触发中断
EX0 = 1;
dj0=dj1=dj2=dj3=dj4=M;
while(k==0xff)
P00=P01=P02=P03=beep;
key_test();}。

相关主题