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

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

        單片機串口通信控制步進電機

        作者:寒竹子   來源:本站原創   點擊數:  更新時間:2014年03月20日   【字體:

        這是一個來自單片機開發板的源程序,原理圖的下載地址: http://www.thefapper.com/f/ks51.pdf 

        下面是源代碼:
        /**
          *************************************************************************************************
          * @file     main.c
          * @author   xr
          * @date     2014年3月18日20:00:03
          * @note     步進電機的參數:減速比:1:64  步進角:5.625/64  啟動頻率:>=550  啟動時間最。1.08ms
          * @brief    串口通信控制步進電機     單片機STC89C52RC MCU  晶振 11.0592MHZ
          *************************************************************************************************
          */
         
        #include <reg52.h>

        typedef unsigned int uint;
        typedef unsigned char uchar;
        typedef unsigned long ulong;

        //步進電機八拍模式相值編碼 A-AB-B-BC-C-CD-D-DA
        uchar code table[] = {
        0xE, 0xC, 0xD, 0x9, 0xB, 0x3, 0x7, 0x6
        };
        uint tmp = 0;
        bit dir = 0;
        ulong beats = 0;//拍數
        uchar angle = 0;//圈數

        void timer0_Config();
        void motor_Config(ulong angle);
        void Uart_Config(uint baud);

        void main()
        {
        timer0_Config();//啟動時間設定為2ms
        Uart_Config(9600);
        while (1)
        {
        switch (angle)
        {
        case 2:
        {
        motor_Config(2*360);
        angle = 0;
        break;
        }
        case 3:
        {
        motor_Config(3*360);
        angle = 0;
        break;
        }
        case 4:
        {
        motor_Config(4*360);
        angle = 0;
        break;
        }
        case 5:
        {
        motor_Config(5*360);
        angle = 0;
        break;
        }
        case 6:
        {
        motor_Config(6*360);
        angle = 0;
        break;
        }
        case 7:
        {
        motor_Config(7*360);
        angle = 0;
        break;
        }
        case 8:
        {
        motor_Config(8*360);
        angle = 0;
        break;
        }
        case 9:
        {
        P1 |= 0x0F;
        beats = 0;
        angle = 0;
        break;
        }
        default:
        break;
        }
        }
        }

        /**
          * @brief    步進電機配置(根據輸出軸轉的圈數來確定轉子的拍數beats)
          * @param    無
          * @retval   無
          */
        void motor_Config(ulong angle)
        {
        //在計算之前先關閉中斷
        EA = 0;
        beats = (angle*64*8*8)/360;
        EA = 1;
        }

        /**
          * @brief    定時器T0定時配置
          * @param    uint xms
          * @retval   無
          */
        void timer0_Config()
        {
        TMOD &= 0xF0;//清零T0控制位
        TMOD |= 0x01;//T1方式1
        TH0 = 0xF8;
        TL0 = 0xCC;//2ms
        TR0 = 1;
        ET0 = 1;
        EA  = 1;
        }

        /**
          * @brief    串口通信配置
          * @param    無
          * @retval   無
          */
        void Uart_Config(uint baud)
        {
        SCON |= 0x50;//SM0-SM2 REN TB8 RB8 TI RI
        TMOD &= 0x0F;//清零T1控制位
        TMOD |= 0x20;//設定定時器T1八位自動重裝模式,計數設定串口波特率
        TH1 = 256-(11059200/12/32/baud);//波特率 = 2^SMOD/32 * T1(溢出率) T1(溢出率) = 1/[(256-X)*(12/11059200)]
        TL1 = TH1;
        TR1 = 1;
        ET1 = 0;//關閉T1的定時中斷
        ES = 1;//打開串口中斷
        EA = 1;//開總中斷
        }

        /**
          * @brief    T0中斷服務子程序
          * @param    無
          * @retval   無
          */
        void timer0_Int() interrupt 1 using 3
        {
        static uchar step = 0;
        uchar buf = 0;//存放相值
        TH0 = 0xF8;
        TL0 = 0xCC;
        if (beats)
        {
        if (!dir)
        {
        buf = (P1 & 0xF0);//buf暫存P1的高字節,清零低字節
        buf |= table[step++];//將相值存入buf
        step &= 0x07;//與方式實現到8歸零
        P1 = buf;
        beats--;
        }
        else
        {
        buf = (P1 & 0xF0);
        buf |= table[step--];
        if (step <= 0)
        {
        step = 7;
        }
        P1 = buf;
        beats--;
        }
        }
        else
        {
        P1 |= 0x0F;//關閉所有的相,即步進電機停止轉動
        }
        }

        /**
          * @brief    串口中斷服務子程序
          * @param    無
          * @retval   無
          */
        void Uart_Int() interrupt 4 using 0
        {
        if (RI)
        {
        RI = 0;
        if (SBUF > 1)
        {
        angle = SBUF;
        }
        else
        {
        dir = SBUF;
        }
        }
        }

        關閉窗口

        相關文章

        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮