久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

單片機控制步進電機程序+視頻

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年04月08日   【字體:
完善二
 
 

源程序:
 


/*-----------------------------------------------------------------------------
 工作板源程序
-----------------------------------------------------------------------------*/  

#include <REG52.H> //各個特殊功能寄存器地址定義
#include <intrins.h>

 

/*-----------------------------------------------------------------------------
  用于串行輸入SPI的數據接收口
-----------------------------------------------------------------------------*/  
volatile  unsigned int  data zd0; //功能1的時候調整蜂鳴器時間
volatile  unsigned char data SPI_DH,SPI_DL;//串行口高位和低位高位用于識別功能指令和地址指令,低位用于數據傳輸 
volatile  unsigned char data  SPI_ZL,SPI_DZ,SPI_SJ;
volatileunsigned   int data  m,z;
 /*-----------------------------------------------------------------------------
 三變量用于默認的速度,寬度,高度。
-----------------------------------------------------------------------------*/ 
volatile  unsigned char data b=100;    //單位是rpm/min
volatile unsigned char data  BBZ;
 volatile  unsigned char data c=1;          //       寬度單位是毫米
volatile unsigned char data  CBZ;
 volatile  unsigned char data d=4;              //         高度單位是毫米
volatile unsigned char data  DBZ;
 /*-----------------------------------------------------------------------------
 三變量用于速度,寬度,高度的翻譯中間變量
-----------------------------------------------------------------------------*/ 
 unsigned char data  e;//  用于速度
 unsigned char data  f; //用于寬度
 unsigned  char data g;//用高度
 
 
 
/*-------------------------------------------------------------
P0引腳定義: P0口有5種定義,每種定義根據P2口給定功能不同而不同。
每種功能不能同時實現,否則會出現混亂。

-------------------------------------------------------------*/
  
sbitCLK1=P0^0;       //步進電機1脈沖
sbit CW1    =P0^1; //步進電機1方向
sbitEW1=P0^2; //步進電機1使能
sbitCLK2    =P0^3; //步進電機2脈沖
sbitCW2    =P0^4;      //步進電機2方向
sbitEW2    =P0^5;      //步進電機2使能
sbitEN1    =P0^6;      //角度電機使能
sbitIN1    =P0^7;    //角度電機脈沖

 /*-------------------------------------------------------------
P1引腳定義 :P1口為限位檢測口。

-------------------------------------------------------------*/
sbit LED_SD    =P1^0;

sbit    LED_KD    =P1^2;
sbit    LED_GD=P1^3;
sbit    LED_YX=P1^4;
sbit    LED_FW=P1^5;
sbit    CLK        =P1^6;      //角度限位右  。當高電平表示有限位
sbitDATAS    =P1^7;      //角度電機輸入2

 /*-------------------------------------------------------------
 P2引腳定義 :
-------------------------------------------------------------*/
sbit    VSW     = P2^0;
 sbit    FXXWZ   = P2^1;
sbitFXXWY=P2^2;  //  驅動控制,=0該為Q=D.=1時為高阻態。
sbitZXWX=P2^3;  //鍵盤控制,該位=0時為跟隨變化Q=D,=1時為高阻態。
sbitZXWS=P2^4; //指示燈LED控制該位=0時為保持,=1時為數據Q=D
sbit    XXWZ=P2^5; //數碼管個位控制該位=0時為保持,=1時為數據Q=D
    
sbit XXWY=P2^6; //數碼管十位控制該位=0時為保持,=1時為數據Q=D 


sbitIN2    =P2^7;  //角度電機脈沖
 
 


 /*-------------------------------------------------------------
  P3引腳定義:P3口為主軸電機調速端口和
  主軸編碼方向編碼,還有鍵盤中斷。
-------------------------------------------------------------*/

sbit    STB_IO  =P3^2 ;
sbit    JT      =P3^3 ;
sbitZZZD=P3^4;
sbitFXMC=P3^5;
sbitPOWSW=P3^7;

 

 
/*-----------------------------------------------------------------------------
函數功能 : MS 毫秒 延遲函數
-----------------------------------------------------------------------------*/
void Delay(unsigned int i)
{
unsigned int j;
for(i;i>0;i--)
{
for(j=0;j<125;j++)
{;}
}
}


 unsigned char code table[]=
{
  0x3f,0x06,0x5b,0x4f,0x66,
  0x6d,0x7d,0x07,0x7f,0x6f,
  0x77,0x7c,0x39,0x5e,0x79,
  0x71,0x00,0x40,0x00
};
 

 

/*-----------------------------------------------------------------------------
函數功能 : us 微秒 延遲函數
-----------------------------------------------------------------------------*/
void MyDelay(unsigned int time)
{
while(time--)
{
_nop_();
}
}

/*-----------------------------------------------------------------------------
函數功能 : us 微秒 精確US延遲 12MHZ延遲6us
-----------------------------------------------------------------------------*/
   void MyDelay2()
                 {
         _nop_();
                 }
 

 


  /*-----------------------------------------------------------------------------

函數功能 :X軸電機驅動脈沖

-----------------------------------------------------------------------------*/
  void XZDJQD()
   {
  CLK1=0;
  MyDelay2();
  CLK1=1;
       Delay(1);
  
}

   /*-----------------------------------------------------------------------------
函數功能 :Z軸電機驅動脈沖

-----------------------------------------------------------------------------*/
   void ZZDJQD()
   {
  CLK2=0;
  MyDelay2();
  CLK2=1;
  Delay(1);
  
}
  /*-----------------------------------------------------------------------------
函數功能 :機構復位程序 復位x軸z軸以及角度軸。
-----------------------------------------------------------------------------*/
  void jgfw ( )
  {
 
unsigned int g=0; //中點計數中間變量
EX0=0;//關閉鍵盤中斷等待復位完成。
EW1=0; 
CW1=1; 
while(XXWZ==0)
     {   
      CW1=1;
      XZDJQD(); 
     }
CW1=0; 
while (XXWY==0)
      {
       CW1=0;
   XZDJQD();
    g=g+1;
      }
g=g/2;
CW1=1;
while (g>0)
      {
  CW1=1;
  XZDJQD();
      g=g-1;
      }
P2=0XF0;
EX0=1;
 }


  /*-----------------------------------------------------------------------------
函數功能 :運行狀態中X軸和Z軸角度軸的控制。
-----------------------------------------------------------------------------*/
  void YXQD ( )
  { 
 f=c*20; 
 while(f>0)
      { 
     XZDJQD();
   f=f-1;
   if(XXWZ==1)CW1=0;
   if(XXWY==1)CW1=1;
   if(XXWZ==1||XXWY==1)
     {
  g=d*5;
  while(g>0)
       {
       ZZDJQD();
       g=g-1;
       }

      }


       }

 
 
 }

 

 
  
 
 
   /*-----------------------------------------------------------------------------
函數功能 :運行狀態電機參數送出(串行方式)

-----------------------------------------------------------------------------*/

 void Control(unsigned char cmd)
{
unsigned char i;
STB_IO = 0;//拉低片選
Delay(20);
for(i=0;i<8;i++)

CLK = 0;
//這里大約是100us
if(cmd & 0x80)DATAS = 1;//把datas的參數與16進制數8000進行位與運算把結果給datas(如果有數則DAT=1
else DATAS = 0;//否則DAT=0
MyDelay(200) ;
CLK = 1;
MyDelay(200) ;//這里大約是100us
cmd <<= 1;
}
DATAS = 1;
STB_IO = 1;
CLK = 1;
}

 

 

 

 

/*-----------------------------------------------------------------------------
函數功能 : 主函數
-----------------------------------------------------------------------------*/
void main(void)
{  
      unsigned char YSJS=5 ;
   
      EX0=1;//開中斷0
 EA=1; //開總中斷
 IT0=1; //設定中斷0方式為下降沿觸發。
      while (1)
       {

        if   (SPI_ZL==0)   {POWSW=1;LED_SD=1;LED_KD=1;LED_GD=1;LED_YX=1;LED_FW=1;}       //  關閉電源狀態
        while(SPI_ZL==0){;  }

        if   (SPI_ZL==1){VSW=0; POWSW=0;}                                                                  //啟動電源的狀態。  
        while(SPI_ZL==1)   {LED_SD=~LED_SD;LED_KD=~LED_KD;LED_GD=~LED_GD;LED_YX=~LED_YX;LED_FW=~LED_FW;Delay(300); }
 
        if   (SPI_ZL==2){  LED_SD=1;LED_KD=1;LED_GD=1;LED_YX=1;LED_FW=0;                      }   //復位狀態
        while(SPI_ZL==2){;}                         
        if   (SPI_ZL==3){    LED_SD=0;LED_KD=1;LED_GD=1;LED_YX=0;LED_FW=1; VSW=1; POWSW=0;                             }       //運行狀態
        while(SPI_ZL==3)
             {
             
    if(BBZ!=b)
                {
 LED_SD=1;
 LED_KD=1;
 LED_GD=1;
                 while(--YSJS){LED_SD=~LED_SD;Delay(100);}
 LED_SD=0 ;
                 BBZ=b;
YSJS=5 ;
                }
    if(CBZ!=c)
    {
 LED_SD=1;
 LED_KD=1;
 LED_GD=1;
  while(--YSJS){LED_KD=~LED_KD;Delay(100);}
 LED_KD=0;
     CBZ=c;
   YSJS=5 ;
    }
  if(DBZ!=d)
    {
   LED_SD=1;
 LED_KD=1;
 LED_GD=1;
while(--YSJS){LED_GD=~LED_GD;Delay(100);}
LED_GD=0;
     DBZ=d;
   YSJS=5 ;
    }
 
 
              }  
  if   (SPI_ZL==4)                                                                       //暫停狀態
    { 
     LED_SD=0;LED_KD=1;LED_GD=1;LED_YX=0;LED_FW=1; POWSW=1;                     
}
        while (SPI_ZL==4)                                                                               //參數調整
              {
    if(BBZ!=b)
                {
 LED_SD=1;
 LED_KD=1;
 LED_GD=1;
                 while(--YSJS){LED_SD=~LED_SD;Delay(100);}
 LED_SD=0 ;
                 BBZ=b;
YSJS=5 ;
                }
    if(CBZ!=c)
    {
 LED_SD=1;
 LED_KD=1;
 LED_GD=1;
  while(--YSJS){LED_KD=~LED_KD;Delay(100);}
 LED_KD=0;
     CBZ=c;
   YSJS=5 ;
    }
  if(DBZ!=d)
    {
   LED_SD=1;
 LED_KD=1;
 LED_GD=1;
while(--YSJS){LED_GD=~LED_GD;Delay(100);}
LED_GD=0;
     DBZ=d;
   YSJS=5 ;
    }
 LED_YX=~LED_YX;
 Delay(100);   
                }  
       
        }     

 }
  /*-----------------------------------------------------------------------------
函數功能 : 串行中斷接收

-----------------------------------------------------------------------------*/
 void SPI_IO(void) interrupt 0

{  

     IE0=0;
m=0; 
  if(STB_IO==0)
{   
 for(m=0;m<16;m++)
 { 
   while(CLK==1){;} 
   if(CLK==0)
     {
   _nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
       if(DATAS==1){ z|=1;}
else{ z|=0;}   
     }
zd0=z;
  z=z<<1;

 
   while(CLK==0){;}
  }
 
 SPI_DL=zd0;
zd0>>=8;
SPI_DH=zd0;
if(SPI_DH==0)
   { 
SPI_ZL  =   SPI_DL; 
}
 if(SPI_DH==0xf1)
  {
   c       =   SPI_DL;
   }
if(SPI_DH==0xf0)
 {
  b       =   SPI_DL;
  }
 
if(SPI_DH==0xf2)
  {
  d       =   SPI_DL;
  }
 
}
   IE0=0;
}

 

關閉窗口

相關文章

主站蜘蛛池模板: 国产免费一区二区三区 | 国产精品久久久久永久免费观看 | 99久久成人 | 日本a视频 | 日韩亚洲视频 | aaaaaa大片免费看最大的 | 97人澡人人添人人爽欧美 | 亚洲视频在线观看 | 精品一区二区在线视频 | 国产亚洲欧美另类一区二区三区 | 91影院在线观看 | 色悠悠久 | 国产精品我不卡 | 性一交一乱一透一a级 | 国产伦精品一区二区三毛 | 亚洲视频自拍 | 欧美二三区 | 在线看亚洲| 97伦理 | 午夜在线观看视频 | 亚洲国产精品一区 | 日本成人区| 天天操夜夜操免费视频 | 国产精品久久久亚洲 | 成人在线播放网站 | 免费观看www7722午夜电影 | 欧美一区免费 | 一区二区不卡视频 | 国产精品综合网 | 欧美一级二级视频 | 欧美中文字幕 | 亚洲va欧美va天堂v国产综合 | 国产高清精品一区二区三区 | 欧美v片 | 欧美区日韩区 | 国产精品一区视频 | 草比av | 亚洲精品在线免费播放 | 91麻豆产精品久久久久久 | 久久国产日韩 | 亚洲精品一区二三区不卡 |