找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4804|回复: 0
打印 上一主题 下一主题
收起左侧

单片机步进电机直线插补程序

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


直线插补程序
//****************************************
//假设步进电机的步距角=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);
      }
   }
}  


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表