久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2923|回復: 0
打印 上一主題 下一主題
收起左側

可定義亮度的PWM調光LED燈制作 附pic單片機源程序

[復制鏈接]
跳轉到指定樓層
樓主
一直想打造一個自己的調光臺燈,于是動手焊接硬件,編寫自己的單片程序,經過調試初步達到要求,沒有條件打板,自己用萬能板焊接的電路,用來控制12V的長條LED實際效果還行!
主要功能:
1、  關機時短按一次開燈,亮度為關機時的檔位,開機時長按三秒關燈,關燈時為漸滅燈的效果;
2、  開機時單按為亮度檔位切換,分為1,2,3檔;
3、  開機時連按三次按鍵,可進入當前檔位的亮度PWM值設定,此時led閃爍,單擊按鍵為亮度增加,雙擊按鍵為亮度減小,長按則快速增加亮度(類似呼吸燈的效果),再次三擊為保存PWM值退出亮度設置;
4、  可以分別對三個檔位的PWM亮度值進行設定,以適合不同的LED組合;
5、  增加了7805穩壓,輸入電壓為6~30V;
6、  TIP31加散熱片后電子負載測試電流800mA有微熱,基本可滿足常用臺燈的要求;

焊接完成的圖片:
線路圖:
測試效果:

如下程序主要體現為PWM調光的部分,按鍵功能部分請參考我的另一個貼子:
PIC單片機單個按鍵實現多功能:長按、短按次數識別程序

單片機源程序如下:
  1.     PWM程序部分:
  2.     #include<pic.h>
  3.     //PIC16F690 PWM三檔自定議臺燈
  4.     voidmain(void)

  5.     {
  6.          IRQ_init();
  7.          port_init();
  8.          RC4            =0;
  9.          pwm_cnt     =0;
  10.          CCPR1        =pwm_hz+5;  //開機的瞬間LED輸出最大亮,設為65可以改善為開機即為程序默認亮度級
  11.          dan            =1;
  12.          
  13.          
  14.         pwm_1=    eeprom_read(0x01); if(pwm_1>pwm_hz+5 ||pwm_1 <0) pwm_1 = 115;
  15.         pwm_2=    eeprom_read(0x02); if(pwm_2>pwm_hz+5 ||pwm_2 <0) pwm_2 = 60;
  16.         pwm_3=    eeprom_read(0x03); if(pwm_3>pwm_hz+5 ||pwm_3 <0) pwm_3 = 10;
  17.         dan =     eeprom_read(0x04);if(dan> 3 ||dan <1) dan = 1;


  18.       
  19.     while(1)
  20.     {
  21.           key_scan();    //對應按次處理
  22.          write_eeprom();
  23.     }
  24.     }  

  25.     ////////////////////////////////////////////////////////////////
  26.     voidinterrupt init1(void)
  27.     {
  28.     /***用TIMER0中斷作的24H計時程序***/
  29.         if(T0IF)
  30.         {            
  31.       TMR0=61;
  32.       T0IF=0;
  33.            ss_2++;if(ss_2>5){ss_2=0;}   //1/4秒 2500ms
  34.            ss_4++;if(ss_4>80){ss_4=0;}  //1/2秒 5000ms
  35.        ss++;if(ss>80) s_led=1;
  36.       if(ss>=160){s_led=0;
  37.                 ss=0;
  38.                 s++;
  39.                 if(s>=60) {
  40.                          s=0;
  41.                          m++;
  42.                   if(m>=60){
  43.                                   m=0;
  44.                                   h++;
  45.                                   if(h>=24)h=0;}
  46.                          }
  47.                       }
  48.     /***用TIMER0中斷作的24H計時程序***/


  49.     /******設置時的快亮度加效果******/
  50.     if(set_mode==1)
  51.     {
  52.                 if(key_long_flag&&sw1==0)
  53.                 {
  54.                 if(ss_2==0) CCPR1++;
  55.                 if(CCPR1>pwm_hz+5)CCPR1=0;
  56.                
  57.                 } elseif(sw1==1&&key_long_flag) {key_long_flag=0;save_flag=1;}  
  58.     }
  59.     /******設置時的快亮度加效果******/
  60.                            
  61.     /**********關機漸滅控制**********/

  62.             if(on_flag){//if(CCPR1>50&&CCPR1<64){if(s%6==0){CCPR1++;}}
  63.                         if(CCPR1<pwm_hz+5){if(ss_2==0){CCPR1++;}
  64.                         }
  65.     /**********關機漸滅控制**********/
  66.       
  67.        }
  68.          
  69.          }

  70.     //////////////////////////////////////////////////////////////
  71.            


  72.     //**************************************//
  73.     //Write eeprom
  74.     //**************************************//
  75.     void write_eeprom()
  76.     {
  77.       if(save_flag)
  78.        {
  79.                         if(dan==1){pwm_1=CCPR1;}
  80.                else if(dan==2){pwm_2=CCPR1;}
  81.                else if(dan==3){pwm_3=CCPR1;}
  82.        eeprom_write(0x01,pwm_1);
  83.        eeprom_write(0x02,pwm_2);
  84.        eeprom_write(0x03,pwm_3);
  85.        eeprom_write(0x04,dan  );
  86.         delay_ms(1);
  87.         save_flag=0;
  88.       
  89.        }
  90.     }
  91.     //**************************************//



  92.     //////長短按鍵處理end///////

  93.     void key_scan()
  94.     {
  95.        push_scan();
  96.       
  97.        //----開關機鍵處理-----//
  98.       if(set_mode==0){
  99.        se_flag=key_long_flag; key_long_flag=0; //長按開關機鍵
  100.       if((yao_se_flag||se_flag)&&on_lock_flag==0)
  101.       {
  102.          //////////關機前先滅下燈
  103.           CCPR1=pwm_hz+5;delay_ms(30);

  104.           if(dan==1)CCPR1=pwm_1;
  105.           else if(dan==2)CCPR1=pwm_2;
  106.           else if(dan==3)CCPR1=pwm_3;
  107.             on_flag=~on_flag;
  108.           on_lock_flag=1;
  109.               se_flag=0;
  110.               yao_se_flag=0;
  111.       }else if(se_flag==0&&on_lock_flag==1) on_lock_flag=0;
  112.     }
  113.     //---------------------//

  114.     if(on_flag)//關機狀態下
  115.     {
  116.     set_mode=0;
  117.     if(key_num==1) { up_flag=1;key_num=0;}   //單擊加鍵識別
  118.     //關機狀態單按即開機
  119.     if(up_flag)
  120.     {
  121.     up_flag=0;
  122.     //dn_flag=0;
  123.     on_flag=0;
  124.     }
  125.     }

  126.     //---------------------//
  127.     else if(on_flag==0)  //開機狀態下 進下如下按鍵操作
  128.     {
  129.        if(key_num==1) { up_flag=1;key_num=0;}   //單擊加鍵識別
  130.        if(key_num==2) { dn_flag=1;key_num=0;}   //雙擊減鍵識別
  131.        if(key_num==3) {thr_flag=1;key_num=0;}   //三擊設置識別
  132.        //---------------------//
  133.        //三按在正常工作模式與設置模式切換
  134.         if((yao_thr_flag||thr_flag)&&set_sw_flag==0/*&&dismode==0*/)  
  135.         {
  136.           set_mode++;
  137.           if(set_mode>1)set_mode=0;
  138.           set_sw_flag=1;
  139.           thr_flag=0;yao_thr_flag=0;
  140.           } else if(thr_flag==0&&set_sw_flag==1) set_sw_flag=0;
  141.        //---------------------//
  142.       
  143.        //---------------------//
  144.       
  145.        if(set_mode==0)//檔位加處理
  146.        {
  147.           if((yao_dn_flag||yao_up_flag||up_flag||dn_flag)&&short_temp_flag==0)
  148.           {
  149.           dan++;
  150.           if(dan>3)dan=1;
  151.           short_temp_flag=1;
  152.           up_flag=0;
  153.           dn_flag=0;
  154.           yao_up_flag=0;
  155.           yao_dn_flag=0;
  156.           save_flag=1;
  157.          
  158.          } else {if(up_flag==0&&short_temp_flag==1) short_temp_flag=0;}  
  159.          
  160.                    if(dan==1) CCPR1=pwm_1;
  161.                 else if(dan==2)CCPR1=pwm_2;
  162.                 else if(dan==3)CCPR1=pwm_3;
  163.                
  164.       
  165.        }
  166.         //---------------------//
  167.       
  168.         //---------------------//
  169.        else if(set_mode==1)//設置各檔位的PWM值
  170.        {

  171.          
  172.          
  173.             if(up_flag||yao_up_flag)
  174.                 {
  175.                 CCPR1++;
  176.                 up_flag=0;
  177.                 yao_up_flag=0;
  178.                 if(CCPR1>pwm_hz+5)CCPR1=0;
  179.                 save_flag=1;
  180.                 }        
  181.               if(dn_flag||yao_dn_flag)
  182.                 {
  183.                 CCPR1--;
  184.                 dn_flag=0;
  185.                 yao_dn_flag=0;
  186.                 if(CCPR1<1)CCPR1=pwm_hz+5;
  187.                 save_flag=1;
  188.                 }   
  189.       
  190.        else{if(s_led){
  191.                      pwm_stop=0;
  192.                      if(dan==1){pwm_1=CCPR1;}
  193.                else if(dan==2){pwm_2=CCPR1;}
  194.                else if(dan==3){pwm_3=CCPR1;}
  195.              }
  196.       
  197.        else if(key_long_flag==0){pwm_stop=1;}SCR_OUT=0;}
  198.        }
  199.       
  200.        //---------------------//
  201.       

  202.     }   
  203.       /////////////////////  

  204.     }

  205.     void port_init(void)
  206.     {

  207.        TRISA=0b00010100; //RA0,1為PWM設置鍵
  208.        TRISB=0x01;       //RBO為中斷輸入
  209.        TRISC=0b00000000;

  210.        ANSEL=0b00000000;
  211.        ANSELH=0X00;

  212.        PORTA=0X00;
  213.        PORTB=0X00;
  214.        PORTC=0X00;

  215.     }
  216.     ///////////////////////////
復制代碼

//------------------------------------------------------------------------------------------------------------   void IRQ_init(void)//定時A和外部中斷1初始化   {   GIE=0;      //關總中斷   //RBIE=0;     //RB口電平變化中斷禁止   //---------CPU頻率配置-------  //IRCF<2:0>:內部振蕩器頻率選擇位  IRCF2= 1 ;  IRCF1= 1 ;  IRCF0= 1 ;   //000 = 31 kHz  //001 = 125 kHz  //010 = 250 kHz  //011 = 500 kHz  //100 = 1 MHz  //101 = 2 MHz  //110 = 4 MHz (缺省值)  //111 = 8 MHz   RABPU=0; //AB口上拉起動  WPUA0=1;  WPUA1=1;  //WPUA4=1;  //WPUA5=1;  WPUA2=1;   //-------定時器time0的配置-----  T0IF=0;     //清中斷標志  T0IE=1;     //允許Time0中斷    TMR0=61;    //256-61    T0CS=0;     //Time0選擇內部時鐘  T0SE=0;     //外部電平低至高變化遞增  PSA =0;     //預分頻給Time0  PS2 =1;     //111為1:256分頻   PS1 =0;  PS0 =1;  //PS<2:0>:預分頻器比選擇位  //000 1 : 2  //001 1 : 4  //010 1 : 8  //011 1 : 16  //100 1 : 32  //101 1 : 64  //110 1 : 128  //111 1 : 256 //----------------------------  PEIE=1; //允許外圍中斷   GIE=1; //開總中斷    }

臺燈Layout-3.jpg (129.63 KB, 下載次數: 128)

臺燈Layout-3.jpg

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 少妇久久久久 | 亚洲 欧美 日韩 精品 | 日本人爽p大片免费看 | 国产一区二区精品 | 中文字幕在线中文 | 91在线精品视频 | 亚欧洲精品在线视频免费观看 | 男女久久久 | 亚洲成人免费在线观看 | 涩涩导航| 日韩欧美一区二区三区免费观看 | 日本在线视| 中文字幕视频一区 | 日本三级网站在线 | 亚洲欧美日韩在线 | 亚洲 欧美 另类 日韩 | 亚洲欧美日韩精品久久亚洲区 | 欧美在线观看一区 | 中日韩欧美一级片 | 992人人草 | 992人人草 | 亚洲播放| 精品视频久久久 | 欧美成人激情视频 | 国产亚洲欧美在线 | 欧美成人a∨高清免费观看 91伊人 | 欧美精品一区久久 | 日韩影音 | 国产精品久久久久久久一区探花 | 久久精品欧美一区二区三区不卡 | 亚洲久草视频 | 久久久高清 | 成人免费视屏 | 国产精品久久久久一区二区三区 | 国产成人精品999在线观看 | 青青99| av免费网站在线 | 成人妇女免费播放久久久 | 2019天天干天天操 | 成人九色| 色眯眯视频在线观看 |