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

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

        51單片機PWM-呼吸燈源程序

        作者:未知   來源:不詳   點擊數:  更新時間:2014年06月29日   【字體:

         /**

         
        ****************************************************************
         
        * @file : main.c
         
        * @xu ran
        * @date : 2014年5月23日20:55:19 - 2014年5月23日22:32:12
         
        * @version : V2.0
         
        * @brief : PWM脈沖寬度調制技術 實現呼吸燈
         
        ****************************************************************
         
        * @attention
         
        * 實驗平臺 : 51hei開發板
         
        * 單片機 : STC89C52RC MCU 晶振 : 11.0592 MHZ
         
        ****************************************************************
         
        */
         
         
         
        #include //使用STC89C52庫
         
         
         
        /* 三八譯碼器74HC138 */
         
        sbit ADDR3 = P1^3;
         
        sbit ENLED = P1^4;
         
         
         
        sbit PWMOUT = P0^0; //LED0
         
         
         
        /* PWM占空比 */
         
        unsigned char code pwmTable[] = {
         
        3, 5, 8, 11, 13, 16, 21, 24, 27, 30, 33, 36, 40, 45, 49,
         
        53, 55, 57, 61, 65, 67, 69, 72, 75, 79, 82, 86, 89, 91,
         
        93, 96, 99
         
        }; // dc%
         
        /* PWM的高電平和低電平的定時器的重載值 */
         
        unsigned char Highthr0, Hightlr0;
         
        unsigned char Lowthr0, Lowtlr0;
         
         
         
        /* 定時器T1計數裝載值 */
         
        unsigned char thr1, tlr1;
         
         
         
        /* PWM 頻率計數值 */
         
        unsigned long tmp = 0;
         
         
         
        /******************local function defines**************************/
         
        void ConfigPWM(unsigned int fr, unsigned char dc);
         
        void ConfigTimer1(unsigned int xms);
         
        /******************************************************************/
         
         
         
        /**
         
        * @brief : 主函數
         
        * @param : 無
         
        * @retval : 無
         
        */
         
        void main(void)
         
        {
         
        P0 = 0xFF; //初始化P0數據口
         
        ADDR3 = 1;
         
        ENLED = 0; //選擇LED
         
        P1 = (P1 & 0xF8) | 0x06; //LEDS6
         
        PWMOUT = 1; //初始化為熄滅
         
         
         
        ConfigPWM(100, 2); //PWM頻率為100HZ, 占空比為2%
         
        ConfigTimer1(50); //50ms調整一次占空比
         
         
         
        EA = 1; //開啟總中斷!
         
         
         
        while (1); //wait interrupt happen!
         
        }
         
         
         
        /**
         
        * @brief : 配置PWM 調制PWM脈沖寬度
         
        * @param : PWM的脈沖寬度 PWM的占空比
         
        * @retval : 無
         
        */
         
        void ConfigPWM(unsigned int fr, unsigned char dc)
         
        {
         
        unsigned int high = 0, low = 0;
         
         
         
        tmp = (11059200/12/fr); //fr頻率的計數值
         
        high = (tmp * dc) / 100; //高電平計數值
         
        low = tmp - high; //低電平計數值
         
        high = 65536 - high; //高電平的計數定時器裝載初值
         
        low = 65536 - low; //低電平的計數定時器裝載初值
         
         
         
        Highthr0 = (unsigned char)(high >> 8);
         
        Hightlr0 = (unsigned char)high; //高電平
         
        Lowthr0 = (unsigned char)(low >> 8);
         
        Lowtlr0 = (unsigned char)low; //低電平
         
        /* 配置Timer0 方式1 */
         
        TMOD &= 0xF0; //清零T0控制位
         
        TMOD |= 0x01; //方式1
         
        TH0 = Highthr0;
         
        TL0 = Hightlr0; //先裝高電平
         
        TR0 = 1;
         
        ET0 = 1; //開啟定時器T0中斷
         
        }
         
         
         
        /**
         
        * @brief : 配置Timer1,用來調整PWM占空比
         
        * @param : 待定時的時間
         
        * @retval : 無
         
        */
         
        void ConfigTimer1(unsigned int xms)
         
        {
         
        unsigned long tmp;
         
         
         
        tmp = 11059200/12;
         
        tmp = (tmp * xms) / 1000; //定時xms時間需要的計數值
         
        tmp = 65536 - tmp; //需要裝載的計數初值
         
        thr1 = (unsigned char)(tmp >> 8);
         
        tlr1 = (unsigned char)tmp;
         
        TMOD &= 0x0F; //清零T1控制位
         
        TMOD |= 0x10; //T1方式1
         
        TH1 = thr1;
         
        TL1 = tlr1; //裝載初值
         
        TR1 = 1;
         
        ET1 = 1;
         
        }
         
         
         
        /**
         
        * @brief : 調整PWM的占空比 (高電平的脈沖寬度)
         
        * @param : 占空比 dc
         
        * @retval : 無
         
        */
         
        void tiaoZhengPWM(unsigned char dc)
         
        {
         
        unsigned int high = 0, low = 0;
         
         
         
        high = (tmp * dc) / 100; //高電平計數值
         
        low = tmp - high; //低電平計數值
         
        high = 65536 - high;
         
        low = 65536 - low; //計數裝載初值
         
        Highthr0 = (unsigned char)(high >> 8);
         
        Hightlr0 = (unsigned char)high; //取高電平計數裝載初值
         
        Lowthr0 = (unsigned char)(low >> 8);
         
        Lowtlr0 = (unsigned char)low; //取低電平計數裝載初值
         
        }
         
         
         
        /**
         
        * @brief : 定時器T0中斷服務 改變PWM的狀態
         
        * @param : 無
         
        * @retval : 無
         
        */
         
        void Timer0_ISP() interrupt 1
         
        {
         
        if (PWMOUT) //由高電平切換到低電平
         
        {
         
        TH0 = Lowthr0;
         
        TL0 = Lowtlr0; //裝載低電平計數初值
         
        PWMOUT = 0; //點亮LED
         
        }
         
        else
         
        {
         
        TH0 = Highthr0;
         
        TL0 = Hightlr0; //裝載高電平計數值
         
        PWMOUT = 1; //熄滅LED
         
        }
         
        }
         
         
         
        /**
         
        * @brief : 定時器T1中斷服務 調整PWM的占空比
         
        * @param : 無
         
        * @retval : 無
         
        */
         
        void Timer1_ISP() interrupt 3
         
        {
         
        static unsigned char index = 0;
         
        static bit bir = 0; //方向標志 (0 小->大 1 大->小)
         
         
         
        TH1 = thr1;
         
        TL1 = tlr1;
         
         
         
        tiaoZhengPWM(pwmTable[index]); //調整PWM占空比
         
         
         
        if (bir == 0)
         
        {
         
        index++;//遞增
         
        if (index >= 31) //到31立刻改變PWM的控制方向,即占空比由大到小變化(LED 暗->亮)
         
        {
         
        bir = 1; //改變方向
         
        }
         
        }
         
        else
         
        {
         
        index--;
         
        if (index == 0) //到0時立刻改變PWM的方向,即占空比由小到大變化(LED 亮->暗)
         
        {
         
        bir = 0; //改變方向
         
        }
         
        }
         
        }
         
         
         
        /**********************************END OF FILE*************new line****************/
        關閉窗口

        相關文章

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