<acronym id="xonnx"></acronym>
      <td id="xonnx"></td>
    1. <pre id="xonnx"></pre>

      1. 專注電子技術學習與研究
        當前位置:單片機教程網 >> 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热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮