串联机械手程序
#include
#include
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
void delay(uchar t);
uchar dat[10]={0xfa,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0xfb};
uchar receive[8]={0x8B,0x0A,0x62,0x4A,0x30,0x18,0x00,0xFF};//接收VB 发下来的8个有效数据
uchar i,com,step1,step2,step3;
//float a1,a2,a3,a4;
//uint a,b,c,d;
uchar a;
uchar angle1=0; //角度初始化(同步控制)(控制角度1)
uchar angle2=0; //角度初始化(同步控制)(控制角度2)
uchar angle3=0; //角度初始化(同步控制)(控制角度3)
uchar jiaodu1=0; //角度初始化(控制角度1)
uchar jiaodu2=0; //角度初始化(控制角度2)
uchar jiaodu3=0; //角度初始化(控制角度2)
uchar i=0;
sbit P20=P2^0;
sbit P21=P2^1;
sbit P26=P2^6;
sbit P27=P2^7;
sbit P24=P2^4;
sbit P25=P2^5;
sbit P00=P0^0;
sbit P01=P0^1;
sbit P02=P0^2;
sbit P03=P0^3;
sbit P07=P0^7;
sbit P04=P0^4;
uchar dir ,a1,a2,a3,com,S,scom1,scom2,scom3,scom4,scom5,scom6;//电机行走步数 void inter();//****************初始化
void send_da();//串口发送数据
void send1_da();//串口停止发送数据
/** 主函
***********************************************************************/ void main()
{
inter();
while(1) 数
{ switch(dir)
{
case 1:
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;
case 2:
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;
case 3:
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;
case 4:
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;
case 5:
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;
case 6:
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;
case 7:
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;
case 8:
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;
case 9:
TR0=0; //关闭定时器T0
P00=0;
P01=0;
break;
case 10:
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;
}
}
}
/** 初始
***********************************************************************/ void inter()
{
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;
}
void clk_int(void) interrupt 1
{
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++;
}
}
else if((scom4==0)&&(scom6==0))//电机1单动
{
TR0=0;
TH0=0xFF;
TL0=0x00;
P21=!P21;
jiaodu1++;
TR0=1;
if(jiaodu1==scom2)
{
jiaodu1=0;
TR0=0;
}
}
else if((scom2==0)&&(scom6==0))//电机2单动
{
TH0=0xFF;
TL0=0x00;
P26=!P26;
jiaodu1++;
TR0=1;
if(jiaodu2==scom4)
{
jiaodu2=0;
TR0=0;
}
}
else if((scom2==0)&&(scom4==0))//电机4单动
{
TH0=0xFF;
TL0=0x00;
P25=!P25;
jiaodu3++;
TR0=1;
if(jiaodu3==scom6)
{
jiaodu3=0;
TR0=0;
}
}
}
void ser() interrupt 4
{
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
{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;}
else if ((scom1==1)&&(scom3==1)&&(scom5==2)){dir=2;}
else if ((scom1==1)&&(scom3==2)&&(scom5==1)){dir=3;}
else if ((scom1==1)&&(scom3==2)&&(scom5==2)){dir=4;}
else if ((scom1==2)&&(scom3==1)&&(scom5==1)){dir=5;}
else if ((scom1==2)&&(scom3==1)&&(scom5==2)){dir=6;}
else if ((scom1==2)&&(scom3==2)&&(scom5==1)){dir=7;}
else if ((scom1==2)&&(scom3==2)&&(scom5==2)){dir=8;}
else {dir=9;}
}
else if((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;
}
else if((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;
}
else if((scom2==0)&&(scom4==0))//第二节电机2单动 {
dir=10;
}
}
void delay(uchar t)
{
uchar i;
for(;t>0;t--)
{
for(i = 0;i
{;}
}
}