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

📄 motor.c

📁 通过键盘能分别给步进电机单独运行的速度,同时也能进行差补运行,画直线段,并能返回原点
💻 C
📖 第 1 页 / 共 2 页
字号:
/////////////////////////////////////////////////////////////////////////////////////
//             MCS51单片机作为主控制器组成一个双步进电机控制器                     // 
//         通过小键盘,能给定两台步进电机单独运行的速度,要求可供选择的步          //
//         进速度从60~600步/秒,可连续任意设置;通过直线差补算法能实时显           //
//         示所绘直线段的坐标,并能通过键盘设定新的终点参数,且步进电机能          //
//         正确运行到该点,回零后能快速回到始点。                                   // 
/////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////
#include<reg51.h>                                            //51芯片管脚定义头文件
#include<stdio.h>

typedef unsigned char unchar;
sbit LED1=P2^0;            //LED位选 
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;
unchar start=0;            //启动键按下标志, 按下标志量变为一
unchar back=0;             //回零键按下标志, 按下标志量变为一
unchar setX_F=0;           //设置键X按下标志,按下标志量变为一
unchar setY_F=0;           //设置键Y按下标志,按下标志量变为一
unchar set_add_F=0;        //加一键按下标志, 按下标志量变为一
unchar set_sure_F=0;       //确定键按下标志, 按下标志量变为一
unchar setX_Z=0;           //设置X坐标键按下,按下标志量变为一
unchar setY_Z=0;           //设置Y坐标键按下,按下标志量变为一

////////////////////////////////////////////////////////////////////////////////////////////////
//定义全局变量
///////////////////////////////////////////////////////////////////////////////////////////
unsigned int keytmp,tmp;
unsigned int a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0,p=0,t=0,u=0,r=0;
unsigned int speed=0,speed1=0,speed2=0;
unsigned int Xi=0,Yi=0;
unsigned int FX=0,FY=0;
unsigned int XE=0,YE=0,Nxy=0;   //(X轴坐标,Y轴坐标,总部数)
int FM=0;
unsigned int flag=0,flagx=0,flagy=0;
unsigned int setX_value=0;        // 当标志位为一时跳出设置X速度的循环
unsigned int setY_value=0;        // 当标志位为一时跳出设置Y速度的循环
unsigned int setX_Z_value=0;      // 当标志位为一时跳出设置X坐标的循环
unsigned int setY_Z_value=0;      // 当标志位为一时跳出设置X坐标的循环
unsigned char code LED[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //LED段选码
                        //  0,   1,   2,   3,   4,   5,   6,   7,   8,   9
int time=0;             //定时扫描键盘标志位           
int time1=0;
int time2=0;            //LED闪射时间
int timeF2=0;           //LED闪射时间标志

/////////////////////////////////////////////////////////////////////////////////////////////
//声明函数
////////////////////////////////////////////////////////////////////////////////////////////
void Time0_initial();
void Time1_initial();                                             //定时器1初始化
void chabu();                                                     //双步进电机差补运行 
void runback();                                                   //步进电机回零
void runX();                                                      //电机X正向运行
void runY();                                                      //电机Y正向运行
void control();                                                   //速度,坐标设置控制
void displayxy(int,int);                                          //LED显示(int-位选,int-段选)
void displayXY_data(int,int,int,int,int,int,int,int,int);         //8位LED显示数据,第一个int代表LED1显示的
                                                                  //数值,第二个int代表LED2显示的数值,*****
																  //第九个int代表是否屏蔽其中的位选,是否闪动.
//////////////////////////////////////////////////////////////////////////////
void dingshi1ms(int i)                                 //延时10ms程序
{ 
  time1=0;
  while(1)
  {
    if(time1==i)
	break;
  }
}
/////////////////////////////////////////////
main()                                                            //主程序
{
   P0=0x00;
   P1=0;
   P2=0xff;
   P3=0x00; 
   TMOD=0x11;
   TF1=0;
   TF0=0;
   Time0_initial();
   Time1_initial();
   ET0=1;
   ET1=1;
   EA=1;  
   while(1)
   {
     control();
   }
} 
void time0_initial()
{
   TR0=0;
   TF0=0;
   TH0=0xfc;
   TL0=0x17;
   TR0=1;    
}
///////////////////////////////////////////////
void time0_int(void) interrupt 1
{
  time1+=1;
  time0_initial();
}
void Time1_initial()       //定时器1中断初始化定时50ms
{
  TR1=0;
  TF1=0;
  TH1=0x3c;
  TL1=0xaf;
  TR1=1;
}
///////////////////////////////////////////////
//定时扫描键盘
////////////////////////////////////////////////
void time1_int(void) interrupt 3
{  
   time+=1;
   time1+=1;
   time2+=1;
   if(time2<=4)
      {timeF2=0;}
    if(time2>4&&time2<8)
      {timeF2=1;}
    if(time2==8)
      { timeF2=0;
        time2=0;
      }
	if(time==2)
	{
	  P3=0x00;
      P3=0x01;                                                     //第一行置零
      tmp=P3;
	  keytmp=tmp&0xff;              
      if(keytmp!=0x01)
     {   
        switch(keytmp)
        {
          case 0x11:
             start=1;    break;
          case 0x21:
             setX_F=1;    break;
          case 0x41:
             setY_F=1;    break;
          case 0x81:
             setX_Z=1;    break; 
          default :       break;
	    }
      }   
	}
    if(time==4)
     { 
     P3=0x00;
     P3=0x02;                                                           //第二行置零
     tmp=P3;
	 keytmp=tmp&0xff;            
     if(keytmp!=0x02)
     {
       switch(keytmp)
       {
          case 0x12:
               back=1;  break;
          case 0x22:
               set_sure_F=1;  break;
          case 0x42:
               set_add_F=1;   break;
          case 0x82:  
               setY_Z=1;     break;
          default :           break;
	    }		   
      }
 	    time=0;
    }
    Time1_initial();
}
//////////////////////////////////////////////
//电机X轴正运行函数
//////////////////////////////////////////////
void runX(void)
{  int tt;
   speed=(int)(3750/(a*100+b*10+c));
  while(1)
  {  
      P1=0x01;
	  tt=speed;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
      P1=0x03;
      tt=speed;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
	  P1=0x02;
	  tt=speed;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
      P1=0x06;
      tt=speed;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
	  P1=0x04;
      tt=speed;
     while(tt--)
 	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
	  P1=0x0c;
	  tt=speed;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
	  P1=0x08;
	  tt=speed;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
      P1=0x09;
	  tt=speed;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,1);
	Xi+=1;Yi+=1;
   if(set_sure_F==1) break;
   }
}
/////////////////////////////////////////////
//电机Y正运行函数
/////////////////////////////////////////////
void runY(void)
{  
   int tt;
   speed=(int)(3750/(d*100+e*10+f));
   while(1)
   {
    P1=0x10;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
    P1=0x30;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
    P1=0x20;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	P1=0x60;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	P1=0x40;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	P1=0xc0;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	P1=0x80;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	P1=0x90;
	tt=speed;
   while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,2);
	Xi+=1;Yi+=1;
   if(set_sure_F==1) break;
   }
}
/////////////////////////////////////////////
///双步进电机差补运行
//////////////////////////////////////////////
void chabu(void)
{   int tt;
    speed1=(int)(3750/(a*100+b*10+c));
    speed2=(int)(3750/(d*100+e*10+f));
    FM=0;
    XE=g*100+h*10+p;
    YE=t*100+u*10+r;
    Nxy=XE+YE; 
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0); 
    while(1)
    {
      if(FM>=0)
	  {
	   P1=0x01;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x03;
      tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x02;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x06;
      tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x04;
      tt=speed1;
     while(tt--)
 	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x0c;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x08;
	  tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x09;
	  tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	   Xi+=1;
       FM=FM-YE;
	  } 
 	  else if(FM<0) 
	  {
	   P1=0x10;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
    P1=0x30;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
    P1=0x20;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x60;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x40;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0xc0;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x80;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x90;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	   Yi+=1;
	   FM=FM+XE;
	  }
	  Nxy-=1;
	  if(Nxy==0) break;
    }
   
}
///////////////////////////////////////////////
//步进电机回零函数
///////////////////////////////////////////////
void runback(void)
{
    int tt;
    speed1=(int)(3750/(a*100+b*10+c));
    speed2=(int)(3750/(d*100+e*10+f));
    FM=0;
    XE=g*100+h*10+p;
    YE=t*100+u*10+r;
    Nxy=XE+YE; 
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0); 
    while(1)
    {
      if(FM>=0)
	  {
	   P1=0x09;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x08;
      tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x0c;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x04;
      tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x06;
      tt=speed1;
     while(tt--)
 	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x02;
	  tt=speed1;
     while(tt--)
      displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	  P1=0x02;
	  tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
      P1=0x01;
	  tt=speed1;
     while(tt--)
	  displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	   Xi-=1;
       FM=FM-YE;
	  } 
 	  else if(FM<0) 
	  {
	   P1=0x90;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
    P1=0x80;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
    P1=0xc0;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x40;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x60;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x20;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x30;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	P1=0x10;
	tt=speed2;
    while(tt--)
    displayXY_data(0,Xi/100,Xi%100/10,Xi%10,0,Yi/100,Yi%100/10,Yi%10,0);
	   Yi-=1;
	   FM=FM+XE;
	  }
	  Nxy-=1;
	  if(Nxy==0) break;
    }
   
}
//////////////////////////////////////////////
///////////显示程序
/////////////////////////////////////////////
void displayxy(int i,int j)
{
   P2=0xff; 
   if(i==0)
     {  P2=0xff; P0=LED[j]; }
   if(i==1)
     {  LED1=0; P0=LED[j]; }
   if(i==2)
     {  LED2=0; P0=LED[j]; }
   if(i==3)
     {  LED3=0;P0=LED[j];  }
   if(i==4)
     { LED4=0;P0=LED[j];   }
   if(i==5)
     {  LED5=0; P0=LED[j]; }
   if(i==6)
     {  LED6=0;P0=LED[j];  }
   if(i==7)
     {  LED7=0; P0=LED[j]; }
   if(i==8)
     {  LED8=0; P0=LED[j]; }
   if(i==11)
     {  LED1=1; P0=LED[j]; }
   if(i==12)
     {  LED2=1; P0=LED[j]; }
   if(i==13)
     {  LED3=1;  P0=LED[j]; }
   if(i==14)
     { LED4=1; P0=LED[j]; }
   if(i==15)
     {  LED5=1; P0=LED[j]; }
   if(i==16)
     {  LED6=1; P0=LED[j]; }
   if(i==17)
     {  LED7=1;  P0=LED[j]; }
   if(i==18)
     {  LED8=1;  P0=LED[j];}
}
////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////
void displayXY_data(int i,int j,int k,int m,int x,int y,int z,int q,int n)
{
  if(n==0)
   {
    displayxy(1,i);
    dingshi1ms(2);
    displayxy(2,j);
    dingshi1ms(2);
    displayxy(3,k);
    dingshi1ms(2);
    displayxy(4,m);
    dingshi1ms(2);
    displayxy(5,x);
	dingshi1ms(2);
	displayxy(6,y);
	dingshi1ms(2);
	displayxy(7,z);
	dingshi1ms(2);
	displayxy(8,q);
	dingshi1ms(2);
   }
////////////////////////////////////////////////
  if(n==1)
   {
	displayxy(1,i);
    dingshi1ms(2);
    displayxy(2,j);
    dingshi1ms(2);
    displayxy(3,k);
    dingshi1ms(2);
    displayxy(4,m);
    dingshi1ms(2);
    displayxy(15,x);
	dingshi1ms(2);
	displayxy(16,y);
	dingshi1ms(2);
	displayxy(17,z);
	dingshi1ms(2);
	displayxy(18,q);
	dingshi1ms(2);
   }
/////////////////////////////////////////////
  if(n==2)
   {
    displayxy(11,i);
    dingshi1ms(2);
    displayxy(12,j);
   dingshi1ms(2);
    displayxy(13,k);
    dingshi1ms(2);
    displayxy(14,m);
    dingshi1ms(2);
    displayxy(5,x);
	dingshi1ms(2);
	displayxy(6,y);

⌨️ 快捷键说明

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