標(biāo)題: 單片機(jī)步進(jìn)電機(jī)直線插補(bǔ)程序 [打印本頁]

作者: yly803    時間: 2019-3-31 11:38
標(biāo)題: 單片機(jī)步進(jìn)電機(jī)直線插補(bǔ)程序
電路原理圖如下:


直線插補(bǔ)程序
//****************************************
//假設(shè)步進(jìn)電機(jī)的步距角=90
//假設(shè)滾珠絲杠與步進(jìn)電機(jī)直聯(lián),導(dǎo)程=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軸的終點坐標(biāo)
char y=16;     //Y軸的終點坐標(biāo)
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ā)生正跳變,所以應(yīng)先置"0"
    P0=dictate;            //將數(shù)據(jù)送入P0口,即寫入指令或地址
    delay(1);
    E=1;                   //E置高電平
        //_nop_();
        //_nop_();
        //_nop_();
        //_nop_();         //空操作四個機(jī)器周期,給硬件反應(yīng)時間
     E=0;                  //當(dāng)E由高電平跳變成低電平時,液晶模塊開始執(zhí)行命令
}

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

//*******************初始化
void Init(void)
{
WriteInstruction(0x38);    //顯示模式設(shè)置:16×2顯示,5×7點陣,8位數(shù)據(jù)接口/111000
  WriteInstruction(0x0c);    //顯示模式設(shè)置:顯示開,無光標(biāo)/1100
  WriteInstruction(0x06);    //顯示模式設(shè)置:光標(biāo)右移,字符不移/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);       // 設(shè)置顯示位置為第一行的第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); // 設(shè)置顯示位置為第二行的第1個字
         while(a<11)
         {      
           WriteData(string2[a]);
           a++;
         }   
             WriteData(yy/10+0x30);
       WriteData(yy%10+0x30);
      }
   }
}  







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1