标题: 单片机步进电机直线插补程序 [打印本页]

作者: yly803    时间: 2019-3-31 11:38
标题: 单片机步进电机直线插补程序
电路原理图如下:


直线插补程序
//****************************************
//假设步进电机的步距角=90
//假设滚珠丝杠与步进电机直联,导程=4mm
//****************************************

#include<reg51.h>  
#include<intrins.h>  //包含_nop_()函数定义的头文件
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^5;    //寄存器选择位
sbit RW=P2^6;    //读写选择位
sbit E=P2^7;     //使能信号位
sbit M1=P1^0;
sbit M2=P1^1;
sbit M3=P1^2;
sbit M4=P1^3;
sbit M5=P1^4;
sbit M6=P1^5;
sbit M7=P1^6;
sbit M8=P1^7;
char b=-1;
char by=-1;
char F=0;     //偏差函数
char x=13;     //X轴的终点坐标
char y=16;     //Y轴的终点坐标
uint NT=0;     //总步数
uint N=0;
uchar string1[ ]={"X-Position="};
uchar string2[ ]={"Y-Position="};
//延时
void DelayMS(uint dm)
{
uchar i;
while(dm--)
{
  for(i=0;i<120;i++);

}
}
void delay(uchar d)
{
    uchar i,j;
    for(i=d;i>0;i--);
    for(j=120;j>0;j--);
}

//********************写指令
void WriteInstruction(uchar dictate)
{  
  RS=0;                 //根据规定,RS和R/W同时为低电平时,可以写入指令
   RW=0;  
    E=0;                  //E置低电平(写指令时,E为高脉冲),就是让E从0到1发生正跳变,所以应先置"0"
    P0=dictate;            //将数据送入P0口,即写入指令或地址
    delay(1);
    E=1;                   //E置高电平
        //_nop_();
        //_nop_();
        //_nop_();
        //_nop_();         //空操作四个机器周期,给硬件反应时间
     E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
}

//*********************写数据
void WriteData(uchar dat)
{
      RS=1;          //RS为高电平,RW为低电平时,可以写入数据
      RW=0;
      E=0;           //(写指令时,E为高脉冲, 就是让E从0到1发生正跳变,所以应先置"0"
      P0=dat;        //将数据送入P0口,即将数据写入液晶模块
      delay(1);
      E=1;           //E置高电平
      E=0;           //当E由高电平跳变成低电平时,液晶模块开始执行命令
}

//*******************初始化
void Init(void)
{
WriteInstruction(0x38);    //显示模式设置:16×2显示,5×7点阵,8位数据接口/111000
  WriteInstruction(0x0c);    //显示模式设置:显示开,无光标/1100
  WriteInstruction(0x06);    //显示模式设置:光标右移,字符不移/110
  WriteInstruction(0x01);   //清屏幕指令,将以前的显示内容清除/1
}

//偏差函数F>=0,F=F-y;  F<0, F=F+x
//*******************主函数
void XAXIS(void)
{if (b<4)
     { b=b+1;
          switch (b)
         {
         case 0:
             M1=1;
                DelayMS(360);
             M1=0;
             M2=1;
     break;
             case 1:
           M2=1;
                 DelayMS(360);
       M2=0;
           M3=1;
     break;
            case 2:
              M3=1;
                 DelayMS(360);
           M3=0;
           M4=1;
     break;
            case 3:
             M4=1;
                DelayMS(360);
       M4=0;
          M1=1;
    b=-1;
     break;
        }
    }
}

void YAXIS(void)
{if (by<4)
     {  by=by+1;
       switch (by)
         {
         case 0:
             M5=1;
                DelayMS(360);
             M5=0;
             M6=1;
        break;
             case 1:
           M6=1;
                 DelayMS(360);
       M6=0;
           M7=1;
     break;
          case 2:
              M7=1;
                 DelayMS(360);
           M7=0;
           M8=1;
     break;
           case 3:
             M8=1;
                DelayMS(360);
       M8=0;
          M5=1;
    by=-1;
     break;
        }
   }
}

void main(void)         
{
  uchar a;
  char xx=0;
  char yy=0;
  NT=x+y;
  Init();
  while(N<NT)
  {
    if (F>=0)
      {N=N+1;
   F=F-y;
   xx=xx+1;
   XAXIS();
       a=0;
         WriteInstruction(0x80);       // 设置显示位置为第一行的第1个字
         while(a<11)  
         {      
           WriteData(string1[a]);
           a++;
         }
            WriteData(xx/10%10+0x30);
   WriteData(xx%10+0x30);
      }
   if (F<0)
      {N=N+1;
   F=F+x;
   yy=yy+1;
   YAXIS();  
         a=0;
         WriteInstruction(0x80+0x40); // 设置显示位置为第二行的第1个字
         while(a<11)
         {      
           WriteData(string2[a]);
           a++;
         }   
             WriteData(yy/10+0x30);
       WriteData(yy%10+0x30);
      }
   }
}  







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1