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

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

        基于51單片機之觸控調光臺燈實驗測試

        作者:CaKen   來源:CaKen工作室   點擊數:  更新時間:2014年09月02日   【字體:

         ******************************  Copyright(C) CaKe  ************************************

        ========================================================================================
        ==============**版權信息   : CaKen工作室                                  ==============
        ==============**文件名     : main.c                                       ==============
        ==============**作者       : CaKen                                        ==============
        ==============**版本號     : V1.0                                         ==============
        ==============**時間       : 2014.08.28                                   ==============
        ==============**功能描述   : 觸控調光臺燈實驗測試                         ==============
        ========================================================================================
        ==============**新浪微博   :CaKen            ==============
        ****************************************************************************************
         
        #include"STC12C5A60S2.H"      //STC12Cx052或STC12Cx052AD系列單片機頭文件
         
        sbit ON_OFF_Key =  P2 ^ 0;   //ON/OFF開關鍵
        sbit Add_Key    =  P2 ^ 3;   //加亮度(+)
        sbit Doc_Key    =  P2 ^ 7;   //減亮度(-)
        //LED與P1.3(PWM0)連接
         
        unsigned char Bright = 0x88;  //全局變量,亮度值
        bit POWER            = 0;     //LED燈開/關狀態標志位
         
         
        ***************************************************************************************
        函數名:PWM初始化函數
        調  用:PWM_Init();
        參  數:無
        返回值:無
        結  果:將PCA初始化為PWM模式,初始占空比為0
        備  注:需要更多路PWM輸出直接插入CCAPnH和CCAPnL即可
        ***************************************************************************************/
        void PWM_Init (void)
        {
            CMOD   = 0x02;  //設置PCA定時器
          CL     = 0x00;
          CH     = 0x00;
         CCAPM0 = 0x42;  //PWM0設置PCA工作方式為PWM方式(0100 0010)
          CCAP0L = 0x00;  //設置PWM0初始值與CCAP0H相同
          CCAP0H = 0x00;  //PWM0初始時為0
          CR     = 1;     //啟動PCA定時器
        }
         
        ****************************************************************************************
        函數名:PWM0占空比設置函數
        調  用:PWM0_Set();
        參  數:0x00~0xFF(亦可用0~255)
        返回值:無
        結  果:設置PWM模式占空比,為0時全部高電平,為1時全部低電平
        備  注:如果需要PWM1的設置函數,只要把CCAP0L和CCAP0H中的0改為1即可
        ****************************************************************************************/
         
        void PWM0_Set (unsigned char a)
        {
         CCAP0L= a; //設置值直接寫入CCAP0L
          CCAP0H= a; //設置值直接寫入CCAP0H
        }
         
        ***************************************************************************************
        函數名:毫秒級CPU延時函數
        調  用:DELAY_MS (?);
        參  數:1~65535(參數不可為0)
        返回值:無
        結  果:占用CPU方式延時與參數數值相同的毫秒時間
        備  注:應用于1T單片機時i<600,應用于12T單片機時i<125
        ****************************************************************************************/
         
        void DELAY_MS (unsigned int a)
        {
         unsigned int i;
         while( --a != 0)
         {
          for(i = 0; i < 600; i++);
         }
        }
         
        ***************************************************************************************
        函數名:UART串口初始化函數
        調  用:UART_Init();
        參  數:無
        返回值:無
        結  果:啟動UART串口接收中斷,允許串口接收,啟動T/C1產生波特率(占用)
        備  注:振蕩晶體為12MHz,PC串口端設置 [ 9600,8,無,1,無 ]
        ***************************************************************************************/
         
        void UART_Init (void)
        {
         EA = 1;         //允許總中斷(如不使用中斷,可用//屏蔽)
         ES = 1;         //允許UART串口的中斷
         TMOD = 0x20; //定時器T/C1工作方式2
         SCON = 0x50; //串口工作方式1,允許串口接收(SCON = 0x40 時禁止串口接收)
         TH1  = 0xFD; //定時器初值高8位設置 9600
         TL1  = 0xFD; //定時器初值低8位設置
         PCON = 0x80; //波特率倍頻
         TR1  = 1;     //定時器啟動   
        }
         
        ****************************************************************************************
        函數名:UART串口發送函數
        調  用:UART_Send (?);
        參  數:需要UART串口發送的數據(8位/1字節)
        返回值:無
        結  果:將參數中的數據發送給UART串口,確認發送完成后退出
        備  注:
        ****************************************************************************************/
         
        void UART_Send (unsigned char UART_data)
        {                        //定義串口發送數據變量
         SBUF = UART_data;  //將接收的數據發送回去
         while(TI == 0);   //檢查發送中斷標志位
         TI = 0;        //令發送中斷標志位為0(軟件清零)
        }
         
        ****************************************************************************************
        函數名:主函數
        調  用:無
        參  數:無
        返回值:無
        結  果:程序開始處,無限循環
        備  注:調光臺燈,觸摸延時燈
        ****************************************************************************************/
         
        void main (void)
        {
         PWM_Init();                         //PWM初始化
         UART_Init();                        //串口初始化
         P2M0 = 0x00;                        //將P2接口設置為高阻態輸入
         P2M1 = 0xFF;                        //觸摸按鍵啟用
         PWM0_Set(0);
         UART_Send (Bright);                 //把亮度值發給PC機   
         DELAY_MS(200);                      //延時等待I/O接口電平狀態穩定
         while(1)
         {
          unsigned char a;
             UART_Send (Bright);             //把亮度值發給PC機   
          if(ON_OFF_Key == 1)             //開關鍵按下
          {
           if(POWER == 0)             //如果當前狀態為關,則執行開燈程序
           {
            for(a=0;a<=Bright;a++)
            {
             PWM0_Set(a);
             DELAY_MS (20);      //漸暗的時間間隔  
            }
            PWM0_Set(Bright);        //達到存儲的LED亮度
            POWER = 1;               //把狀態標志位變成開
         
        //    DELAY_MS (10000);   //10秒之后,燈自動關閉
        //    PWM0_Set(0); 
           }
           else          //如果當前狀態為開,則執行關燈程序
           {
            for(a=Bright;a>0;a--)    //循環漸暗
            {
             PWM0_Set(a);
             DELAY_MS (20);      //漸暗的時間間隔 
            }
            PWM0_Set(0);            //關LED
            POWER = 0;              //把狀態標志位變成關
           }
           while(ON_OFF_Key == 0);     //等待按鍵放開
          }
         
          if(Add_Key == 1 && POWER == 1) //加亮度鍵按下,同時在開燈狀態下
          {
           Bright++;                   //亮度值加1
           PWM0_Set(Bright);           //將值寫入PWM控制LED亮度
           if(Bright >= 0xFD)         //如果亮度值大于0xFD,則不再增加
           {
            Bright = 0xFD;
           }
           DELAY_MS (20);              //漸變亮度的時間間隔
          }
         
          if(Doc_Key == 1 && POWER == 1) //減亮度鍵按下,同時在開燈狀態下
          {
           Bright--;                   //亮度值減1
           PWM0_Set(Bright);           //將值寫入PWM控制LED亮度
           if(Bright < 0x08)           //如果亮度值小于0x08,則不再減少
           {
            Bright = 0x08;
           }
           DELAY_MS (100);              //漸變亮度的時間間隔
          }
         }
        }
         
         
        關閉窗口
        欧美性色欧美精品视频,99热这里只有精品mp4,日韩高清亚洲日韩精品一区二区,2020国自产拍精品高潮