• 歡迎光臨東莞市飛江電子科技有限公司官網!
    全國咨詢熱線

    13926563901

    18925580829

    飛江淘寶店鋪

    首頁>技術資料>51單片機

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

    發布時間:2018-03-26   瀏覽量:

    ******************************  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);              //漸變亮度的時間間隔
      }
     }
    }
    黑人粗大无码AV人妻一区