新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機串口通信控制步進電機

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

        作者: 時間:2016-12-02 來源:網絡 收藏

        /**
        * @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;
        }
        }
        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 都江堰市| 枣强县| 八宿县| 客服| 孟州市| 师宗县| 淮安市| 保亭| 临海市| 广饶县| 铜陵市| 余庆县| 云阳县| 广元市| 六枝特区| 丹寨县| 龙山县| 荥阳市| 松原市| 乐安县| 平邑县| 阳城县| 阳春市| 东丽区| 图木舒克市| 阿克苏市| 贺州市| 武清区| 会同县| 闻喜县| 清丰县| 沙湾县| 安徽省| 曲水县| 屯昌县| 从化市| 巫山县| 柳州市| 隆昌县| 南开区| 黔南|