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

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

        51單片機PWM-呼吸燈程序

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

        程序是在51hei單片機開發板上面做的,燈接在P0^0上,程序可以通用,到你自己的開發板或者是自己搭的電路也行.

        /**
          ******************************************************************************
          *file    :     main.c
          *author  :     xr
          *date    :     2014年4月15日17:38:07 - 2014年4月15日 18:47:29
          *version :     V1.2.3
          *brief   :     PWM應用-控制小燈的亮度-實現傳說中的呼吸燈效果  單片機STC89C52RC MCU 晶振 11.0592MHZ
          ******************************************************************************
          */
        #include <reg52.h>

        sbit ADDR0 = P1^0;   //如果是自己搭的電路,可以無視下面這幾行
        sbit ADDR1 = P1^1;
        sbit ADDR2 = P1^2;
        sbit ADDR3 = P1^3;
        sbit ENLED = P1^4;

        sbit PWMOUTLED = P0^0;//用于PWM控制輸出

        unsigned char heighHR0, heighLR0;//PWM一個周期中高電平高字節和低字節重載值
        unsigned char lowHR0, lowLR0;//PWM一個機器周期中低電平時高字節和低字節重載值

        void Initial();
        void ConfigPWM(unsigned int fr, unsigned char dc);
        void ClosePWM();

        void main(void)
        {
        unsigned int i;
        Initial();

        while (1)     //呼吸燈效果
        {
        //LED亮->暗
        ConfigPWM(100, 10);//配置PWM頻率為100HZ,占空比為10%
        for (i = 0; i < 30000; i++); //軟件測試延時大約76ms
        ConfigPWM(100, 20);//配置PWM頻率為100HZ,占空比為20%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 30);//配置PWM頻率為100HZ,占空比為30%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 40);//配置PWM頻率為100HZ,占空比為40%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 50);//配置PWM頻率為100HZ,占空比為50%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 60);//配置PWM頻率為100HZ,占空比為60%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 70);//配置PWM頻率為100HZ,占空比為70%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 80);//配置PWM頻率為100HZ,占空比為80%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 90);//配置PWM頻率為100HZ,占空比為90%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 95);//配置PWM頻率為100HZ,占空比為95%
        for (i = 0; i < 30000; i++);
        //LED暗->亮
        ConfigPWM(100, 90);//配置PWM頻率為100HZ,占空比為10%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 80);//配置PWM頻率為100HZ,占空比為20%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 70);//配置PWM頻率為100HZ,占空比為30%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 60);//配置PWM頻率為100HZ,占空比為40%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 50);//配置PWM頻率為100HZ,占空比為50%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 40);//配置PWM頻率為100HZ,占空比為60%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 30);//配置PWM頻率為100HZ,占空比為70%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 20);//配置PWM頻率為100HZ,占空比為80%
        for (i = 0; i < 30000; i++);
        ConfigPWM(100, 10);//配置PWM頻率為100HZ,占空比為90%
        for (i = 0; i < 30000; i++);
        ClosePWM();
        }
        }

        /*初始化*/
        void Initial()
        {
        ADDR3 = 1;
        ENLED = 0;//選擇U3,即LED
        ADDR2 = 1;
        ADDR1 = 1;
        ADDR0 = 0;//LEDS6=0
        }

        /*使用T0配置PWM高低電平的頻率*/
        void ConfigPWM(unsigned int fr, unsigned char dc)  //fr為PWM的頻率,100HZ無閃爍,dc是PWM的占空比(高電平占的百分比)
        {
        unsigned long tmp;
        unsigned int heigh, low;

        tmp = 11059200/12;//一個機器周期頻率
        tmp = tmp / fr;  //一個機器周期中fr的頻率所需計數值(包括高電平和低電平)
        heigh = (tmp * dc) / 100;//高電平占dc%,所需計數值
        low   = tmp - heigh;//低電平所需計數值
        heigh = 65536-heigh;//高電平計數初值
        low   = 65536-low;//低電平計數初值

        heighHR0 = (unsigned char)(heigh >> 8);//高電平裝入初值的高字節
        heighLR0 = (unsigned char)heigh;    //高電平裝入初值的低字節
        lowHR0   = (unsigned char)(low >> 8);  //低電平裝入初值的高字節
        lowLR0   = (unsigned char)low;    //低電平裝入初值的低字節

        TMOD &= 0xF0;//清零T0控制位
        TMOD |= 0x01;//設定T0工作方式1,16位可設定時器
        TH0 = heighHR0;
        TL0 = heighLR0;//裝入高電平計數初值
        PWMOUTLED = 1;//開始時PWM輸出高電平
        TR0 = 1;
        ET0 = 1;
        EA  = 1;
        }

        /*關閉PWM*/
        void ClosePWM()
        {
        TR0 = 0;//關閉Timer0
        ET0 = 0;//關閉T0中斷
        PWMOUTLED = 1;//PWM輸出高電平
        }

        /*定時器T0中斷服務*/
        void Timer0_ISP() interrupt 1
        {
        //判斷PWM現在輸出的是高電平還是低電平
          if (PWMOUTLED)
          {
           TH0 = lowHR0;
        TL0 = lowLR0;//裝載低電平計數初值
        PWMOUTLED = 0;//PWM輸出低電平
          }
          else
          {
           TH0 = heighHR0;
        TL0 = heighLR0;//重裝裝載高電平計數初值
        PWMOUTLED = 1;//PWM輸出高電平
          }
        }

        關閉窗口

        相關文章

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