找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 5091|回復: 0
打印 上一主題 下一主題
收起左側

單片機步進電機直線插補程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:501617 發(fā)表于 2019-3-31 11:38 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
電路原理圖如下:


直線插補程序
//****************************************
//假設步進電機的步距角=90
//假設滾珠絲杠與步進電機直聯(lián),導程=4mm
//****************************************

#include<reg51.h>  
#include<intrins.h>  //包含_nop_()函數(shù)定義的頭文件
#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;     //偏差函數(shù)
char x=13;     //X軸的終點坐標
char y=16;     //Y軸的終點坐標
uint NT=0;     //總步數(shù)
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;                 //根據(jù)規(guī)定,RS和R/W同時為低電平時,可以寫入指令
   RW=0;  
    E=0;                  //E置低電平(寫指令時,E為高脈沖),就是讓E從0到1發(fā)生正跳變,所以應先置"0"
    P0=dictate;            //將數(shù)據(jù)送入P0口,即寫入指令或地址
    delay(1);
    E=1;                   //E置高電平
        //_nop_();
        //_nop_();
        //_nop_();
        //_nop_();         //空操作四個機器周期,給硬件反應時間
     E=0;                  //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
}

//*********************寫數(shù)據(jù)
void WriteData(uchar dat)
{
      RS=1;          //RS為高電平,RW為低電平時,可以寫入數(shù)據(jù)
      RW=0;
      E=0;           //(寫指令時,E為高脈沖, 就是讓E從0到1發(fā)生正跳變,所以應先置"0"
      P0=dat;        //將數(shù)據(jù)送入P0口,即將數(shù)據(jù)寫入液晶模塊
      delay(1);
      E=1;           //E置高電平
      E=0;           //當E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
}

//*******************初始化
void Init(void)
{
WriteInstruction(0x38);    //顯示模式設置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口/111000
  WriteInstruction(0x0c);    //顯示模式設置:顯示開,無光標/1100
  WriteInstruction(0x06);    //顯示模式設置:光標右移,字符不移/110
  WriteInstruction(0x01);   //清屏幕指令,將以前的顯示內(nèi)容清除/1
}

//偏差函數(shù)F>=0,F(xiàn)=F-y;  F<0, F=F+x
//*******************主函數(shù)
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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表