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

📄 step.c

📁 基于51的步进电机控制器,含有人机结口程序,软硬件测试都已通过.是不错的参考代码.
💻 C
字号:
#include "Step.h"
#include"viic_c51.h"
#include"zlg7290.h"
//--------------------------------变量定义-------------------------------------------
/*sbit KEY_INT=P3^2;                        //将p3.2外部中断0
unsigned int FLAG=0;                    //数码管闪烁标志位
unsigned int FLAG1=0;                   //显示切换标志位 1---速度,0---坐标
unsigned int FLAG2=0;                   //电机正反转切换标志位 1---正转,0---反转
unsigned char KEY;                     //键值
unsigned int circle=1;                  //坐标单位1的步进圈数
int Fm=0;                               //加工点偏差
unsigned int Xe=0;                      //终点横坐标
unsigned int Ye=0;                      //终点纵坐标
unsigned int Nxy=0;                     //总步数
unsigned int Xi=0;                      //实时横坐标
unsigned int Yi=0;                      //实时纵坐标
unsigned int SpeedX=0;                  //X电机速度(步/秒)
unsigned int SpeedY=0;                  //Y电机速度(步/秒)
//unsigned int time0_tmp=0xe880;          //2ms定时显示初值
//unsigned int time1_tmp=0;               //速度控制定时初值
//unsigned int fosc=12;                   //单片机晶振(MHz)
unsigned char Speed[8]={0,0,0,0,0,0,0,0}; //两个4位数码管数值(速度)
unsigned char Place[8]={0,0,0,0,0,0,0,0}; //两个4位数码管数值(坐标)
unsigned char StepX1[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};//X步进电机正转节拍
unsigned char StepY1[]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};//Y步进电机反转节拍
unsigned char StepX2[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//X步进电机正转节拍
unsigned char StepY2[]={0x90,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};//Y步进电机反转节拍
//unsigned char Led_code[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x89,0x86};//数码管0—9,H,E
//unsigned char Led_code[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x79};//数码管0—9,A,E

//--------------------------------函数声明-------------------------------------------
//void System_init(void);                 //设定INT0的工作方式,供主程序调用
void delay(unsigned int);               //延时程序
void delay10ms(unsigned int);
//void INT0_int(void);                    //外部中断0处理程序
//void time0_int(void);                   //定时器0中断
//void time1_int(void);                   //定时器1定时
//void Key_Scaning(void);                 //扫描键盘
//void dispxy(unsigned int,unsigned int,unsigned int);//数码管显示子程序
//void display(void);                     //数码管显示
void Key_Control(void);                 //键盘控制
void Go_line(void);                     //直线差补算法---前进
void Back_line(void);                   //直线差补算法---回零	 */
//-----------------------------------------------------------------------------------
main()
{
   
   while(1)
   {
      Key_Control();                    //键盘控制
   }
}

//-----------------------------------------------------------------------------------
void delay(unsigned int i)
{
   for(;i>0;i--);
}

void delay10ms(unsigned int i)			//延时程序????10ms有问题?????
{
   unsigned int j;
   for(;i>0;i--)
      for(j=0;j<1000;j++);
}
//------------------------------------------------------------------------------------
// 函数名称:Key_Control()
// 函数功能:键盘控制
//------------------------------------------------------------------------------------
void Key_Control(void)
{
   unsigned char i;
   while(1)
   {
	  if(KEY_INT==0)
	  {
	     KEY=ZLG7290_GetKey();
		 delay(200);
      	if(KEY==1)
      	  {
        	KEY=0;                            //清键值    
	    	 for(i=0;i<8;i++)
	    	 {
	     	 	Speed[i]=0;
	      	  }
	     	for(i=0;i<8;i++)
	     	   {
	   		 	Place[i]=0;
	 	 		}
	 		 ZLG7290_SendBuf(Place,8);
	  			delay10ms(1);
      		//Led1[0]=0;Led1[1]=0;Led1[2]=0;Led1[3]=0;Led1[4]=0;Led1[5]=0;Led1[6]=0;Led1[7]=0;
     		// Led2[0]=0;Led2[1]=0;Led2[2]=0;Led2[3]=0;Led2[4]=0;Led2[5]=0;Led2[6]=0;Led2[7]=0;
      		Go_line();                        //前进
   		   }
 	 	else if(KEY==2)
  			{
     		 	KEY=0;                            //清键值
      			FLAG1=0;                          //显示切换标志位0(显示坐标)
      			Back_line();                      //回零
   			}
   		else if(KEY==3)
   			{
      			//FLAG1=1;                          //显示切换标志位1(显示速度)
      			Speed[0]=SpeedX%10;Speed[1]=(SpeedX%100)/10;Speed[2]=SpeedX/100;Speed[3]=10;//显示当前速度
      			Speed[4]=SpeedY%10;Speed[5]=(SpeedY%100)/10;Speed[6]=SpeedY/100;Speed[7]=10;
	  			ZLG7290_SendBuf(Speed,8);
	  			delay10ms(1);
      			while(1)
      			{
         			KEY=0;                         //清键值
         			FLAG=1;                        //数码管闪烁标志位1(第1位闪烁)
         			if(KEY==5)
         			{
            			KEY=0;                      //清键值
            			Speed[0]+=1;
            			while(Speed[0]>9)
            			Speed[0]=0;
         			}
         			else if(KEY==3)
         			break;
      			}
      			while(1)
      			{
        			 KEY=0;                         //清键值
         			FLAG=2;                        //数码管闪烁标志位2(第2位闪烁)
         			if(KEY==5)
         			{
            			KEY=0;                      //清键值
            			Speed[1]+=1;
            			while(Speed[1]>9)
            			Speed[1]=0;
         			}
         			else if(KEY==3)
         			break;
      			}
      		   while(1)
      			{
        			 KEY=0;                         //清键值
        			 FLAG=3;                        //数码管闪烁标志位3(第3位闪烁)
        			 if(KEY==5)
        			 {
          				  KEY=0;                      //清键值
            			Speed[2]+=1;
           				 while(Speed[2]>9)
            			Speed[2]=0;
         			}
         			else if(KEY==3)
        			 break;
      			}
      			while(1)
      			{	
         				KEY=0;                         //清键值
       				  	FLAG=5;                        //数码管闪烁标志位5(第5位闪烁)
         				if(KEY==5)
         				{
            				KEY=0;                      //清键值
            				Speed[4]+=1;
            				while(Speed[4]>9)
           					 Speed[4]=0;
         				}
         				else if(KEY==3)
         				break;
      			}
      			while(1)
      			{
        				 KEY=0;                         //清键值
         				FLAG=6;                        //数码管闪烁标志位6(第6位闪烁)
         				if(KEY==5)
         				{
            				KEY=0;                      //清键值
            				Speed[5]+=1;
            				while(Speed[5]>9)
            				Speed[5]=0;
         				}
         				else if(KEY==3)
         				break;
      			}
      			while(1)
      			{
         			KEY=0;                         //清键值
         			FLAG=7;                        //数码管闪烁标志位7(第7位闪烁)
         			if(KEY==5)
         			{
            			KEY=0;                      //清键值
           				Speed[6]+=1;
           				while(Speed[6]>9)
            				Speed[6]=0;
         			}
         			else if(KEY==3)
         			break;
      			}
      			KEY=0;                            //清键值
     			// FLAG=0;                           //数码管闪烁标志位0(无闪烁)
      			SpeedX=Speed[0]+Speed[1]*10+Speed[2]*100;//计算并存储所设速度
      			SpeedY=Speed[4]+Speed[5]*10+Speed[6]*100;
   			}
   		else if(KEY==4)
   			{
      			Place[0]=Xe%10;Place[1]=Xe/10;Place[2]=11;Place[3]=11;//显示当前坐标
      			Place[4]=Ye%10;Place[5]=Ye/10;Place[6]=11;Place[7]=11;
      			ZLG7290_SendBuf(Place,8);
	  			delay10ms(1);
      			while(1)
      			{
        			 KEY=0;                         //清键值
         			FLAG=1;                        //数码管闪烁标志位1(第1位闪烁)
         			if(KEY==6)
         			{
           				 KEY=0;                      //清键值
            			Place[0]+=1;
            			while(Place[0]>9)
            Place[0]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=2;                        //数码管闪烁标志位2(第2位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Place[1]+=1;
            while(Place[1]>9)
            Place[1]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=5;                        //数码管闪烁标志位5(第5位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Place[4]+=1;
            while(Place[4]>9)
            Place[4]=0;
         }
         else if(KEY==4)
         break;
      }
      while(1)
      {
         KEY=0;                         //清键值
         FLAG=6;                        //数码管闪烁标志位6(第6位闪烁)
         if(KEY==6)
         {
            KEY=0;                      //清键值
            Place[5]+=1;
            while(Place[5]>9)
            Place[5]=0;
         }
         else if(KEY==4)
         break;
      }
      KEY=0;                            //清键值
      FLAG=0;                           //数码管闪烁标志位0(无闪烁)
      Xe=Place[1]*10+Place[0];//Led2[3]*1000+Led2[2]*100+Led2[1]*10+Led2[0];//计算并存储所设坐标
      Ye=Place[5]*10+Place[4];//Led2[7]*1000+Led2[6]*100+Led2[5]*10+Led2[4];
   }
   while(KEY==7)                        //电机X单独运行
   {
      Speed[4]=0;Speed[5]=0;Speed[6]=0;Speed[7]=0;
      Speed[0]=SpeedX%10;Speed[1]=(SpeedX%100)/10;Speed[2]=SpeedX/100;Speed[3]=10;//显示X电机速度
	  ZLG7290_SendBuf(Speed,8);
	  delay10ms(1);
      for(i=0;i<8;i++)
      {
         P1=StepX1[i];
//         time1_int(Tx);
         delay10ms(6000/SpeedX);
      }
   }
   while(KEY==8)                        //电机Y单独运行
   {      
      Speed[4]=0;Speed[5]=0;Speed[6]=0;Speed[7]=0;
      Speed[0]=SpeedY%10;Speed[1]=(SpeedY%100)/10;Speed[2]=SpeedY/100;Speed[3]=10;//显示X电机速度
	  ZLG7290_SendBuf(Speed,8);
	  delay10ms(1);
      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(正转)
      Place[3]=Xi/1000;Place[2]=(Xi%1000)/100;Place[1]=(Xi%100)/10;Place[0]=Xi%10;//显示当前坐标
      Place[7]=Yi/1000;Place[6]=(Yi%1000)/100;Place[5]=(Yi%100)/10;Place[4]=Yi%10;
	  ZLG7290_SendBuf(Place,8);
	  delay10ms(1);
   }
}
//------------------------------------------------------------------------------------
// 函数名称: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(反转)
      Place[3]=Xi/1000;Place[2]=(Xi%1000)/100;Place[1]=(Xi%100)/10;Place[0]=Xi%10;//显示当前坐标
      Place[7]=Yi/1000;Place[6]=(Yi%1000)/100;Place[5]=(Yi%100)/10;Place[4]=Yi%10;
	  ZLG7290_SendBuf(Place,8);
	  delay10ms(1);
   }
}
//------------------------------------------------------------------------------------

⌨️ 快捷键说明

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