⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 25.c

📁 一个2051控制两个步进电机的源码
💻 C
字号:

/***************************************************************************
软件名称:步进电机控制控制软件
软件编写:梁博宇
编写时间:2004/09/11
最后修改时间:
版本:1.0  
编译环境:KEIL C7.07
备注:
通讯协议
(1)接受数据 
  1               2                        3           4		      5
 地址  电机1的方向 电机2的方向 命令字  电机1的步数 电机2的步数	 校验和
(2)发送数据
  1               2          3         
本机地址		   电机/位置		校验和
*****************************************************************************/
#include<AT892051.H>
#include <absacc.h>
#include <stdio.h>
#include<intrins.h>
#define uchar unsigned char
#define uint  unsigned int
 uint  timedj;
 uchar bjadd;
 uchar *com1;//
 uchar *com2;//
 uchar i,j;//
 uchar add1,ad1;//加速阶段步数,匀速阶段步数,减速阶段步数
 uchar add2,ad2;
 uchar ys,ys1;
 uchar ji1,ji2;
 uchar jsbf1,jsbf2;
 uchar ji1bf,ji2bf;
 uchar jiabf,jibbf;
 uchar fx,fx1;
 uchar bx,bx1;
 uchar fangx1,fangx2;
//uchar p;//效验和
 bit fbit,mot1,mot2,djz1,djz2,jsbit,fasbit1,fasbit2,zxbit1,zxbit2;
 uchar weiz,weiz1;
bit fwbit1,fwbit2,fwbit3;
 uchar code ff[5]={0x03,0x06,0x0c,0x09,0x00};//电机1反转 0011  0110  1100  1001
uchar code zz[5]={0x03,0x09,0x0c,0x06,0x00};//电机1正转 0011  1001  1100  0110
uchar code ff1[5]={0x30,0x60,0xc0,0x90,0x00};//电机2反转
uchar code zz1[5]={0x30,0x90,0xc0,0x60,0x00};//电机2正转
 uchar data in[3];//接收到
void djfw(unsigned char no);
void mot_c1(void) //方向  步数 工作状态加速/减速
{
 P3_4=0;
 ys=10;
 if(bx!=0)
 {
 if(10<bx)
 ad1=5;
 else 
 ad1=bx/2;
 add1=2*ad1+2;
 }
 if(fx==1)
	 {
	 com1=zz;//正转
	 mot1=1;
	 ji1=bx;
	 jiabf=bx;
	 fbit=0;
	 fx=0;
    bx=0;
	 fangx1=1;
	 }
 else if(fx==2)
	 {
	 com1=ff;//反转
	 mot1=1;
	 ji1=bx;
	 jiabf=bx;
	 fbit=0;
	 fx=0;
    bx=0;
	 fangx1=2;
	 }
}
void mot_c2(void)
{
P3_5=0;
 ys1=10;
 if(bx1!=0)
 {
 if(10<bx1)
 ad2=5;
 else
 ad2=bx1/2;
 add2=2*ad2+2;
 }
 if(fx1==1)
 {
 com2=zz1;//正转
 mot2=1;
 ji2=bx1;
 jibbf=bx1;
 fbit=0;
 fx1=0;
 bx1=0;
 fangx2=1;
 }
 else if(fx1==2)
 {
 com2=ff1;//反转
 mot2=1;
 ji2=bx1;
 jibbf=bx1;
 fbit=0;
 fx1=0;
 bx1=0;
 fangx2=2;
 }
}
bit comout(void)//发送
{
uchar p;
 ES=0;
SM2=0;
SBUF=bjadd;//将地址发回
while(TI!=1);TI=0;
while(RI!=1);RI=0;
SBUF=in[0];
while(TI!=1);TI=0;
p=bjadd+in[0];
SBUF=p;
while(TI!=1);TI=0;
while(RI!=1);RI=0;
SM2=1;
if(SBUF==0x00)
{
  ES=1;
 return(0);
}
else
{
  ES=1; 
 return(1);
}
}

void out(void) 
{
uchar b;
b=in[0]>>4;
if(b==1)
 {
	b=in[0]&0x03;
	if(b==1)//1电机正转
	{	
	fx=1;
	bx=in[1];
	mot_c1();
	}
	else if(b==2)//1电机反转
	{
	fx=2;
	bx=in[1];
   mot_c1();
	}
	b=(in[0]>>2)&0x03;
	if(b==1)//2电机正转
	{
	fx1=1;
	bx1=in[2];
   mot_c2();
	}
	else if(b==2)//2电机反转
	{
	fx1=2;
	bx1=in[2];
   mot_c2();
	}  
 }
else if(b==2)//1复位
fwbit1=1;
else if(b==3)//2复位
fwbit2=1;
else if(b==4)//复位
fwbit3=1;
 in[0]=0;
 in[1]=0;
 in[2]=0; 
}

void inttime(void) interrupt 1
{
uchar temp;
TH0=-550/256;
TL0=-550%256;
P3_3=1;
P3_2=1;
if(!P3_2&&!zxbit1)
        {
        zxbit1=1;
        fasbit1=1;
        fx=0;
		  mot1=0;//停机
		  ji1=0;
		  bx=0;     
        }
  else if(P3_2)
  zxbit1=0;  
	if(!P3_3&&!zxbit2)
	{
    zxbit2=1;
   fasbit2=1;
    fx1=0;
	 mot2=0;//停机
	 ji2=0;
	 bx1=0;     
	}
  else if(P3_3)
  zxbit2=0; 
if(mot1)//电机1
	{
	if(ys==0)
		{
		temp=P1&0xf0;
		P1=temp|com1[i];
		if(com1[++i]==0x00)i=0;
		ji1--;		
		ys=jsbf1;	
		if(ji1==0)
		{
		mot1=0;
		fangx1=0;
      P3_4=1;  
		}
		}
	else
	 ys--;
	fbit=0;
	}
if(mot2)//电机2  
	{	
	if(ys1==0)
		{
		temp=P1&0x0f;
		P1=temp|com2[j];
		if(com2[++j]==0x00)j=0;
		ji2--;				
      ys1=jsbf2;
		if(ji2==0)
		{
		mot2=0;
		fangx2=0;
      P3_5=1;  
		}
		}
	else
	ys1--;
	fbit=0;
	}
if(jsbit)
	{
		timedj++;
		if(timedj>510)
		{
	   jsbit=0;
		timedj=0;
		}
	} 
} 

 
void com(void) interrupt 4 using 2//通讯
{
 uchar p,s; 
 ES=0;
 if(TI)
 TI=0;
 else if(SBUF!=bjadd)//地址 
 RI=0;
 else
 { 
  RI=0;
  SM2=0;
  SBUF=bjadd;//将地址发回
  while(TI==0);TI=0;
  p=0;
  for(s=0;s<3;s++)
	  {
	  while(RI!=1);RI=0;
	 in[s]=SBUF;
     p=p+in[s];
	  }
  while(RI!=1);RI=0;
  if(SBUF==p){SBUF=0x00;
   SM2=1;
  out();}
  else
	  {
	  SBUF=0xff;
	  while(TI==0);TI=0;
      SM2=1;
	  }  
  } 
 ES=1;
}
 void Delay1(unsigned int xc)
{
while(xc--)
   _nop_();
    _nop_();
     _nop_();
    _nop_();
    _nop_();
     _nop_();
}
void djfw(unsigned char no)
{
 if(no==1)
 {
 jsbit=1;
 fx=2;
 bx=100;
 mot_c1();
 while(timedj!=500);
 if(!P3_2)//没到
	 {     
	 fx=1;
	 bx=100;
	 mot_c1();
	 }
 }
if(no==2)
 {
 jsbit=1;
 fx1=2;
 bx1=100;
 mot_c2();
 while(timedj!=500);
 if(!P3_3)
	 {     
	 fx1=1;
	 bx1=100;
	 mot_c2();
	 }
 }
if(no==3)
 {
 jsbit=1;
 fx=2;
 bx=100;
 mot_c1();
 fx1=2;
 bx1=100;
 mot_c2();
 while(timedj!=500);
 if(!P3_3)
 {     
 fx=1;
 bx=100;
 mot_c1();
 }
 if(!P3_3)
 {     
 fx1=1;
 bx1=100;
 mot_c2();
 }
 }
}
void main()
{
TMOD=0x21;
TH0=-550/256;
TL0=-550%256;
TL1=0xfd;//0xfd;
TH1=0xfd;//0xfd; //19200
PCON=0x80;
SCON=0xf0;//工作在方式3
TR1=1;
TR0=1;
IP=0x10;
bjadd=0x03;
fbit=1;
P3_4=1;
P3_5=1;
P3_3=1;
P3_2=1;
Delay1(1000);
ET0=1;
ES=1;
EA=1;
//IE=0x97;//47
/////////////////////////
// djfw(3);//复位
while(P3_2&&P3_3);
///////////////////////////////
    
while(1)
	{  
   do{
     if(fwbit1)
     {
     fwbit1=0;
     djfw(1);
     }
     if(fwbit2)
     {
     fwbit2=0;
     djfw(2);
     }
     if(fwbit3)
     {
     fwbit3=0;
     djfw(3);
     }
     if(fasbit1)
       {
        fasbit1=0;      
		  if(fangx1==1)//正向
		  weiz=1;
		  if(fangx1==2)//反向
		  weiz=3;
		  in[0]=0x10|(weiz&0x0f);
		 while(comout());//发送
       }
     if(fasbit2)
      {
       fasbit2=0;    
		 if(fangx2==1)//正向
		 weiz1=1;
		 if(fangx2==2)//反向
		 weiz1=3;
		 in[0]=0x20|(weiz1&0x0f);
		while(comout());//发送
      }	
	  }
	while(fbit);
   fbit=1;
	if(ji1bf!=ji1)
	   {
		ji1bf=ji1;
		if(ji1>jiabf-ad1-1)
		add1=add1-2;
	//	else if(ji1bf<5)
	//   add1=add1+1;
		else
	   add1=1;
		jsbf1=add1;
		}
   if(ji2bf!=ji2)
		{
		ji2bf=ji2;
		if(ji2>jibbf-ad2-1)
		add2=add2-2;
	//	else if(ji2bf<5)
	//   add2=add2+1;
		else
	   add2=1;
	   jsbf2=add2;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -