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

📄 step.c

📁 基于51的步进电机控制器,含有人机结口程序,软硬件测试都已通过.是不错的参考代码.
💻 C
📖 第 1 页 / 共 2 页
字号:
      Back_line();                      //回零
   }
   else if(KEY==3)
   {
      FLAG1=1;                          //显示切换标志位1(显示速度)
      Led1[0]=SpeedX%10;Led1[1]=(SpeedX%100)/10;Led1[2]=SpeedX/100;Led1[3]=10;//显示当前速度
      Led1[4]=SpeedY%10;Led1[5]=(SpeedY%100)/10;Led1[6]=SpeedY/100;Led1[7]=10;
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=1;                        //数码管闪烁标志位1(第1位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[0]+=1;
            while(Led1[0]>9)
            Led1[0]=0;
         }
         else if(KEY==3)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=2;                        //数码管闪烁标志位2(第2位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[1]+=1;
            while(Led1[1]>9)
            Led1[1]=0;
         }
         else if(KEY==3)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=3;                        //数码管闪烁标志位3(第3位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[2]+=1;
            while(Led1[2]>9)
            Led1[2]=0;
         }
         else if(KEY==3)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=5;                        //数码管闪烁标志位5(第5位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[4]+=1;
            while(Led1[4]>9)
            Led1[4]=0;
         }
         else if(KEY==3)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=6;                        //数码管闪烁标志位6(第6位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[5]+=1;
            while(Led1[5]>9)
            Led1[5]=0;
         }
         else if(KEY==3)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=7;                        //数码管闪烁标志位7(第7位闪烁)
         if(KEY==5)
         {
            KEY=0;                      //清键值
            Led1[6]+=1;
            while(Led1[6]>9)
            Led1[6]=0;
         }
         else if(KEY==3)
         break;
      }
      KEY=0;                            //清键值
      FLAG=0;                           //数码管闪烁标志位0(无闪烁)
      SpeedX=Led1[0]+Led1[1]*10+Led1[2]*100;//计算并存储所设速度
      SpeedY=Led1[4]+Led1[5]*10+Led1[6]*100;
   }
   else if(KEY==4)
   {
      Led2[0]=Xe%10;Led2[1]=Xe/10;Led2[2]=11;Led2[3]=11;//显示当前坐标
      Led2[4]=Ye%10;Led2[5]=Ye/10;Led2[6]=11;Led2[7]=11;
      FLAG1=0;                          //显示切换标志位0(显示坐标)
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=1;                        //数码管闪烁标志位1(第1位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Led2[0]+=1;
            while(Led2[0]>9)
            Led2[0]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=2;                        //数码管闪烁标志位2(第2位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Led2[1]+=1;
            while(Led2[1]>9)
            Led2[1]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=5;                        //数码管闪烁标志位5(第5位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Led2[4]+=1;
            while(Led2[4]>9)
            Led2[4]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=6;                        //数码管闪烁标志位6(第6位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Led2[5]+=1;
            while(Led2[5]>9)
            Led2[5]=0;
         }
         else if(KEY==4)
         break;
      }
      KEY=0;                            //清键值
      FLAG=0;                           //数码管闪烁标志位0(无闪烁)
      Xe=Led2[1]*10+Led2[0];//Led2[3]*1000+Led2[2]*100+Led2[1]*10+Led2[0];//计算并存储所设坐标
      Ye=Led2[5]*10+Led2[4];//Led2[7]*1000+Led2[6]*100+Led2[5]*10+Led2[4];
   }
   while(KEY==7)                        //电机X单独运行
   {
      FLAG1=1;                          //显示切换标志位1(显示速度)
      time0_tmp=0x4000;                 //改变定时显示初值
      Led1[4]=0;Led1[5]=0;Led1[6]=0;Led1[7]=0;
      Led1[0]=SpeedX%10;Led1[1]=(SpeedX%100)/10;Led1[2]=SpeedX/100;Led1[3]=10;//显示X电机速度
      for(i=0;i<8;i++)
      {
         P1=StepX1[i];
//         time1_int(Tx);
         delay10ms(6000/SpeedX);
      }
   }
   while(KEY==8)                        //电机Y单独运行
   {
      FLAG1=1;                          //显示切换标志位1(显示速度)
      time0_tmp=0x4000;                 //改变定时显示初值
      Led1[0]=0;Led1[1]=0;Led1[2]=0;Led1[3]=0;
      Led1[4]=SpeedY%10;Led1[5]=(SpeedY%100)/10;Led1[6]=SpeedY/100;Led1[7]=10;//显示Y电机速度
      for(i=0;i<8;i++)
      {
         P1=StepY1[i];
//         time1_int(Tx);
         delay10ms(6000/SpeedY);
      }
   }
}
//------------------------------------------------------------------------------------
// 函数名称:Go_line()
// 函数功能:直线差补算法---前进
//------------------------------------------------------------------------------------
void Go_line(void)
{
   unsigned int i,j;
   time0_tmp=0x4000;                    //改变定时显示初值
   Nxy=Xe+Ye;                           //计算总步数
   if(FLAG2==1)                         //电机正反转切换标志位1(让电机仅正转1次)
      return;

   while(Nxy!=0)					    //差补算法
   {
      if(Fm>=0)
      {
         for(j=0;j<circle;j++)
         {
            for(i=0;i<8;i++)
            {
               P1=StepX1[i];
               delay10ms(6000/SpeedX);
//               time1_int(Tx);
            }
         }
         Xi+=1;
         Fm-=Ye;
      }
      else
      {
         for(j=0;j<circle;j++)
         {
            for(i=0;i<8;i++)
            {
               P1=StepY1[i];
               delay10ms(6000/SpeedY);
//               time1_int(Ty);
            }
         }
         Yi+=1;
         Fm+=Xe;
      }
      Nxy--;
      FLAG2=1;                          //电机正反转切换标志位1(正转)
      Led2[3]=Xi/1000;Led2[2]=(Xi%1000)/100;Led2[1]=(Xi%100)/10;Led2[0]=Xi%10;//显示当前坐标
      Led2[7]=Yi/1000;Led2[6]=(Yi%1000)/100;Led2[5]=(Yi%100)/10;Led2[4]=Yi%10;
   }
}
//------------------------------------------------------------------------------------
// 函数名称:Back_line()
// 函数功能:直线差补算法---回零
//------------------------------------------------------------------------------------
void Back_line(void)
{
   unsigned int i,j;
   time0_tmp=0x4000;                    //改变定时显示初值
   Nxy=Xe+Ye;                           //计算总步数
   Fm=0;                                //加工点偏差置0
   if(FLAG2==0)                         //电机正反转切换标志位0(让电机仅反转1次)
      return;

   while(Nxy!=0)
   {
      if(Fm>=0)
      {
         for(j=0;j<circle;j++)
         {
            for(i=0;i<8;i++)
            {
               P1=StepX2[i];
//               time1_int(Tx);
               delay10ms(6000/SpeedX);
            }
         }
         Xi-=1;
         Fm-=Ye;
      }
      else
      {
         for(j=0;j<circle;j++)
         {
            for(i=0;i<8;i++)
            {
               P1=StepY2[i];
//               time1_int(Ty);
               delay10ms(6000/SpeedY);
            }
         }
         Yi-=1;
         Fm+=Xe;
      }
      Nxy--;
      FLAG2=0;                          //电机正反转切换标志位0(反转)
      Led2[3]=Xi/1000;Led2[2]=(Xi%1000)/100;Led2[1]=(Xi%100)/10;Led2[0]=Xi%10;//显示当前坐标
      Led2[7]=Yi/1000;Led2[6]=(Yi%1000)/100;Led2[5]=(Yi%100)/10;Led2[4]=Yi%10;
   }
}
//------------------------------------------------------------------------------------

⌨️ 快捷键说明

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