串联机械手程序.docx
《串联机械手程序.docx》由会员分享,可在线阅读,更多相关《串联机械手程序.docx(14页珍藏版)》请在冰豆网上搜索。
串联机械手程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
voiddelay(uchart);
uchardat[10]={0xfa,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0xfb};
ucharreceive[8]={0x8B,0x0A,0x62,0x4A,0x30,0x18,0x00,0xFF};//接收VB发下来的8个有效数据
uchari,com,step1,step2,step3;
//floata1,a2,a3,a4;
//uinta,b,c,d;
uchara;
ucharangle1=0;//角度初始化(同步控制)(控制角度1)
ucharangle2=0;//角度初始化(同步控制)(控制角度2)
ucharangle3=0;//角度初始化(同步控制)(控制角度3)
ucharjiaodu1=0;//角度初始化(控制角度1)
ucharjiaodu2=0;//角度初始化(控制角度2)
ucharjiaodu3=0;//角度初始化(控制角度2)
uchari=0;
sbitP20=P2^0;
sbitP21=P2^1;
sbitP26=P2^6;
sbitP27=P2^7;
sbitP24=P2^4;
sbitP25=P2^5;
sbitP00=P0^0;
sbitP01=P0^1;
sbitP02=P0^2;
sbitP03=P0^3;
sbitP07=P0^7;
sbitP04=P0^4;
uchardir,a1,a2,a3,com,S,scom1,scom2,scom3,scom4,scom5,scom6;//电机行走步数
voidinter();//****************初始化
voidsend_da();//串口发送数据
voidsend1_da();//串口停止发送数据
/**主函数***********************************************************************/
voidmain()
{
inter();
while
(1)
{switch(dir)
{
case1:
TR0=1;//启动定时器T0
P20=1;
P24=1;
P27=1;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case2:
TR0=1;//启动定时器T0
P20=1;
P24=1;
P27=0;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case3:
TR0=1;//启动定时器T0
P20=1;
P24=0;
P27=1;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case4:
TR0=1;//启动定时器T0
P20=1;
P24=0;
P27=0;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case5:
TR0=1;//启动定时器T0
P20=0;
P24=1;
P27=1;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case6:
TR0=1;//启动定时器T0
P20=0;
P24=1;
P27=0;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case7:
TR0=1;//启动定时器T0
P20=0;
P24=0;
P27=1;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case8:
TR0=1;//启动定时器T0
P20=0;
P24=0;
P27=0;
if(jiaodu1==scom2)
{
dir=9;
ES=0;
SBUF=0XFC;//向VB发送结束标志每次结束后都发出FC
while(!
TI);
TI=0;
ES=1;
}
break;
case9:
TR0=0;//关闭定时器T0
P00=0;
P01=0;
break;
case10:
if(scom5==1)
{
P24=0;
P1=0x0f;
}
else
{
P24=1;
P1=0xf0;
}
step3=scom5;
while(step3--)//电机2走VB计算的角度
{
P26=1;
delay(20);
P26=!
P26;
delay(20);
}
step3=0;
P1=0x00;
default:
break;
}
}
}
/**初始化***********************************************************************/
voidinter()
{
com=0;
TMOD=0x21;
SCON=0X50;
PCON=0X00;
TH1=0xfd;//9600
TL1=0xfd;
TR1=1;
EA=1;//打开总中断
ES=1;//允许串口中断
TR1=1;//启动定时器T1
REN=1;//允许接收
ET0=1;//允许定时器0中断*/
P21=0;
P25=0;
P26=0;
TH0=0xFF;
TL0=0x00;
TR0=0;
TF0=0;
}
voidclk_int(void)interrupt1
{
TR0=0;
if((scom2!
=0)&&(scom4!
=0)&&(scom6!
=0))
{
TH0=0xFF;
TL0=0x00;
TR0=1;
angle1++;
angle2++;
angle3++;
if(angle1==a1)
{angle1=0;
P21=!
P21;
jiaodu1++;
}
if(angle2==a2)
{angle2=0;
P26=!
P26;
jiaodu2++;
}
if(angle3==a3)
{angle3=0;
P25=!
P25;
jiaodu3++;
}
}
elseif((scom4==0)&&(scom6==0))//电机1单动
{
TR0=0;
TH0=0xFF;
TL0=0x00;
P21=!
P21;
jiaodu1++;
TR0=1;
if(jiaodu1==scom2)
{
jiaodu1=0;
TR0=0;
}
}
elseif((scom2==0)&&(scom6==0))//电机2单动
{
TH0=0xFF;
TL0=0x00;
P26=!
P26;
jiaodu1++;
TR0=1;
if(jiaodu2==scom4)
{
jiaodu2=0;
TR0=0;
}
}
elseif((scom2==0)&&(scom4==0))//电机4单动
{
TH0=0xFF;
TL0=0x00;
P25=!
P25;
jiaodu3++;
TR0=1;
if(jiaodu3==scom6)
{
jiaodu3=0;
TR0=0;
}
}
}
voidser()interrupt4
{
RI=0;
angle1=0;
angle2=0;
angle3=0;
jiaodu1=0;
jiaodu2=0;
jiaodu3=0;
if(com==0)
{
a=SBUF;
if(a==0x0c)
{com=1;}
else
{com=0;}
}
else
{S=SBUF;
if(com==1)
{
scom1=S;
}
if(com==2)
{
scom2=S;
}
if(com==3)
{
scom3=S;
}
if(com==4)
{
scom4=S;
}
if(com==5)
{
scom5=S;
}
if(com==6)
{
scom6=S;
}
if(com<6)
{com=com+1;}
else
{
com=0;
}
}
if((scom2!
=0)&&(scom4!
=0)&&(scom6!
=0))//三机联动控制的方向控制和脉宽控制
{
a1=(scom4*scom6);
a2=(scom2*scom6);
a3=(scom2*scom4);
if((scom1==1)&&(scom3==1)&&(scom5==1)){dir=1;}
elseif((scom1==1)&&(scom3==1)&&(scom5==2)){dir=2;}
elseif((scom1==1)&&(scom3==2)&&(scom5==1)){dir=3;}
elseif((scom1==1)&&(scom3==2)&&(scom5==2)){dir=4;}
elseif((scom1==2)&&(scom3==1)&&(scom5==1)){dir=5;}
elseif((scom1==2)&&(scom3==1)&&(scom5==2)){dir=6;}
elseif((scom1==2)&&(scom3==2)&&(scom5==1)){dir=7;}
elseif((scom1==2)&&(scom3==2)&&(scom5==2)){dir=8;}
else{dir=9;}
}
elseif((scom4==0)&&(scom6==0))//大臂电机1单动
{
if(scom1==1)
{
P20=0;
P1=0x0f;
}
else
{
P20=1;
P1=0x00;
}
step1=13*scom2;
while(step1--)//大臂电机1走VB计算的角度
{
P21=1;
delay(10);
P21=!
P21;
delay(10);
}
P1=0x00;
}
elseif((scom2==0)&&(scom6==0))//第二节电机2单动
{
if(scom3==1)
{
P27=0;
P1=0x0f;
}
else
{
P27=1;
P1=0xf0;
}
step2=scom4;
while(step2--)//电机2走VB计算的角度
{
P25=1;
delay(20);
P25=!
P25;
delay(20);
}
P1=0x00;
}
elseif((scom2==0)&&(scom4==0))//第二节电机2单动
{
dir=10;
}
}
voiddelay(uchart)
{
uchari;
for(;t>0;t--)
{
for(i=0;i<125;i++)
{;}
}
}