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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2200|回復(fù): 10
收起左側(cè)

51單片機臺燈功能實現(xiàn),求助

[復(fù)制鏈接]
ID:264640 發(fā)表于 2023-4-19 10:41 | 顯示全部樓層 |閱讀模式
按鍵1短按開關(guān) 長按調(diào)節(jié)亮度
按鍵2短按切換LED模式
模式:1.LED1亮 LED2滅
1.LED1滅 LED2亮
1.LED1亮 LED2亮



本人對于鍵值掃描完全沒有頭緒,如何區(qū)分長短按,求大神指導(dǎo)!!
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2023-4-19 15:26 | 顯示全部樓層
這么簡單的不用矩陣鍵盤,長按通過計數(shù)不同實現(xiàn),模式也就是二進制而已簡單得很.
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2023-4-19 16:45 | 顯示全部樓層
如果要設(shè)計一個單片機控制風扇是依據(jù)這一天溫度變動預(yù)報還是依據(jù)體溫?
回復(fù)

使用道具 舉報

ID:264640 發(fā)表于 2023-4-19 16:54 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-4-19 15:26
這么簡單的不用矩陣鍵盤,長按通過計數(shù)不同實現(xiàn),模式也就是二進制而已簡單得很.

對于長按連加的鍵值掃描不是很懂
回復(fù)

使用道具 舉報

ID:264640 發(fā)表于 2023-4-19 16:54 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-4-19 16:45
如果要設(shè)計一個單片機控制風扇是依據(jù)這一天溫度變動預(yù)報還是依據(jù)體溫?

目前只要LED亮度調(diào)節(jié)就行
回復(fù)

使用道具 舉報

ID:857072 發(fā)表于 2023-4-19 22:09 來自觸屏版 | 顯示全部樓層
如果是真不會的話,可以看看天問51這種,按鍵應(yīng)該都做好了直接用。因為他這個也直接支持C,想深入的話以后也可以直接轉(zhuǎn)到C語言。
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2023-4-20 11:09 | 顯示全部樓層
你要的這些功能,一個按鍵就可以做到
回復(fù)

使用道具 舉報

ID:1072921 發(fā)表于 2023-4-20 11:22 | 顯示全部樓層
用延時計數(shù)就行了
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2023-4-20 12:39 | 顯示全部樓層
我這里有個實例,用的STC8H1K16,兩路pwm驅(qū)動兩個NMOS管控制雙色燈帶
  1. /*************  功能說明    **************
  2. 按鍵短按開燈,開燈后3秒內(nèi),短按開關(guān)切換色溫(白光,黃光,自然光;切換色溫功率不變);
  3. 長按調(diào)亮度;超過3秒短按關(guān)燈。
  4. 設(shè)置的參數(shù)掉電保存;

  5. 高級PWM定時器 PWM1P/PWM1N,PWM2P/PWM2N,PWM3P/PWM3N,PWM4P/PWM4N 每個通道都可獨立實現(xiàn)PWM輸出,
  6. 或者兩兩互補對稱輸出.

  7. MCU: STC8H1K16  LQFP-32封裝
  8. P1.1 P1.2驅(qū)動兩路LED

  9. 2023/4/14 調(diào)試成功
  10. ******************************************/

  11. //#include    "reg51.h"       //包含此頭文件后,里面聲明的寄存器不需要再手動輸入,避免重復(fù)定義
  12. #include    <stc8h.h>
  13. #include    "intrins.h"

  14. #define     MAIN_Fosc       11059200L   //定義主時鐘

  15. #define PWM_PSCR    3     //設(shè)置分頻        頻率計算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)邊沿對齊
  16. #define PWM_ARR  1023    //設(shè)置周期值          頻率2.7KHz

  17. //#define PWM_PSCR  15     //設(shè)置分頻        頻率計算公式MAIN_Fosc/(PWM_PSCR+1)*(PWM_ARR+1)
  18. //#define PWM_ARR  254    //設(shè)置周期值          頻率2.7KHz


  19. #define uchar unsigned char
  20. #define uint unsigned int
  21. typedef     unsigned char   u8;
  22. typedef     unsigned int    u16;
  23. typedef     unsigned long   u32;

  24. /****************************** 用戶定義宏 ***********************************/

  25. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中斷頻率, 1000次/秒
  26. /*****************************************************************************/

  27. #define PWM1_1      0x00        //P:P1.0  N:P1.1
  28. #define PWM1_2      0x01        //P:P2.0  N:P2.1
  29. #define PWM1_3      0x02        //P:P6.0  N:P6.1

  30. #define PWM2_1      0x00        //P:P1.2/P5.4  N:P1.3
  31. #define PWM2_2      0x04        //P:P2.2  N:P2.3
  32. #define PWM2_3      0x08        //P:P6.2  N:P6.3

  33. #define PWM3_1      0x00        //P:P1.4  N:P1.5
  34. #define PWM3_2      0x10        //P:P2.4  N:P2.5
  35. #define PWM3_3      0x20        //P:P6.4  N:P6.5

  36. #define PWM4_1      0x00        //P:P1.6  N:P1.7
  37. #define PWM4_2      0x40        //P:P2.6  N:P2.7
  38. #define PWM4_3      0x80        //P:P6.6  N:P6.7
  39. #define PWM4_4      0xC0        //P:P3.4  N:P3.3

  40. #define ENO1P       0x01
  41. #define ENO1N       0x02
  42. #define ENO2P       0x04
  43. #define ENO2N       0x08
  44. #define ENO3P       0x10
  45. #define ENO3N       0x20
  46. #define ENO4P       0x40
  47. #define ENO4N       0x80

  48. /*************  本地變量聲明    **************/
  49. bit B_1ms;          //1ms標志

  50. u16 PWM1_Duty;
  51. u16 PWM2_Duty;
  52. u16 PWM2_Dutyv;
  53. u16 PWM1_Dutyv;

  54. //u16 PWM3_Duty;
  55. //u16 PWM4_Duty;

  56. uchar PWM2_Dutyv_L;
  57. uchar PWM2_Dutyv_M;

  58. uchar temp_PWM2_Dutyv_L;
  59. uchar temp_PWM2_Dutyv_M;


  60. bit PWM1_Flag;
  61. bit PWM2_Flag;
  62. bit PWM3_Flag;
  63. bit PWM4_Flag;

  64. void UpdatePwm(void);

  65. sbit k2=P3^2;//燈開關(guān)
  66. sbit led=P1^2;//燈
  67. uint k1_cont,k2_cont;//按鍵消抖計時
  68. uchar k1_lock,k2_lock;//按鍵鎖
  69. uchar count1=10,count2=10;
  70. uint Long_cont=400;
  71. uint Long_cont1=200;
  72. uint Long_cont2=200;
  73. uchar PWM_Value;           //占空比 變量
  74. bit PWM_UP_Down_Flag;  //調(diào)光方向標志
  75. bit flag_short_k1,flag_short_k2;//按鍵短按標志
  76. bit flag_led_onoff;//led燈開關(guān)標志
  77. bit SaveFlag;                         //數(shù)據(jù)存儲標志

  78. bit flag_qh,flag_qh1;//色溫切換計時標志
  79. uint hcount,hcount1,hcount2;
  80. uchar led_qhcount;
  81. /////////////////////////
  82. void delay(uint ms)
  83. {
  84.         uint i,j;
  85.         for(i=0; i<ms; i++)
  86.                 for(j=0; j<930; j++);
  87. }
  88. //////////////////////
  89. /////////////////
  90. void IapIdle()        //禁用IAP功能
  91. {
  92.     IAP_CONTR = 0;                              //關(guān)閉IAP功能
  93.     IAP_CMD = 0;                                //清除命令寄存器
  94.     IAP_TRIG = 0;                               //清除觸發(fā)寄存器
  95.     IAP_ADDRH = 0x80;                           //將地址設(shè)置到非IAP區(qū)域
  96.     IAP_ADDRL = 0;
  97. }

  98. char IapRead(int addr) //讀EEPROM
  99. {
  100.     char dat;

  101.     IAP_CONTR = 0x80;                           //使能IAP
  102.     IAP_TPS = 12;                               //設(shè)置等待參數(shù)12MHz
  103.     IAP_CMD = 1;                                //設(shè)置IAP讀命令
  104.     IAP_ADDRL = addr;                           //設(shè)置IAP低地址
  105.     IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
  106.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  107.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  108.     _nop_();
  109.     dat = IAP_DATA;                             //讀IAP數(shù)據(jù)
  110.     IapIdle();                                  //關(guān)閉IAP功能

  111.     return dat;
  112. }

  113. void IapProgram(int addr, char dat)        //寫EEPROM
  114. {
  115.     IAP_CONTR = 0x80;                           //使能IAP
  116.     IAP_TPS = 12;                               //設(shè)置等待參數(shù)12MHz
  117.     IAP_CMD = 2;                                //設(shè)置IAP寫命令
  118.     IAP_ADDRL = addr;                           //設(shè)置IAP低地址
  119.     IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
  120.     IAP_DATA = dat;                             //寫IAP數(shù)據(jù)
  121.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  122.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  123.     _nop_();
  124.     IapIdle();                                  //關(guān)閉IAP功能
  125. }

  126. void IapErase(int addr)          //擦除EEPROM
  127. {
  128.     IAP_CONTR = 0x80;                           //使能IAP
  129.     IAP_TPS = 12;                               //設(shè)置等待參數(shù)12MHz
  130.     IAP_CMD = 3;                                //設(shè)置IAP擦除命令
  131.     IAP_ADDRL = addr;                           //設(shè)置IAP低地址
  132.     IAP_ADDRH = addr >> 8;                      //設(shè)置IAP高地址
  133.     IAP_TRIG = 0x5a;                            //寫觸發(fā)命令(0x5a)
  134.     IAP_TRIG = 0xa5;                            //寫觸發(fā)命令(0xa5)
  135.     _nop_();                                    //
  136.     IapIdle();                                  //關(guān)閉IAP功能
  137. }
  138. ///////////////////
  139. void keyscan()
  140. {
  141. //        if(tes_flag==0)        //非時鐘設(shè)置狀態(tài)
  142.         {
  143.        
  144.                 if(k2)
  145.                 {
  146.                         k2_lock=0;
  147.                         k2_cont=0;
  148.                         if(flag_short_k2)
  149.                         {
  150. //                                cmled2=!cmled2;//按鍵指示燈取反
  151.                                 flag_short_k2=0;//清零k2短按標志
  152. //                                flag_led_onoff=!flag_led_onoff;//開關(guān)燈標志取反
  153.                                 flag_qh1=1;

  154.                                 if(flag_qh)
  155.                                 {
  156.                                         flag_led_onoff=1;
  157.                                         led_qhcount++;
  158.                                         if(led_qhcount==3)
  159.                                         {
  160.                                                 led_qhcount=0;
  161.                                         }

  162. //                                        if(led_qhcount==0)        //兩路亮
  163. //                                        {
  164. //                                        //        PWM2_Dutyv=PWM2_Dutyv>>1; //兩路都亮的亮度是一路一半的亮度
  165. //                                                PWM2_Dutyv=PWM2_Dutyv/2;
  166. //                                        }
  167. //                                        if(led_qhcount==1)
  168. //                                        {
  169. //                                        //        PWM2_Dutyv=PWM2_Dutyv<<1; //單路亮度是雙路亮度的2倍
  170. //                                                PWM2_Dutyv=PWM2_Dutyv*2;
  171. //                                        }
  172. //                                        if(led_qhcount==2)
  173. //                                        {
  174. //                                                PWM2_Dutyv=PWM2_Dutyv;
  175. //                                        }
  176.                                        

  177.                                         IapErase(0x1000);  //擦除EEPROM
  178.                                         IapProgram(0x1000, led_qhcount);//保存亮燈路數(shù)值


  179.                                         hcount=0;
  180.                                         hcount1=0;       
  181.                                 }
  182.                                 else
  183.                                 {
  184.                                         flag_led_onoff=!flag_led_onoff;//開關(guān)燈標志取反
  185.                                 }

  186.                         }

  187.                         if(SaveFlag)  //長按松手后,保存pwm數(shù)據(jù)
  188.                         {
  189.                                 PWM_UP_Down_Flag=!PWM_UP_Down_Flag;//調(diào)光方向標志取反
  190.                                 PWM2_Dutyv_L=PWM2_Dutyv%256;//將大于255的占空比值拆分成兩個uchar的數(shù)值再保存
  191.                                 PWM2_Dutyv_M=PWM2_Dutyv/256;
  192.                                 IapErase(0x0001);  //擦除EEPROM
  193.                                 IapProgram(0x0001, PWM2_Dutyv_L);//將PWM_Value寫入EEPROM
  194.                                 IapProgram(0x0002, PWM2_Dutyv_M);//將PWM_Value寫入EEPROM

  195.                                 SaveFlag = 0;//保存數(shù)據(jù)后,保存標志清零       
  196.                         }       
  197.                                
  198.                 }
  199.                 else if(k2_lock==0)        //短按
  200.                 {
  201.                         k2_cont++;
  202.                 //        flag_k2=1;
  203.                         if(k2_cont>count2)
  204.                         {
  205.                                 k2_cont=0;
  206.                                 k2_lock=1;
  207.                                 flag_short_k2=1;
  208. //                                if(flag_qh)
  209. //                                {
  210. //                                        led_qhcount++;
  211. //                                        if(led_qhcount==3)
  212. //                                        {
  213. //                                                led_qhcount=0;
  214. //                                        }
  215. //                                        hcount=0;
  216. //                                        hcount1=0;       
  217. //                                }
  218.                         }       
  219.                 }
  220.                 else if(k2_cont<Long_cont2)        //長按
  221.                 {
  222.                         k2_cont++;
  223.                         if(k2_cont==Long_cont2)
  224.                         {
  225.                                 k2_cont=196;
  226.                                 flag_short_k2=0;//進入長按必須清短按標志,否則會觸發(fā)一次短按
  227.                                 SaveFlag = 1;//進入長按,保存標志置1
  228.                                 if(flag_led_onoff)//開燈狀態(tài)
  229.                                 {
  230.                                         if(PWM_UP_Down_Flag == 1) //亮度++
  231.                                         {
  232.                                                
  233.                                                
  234. //                                                if(PWM2_Dutyv < 1023)       
  235. //                                                {
  236. //                                                //        PWM2_Dutyv +=5;
  237. //                                                        if(led_qhcount==0)
  238. //                                                        {        PWM2_Dutyv +=3;
  239. //                                                                if(PWM2_Dutyv > 511)
  240. //                                                                {
  241. //                                                                        PWM2_Dutyv = 511;
  242. //                                                                }
  243. //                                                        }
  244. //                                                        else
  245. //                                                        {       
  246. //                                                                PWM2_Dutyv +=6;
  247. //                                                                if(PWM2_Dutyv > 1022)
  248. //                                                                {
  249. //                                                                        PWM2_Dutyv = 1022;
  250. //                                                                }
  251. //                                                        }
  252. //                                                }
  253. //                                       
  254. //                                        }
  255. //                                       
  256. //                                        if(PWM_UP_Down_Flag == 0)   //亮度--
  257. //                                        {
  258. //                               
  259. //                                       
  260. //                                                if(PWM2_Dutyv > 0)
  261. //                                                {
  262. //                                                        if(led_qhcount==0)
  263. //                                                        {PWM2_Dutyv -=3;}
  264. //                                                        else
  265. //                                                        {PWM2_Dutyv -=6;}
  266. //                                                        if(PWM2_Dutyv < 100)
  267. //                                                        {
  268. //                                                                PWM2_Dutyv = 100;                               
  269. //                                                        }
  270. //                                       
  271. //                                                }
  272. //                                        }                                       
  273.                                                 if(PWM2_Dutyv < 1023)        //亮度++
  274.                                                 {
  275.                                                                 PWM2_Dutyv +=5;
  276.                                                                 if(PWM2_Dutyv > 1022)
  277.                                                                 {
  278.                                                                         PWM2_Dutyv = 1022;
  279.                                                                 }
  280.                                                        
  281.                                                 }
  282.                                           
  283.                                         }
  284.                                        
  285.                                         if(PWM_UP_Down_Flag == 0)   //亮度--
  286.                                         {
  287.                                
  288.                                        
  289.                                                 if(PWM2_Dutyv > 0)
  290.                                                 {

  291.                                                         PWM2_Dutyv -=5;
  292.                                                         if(PWM2_Dutyv < 100)
  293.                                                         {
  294.                                                                 PWM2_Dutyv = 100;                               
  295.                                                         }
  296.                                        
  297.                                                 }
  298.                                         }                                       
  299.                                                                        
  300.                                 }                               
  301.                         }               
  302.                
  303.                 }
  304.         }
  305. }
  306. //////////////////////////
  307. void Timer0Init(void)                //2毫秒@11.0592MHz
  308. {
  309.         AUXR |= 0x80;                //定時器時鐘1T模式
  310.         TMOD &= 0xF0;                //設(shè)置定時器模式 16位自動重載
  311.         TL0 = 0x9A;                //設(shè)置定時初始值
  312.         TH0 = 0xA9;                //設(shè)置定時初始值
  313.         TF0 = 0;                //清除TF0標志
  314.         TR0 = 1;                //定時器0開始計時
  315.         ET0=1;
  316.         EA=1;
  317. }


  318. //////////////////////////

  319. /******************** 主函數(shù) **************************/
  320. void main(void)
  321. {

  322.         Timer0Init();
  323.     P0M1 = 0x00;   P0M0 = 0x00;   //設(shè)置為準雙向口
  324.     P1M1 = 0x00;   P1M0 = 0x07;   //設(shè)置為準雙向口 p12設(shè)為推挽輸出
  325.     P2M1 = 0x00;   P2M0 = 0x00;   //設(shè)置為準雙向口
  326.     P3M1 = 0x00;   P3M0 = 0x00;   //設(shè)置為準雙向口
  327.     P4M1 = 0x00;   P4M0 = 0x00;   //設(shè)置為準雙向口
  328.     P5M1 = 0x00;   P5M0 = 0x00;   //設(shè)置為準雙向口
  329.     P6M1 = 0x00;   P6M0 = 0x00;   //設(shè)置為準雙向口
  330.     P7M1 = 0x00;   P7M0 = 0x00;   //設(shè)置為準雙向口

  331.                 PWM1_Flag = 0;
  332.                 PWM2_Flag = 0;
  333.                 PWM3_Flag = 0;
  334.                 PWM4_Flag = 0;
  335.        
  336. //                PWM1_Duty = 512;
  337. //                PWM2_Duty = 256;
  338. //                PWM2_Dutyv=2046;
  339. //                PWM3_Duty = 512;
  340. //                PWM4_Duty = 1024;

  341.    
  342.         PWM2_Dutyv_L=IapRead(0x0001);  //讀出占空比值
  343.         PWM2_Dutyv_M=IapRead(0x0002);
  344.         if(PWM2_Dutyv_M==255)PWM2_Dutyv_M=3; //第一次上電讀出的值是255,就給占空比賦初值
  345.         if(PWM2_Dutyv_L==255)PWM2_Dutyv_L=255;
  346.                                                                                          //占空比最大為PWM_ARR的值
  347.         PWM2_Dutyv=PWM2_Dutyv_M*256+PWM2_Dutyv_L;//兩個uchar合并成uint,初始最大亮度值1024

  348.         led_qhcount=IapRead(0x1000);
  349.         if(led_qhcount==255)led_qhcount=2;

  350.                 P_SW2 |= 0x80;
  351.                
  352.     PWMA_CCER1 = 0x00; //寫 CCMRx 前必須先清零 CCxE 關(guān)閉通道
  353.     PWMA_CCER2 = 0x00;
  354.     PWMA_CCMR1 = 0x60; //通道模式配置 設(shè)置CC1為PWMA輸出模式,方向為輸出
  355.     PWMA_CCMR2 = 0x60;
  356.     PWMA_CCMR3 = 0x60;
  357.     PWMA_CCMR4 = 0x60;
  358.     PWMA_CCER1 = 0x55; //配置通道輸出使能和極性
  359.     PWMA_CCER2 = 0x55;

  360.         PWMA_PSCRH = (u8)(PWM_PSCR>>8);     //設(shè)置分頻
  361.     PWMA_PSCRL = (u8)(PWM_PSCR);

  362. //    PWMA_ARRH = (u8)(PWM_ARR >> 8);  //設(shè)置周期時間
  363. //    PWMA_ARRL = (u8)PWM_ARR;
  364.     PWMA_ARRH = PWM_ARR/256;  //設(shè)置周期時間  右移8位等同256求模
  365.     PWMA_ARRL = PWM_ARR%256;
  366. /*
  367. 通俗的說,位移的實現(xiàn)是將數(shù)據(jù)轉(zhuǎn)換成二進制后,進行左右移動的。如果左移,則右邊補零,如果是右移,
  368. 則是左邊補零,后邊溢出的則去掉。因此,左移可以理解為整數(shù)的乘法,
  369. 而右移則是理解為整數(shù)的取整除法。

  370.   左移 (<<)

  371.   將第一個操作數(shù)向左移動第二個操作數(shù)指定的位數(shù),空出的位置補0。
  372.   左移相當于乘. 左移一位相當于乘2;左移兩位相當于乘4;左移三位相當于乘8。

  373.   x<<1= x*2
  374.   x<<2= x*4
  375.   x<<3= x*8
  376.   x<<4= x*16

  377.   同理, 右移即相反:

  378.   右移 (>>)
  379.   將第一個操作數(shù)向右移動第二個操作數(shù)所指定的位數(shù),空出的位置補0。

  380.   右移相當于整除. 右移一位相當于除以2;右移兩位相當于除以4;右移三位相當于除以8。
  381.   右移四位相當于除以16;右移8位相當于除以256.
  382.   x>>1= x/2
  383.   x>>2= x/4
  384.   x>>3= x/8
  385.   x>>4= x/16
  386. */

  387. //    PWMA_ARRH = 0x03; //設(shè)置周期時間  自動重裝載高8位
  388. //    PWMA_ARRL = 0xff;//自動重裝載低8位

  389.     PWMA_ENO = 0x00;
  390. //    PWMA_ENO |= ENO1P; //使能輸出
  391.     PWMA_ENO |= ENO1N; //使能輸出
  392.     PWMA_ENO |= ENO2P; //使能輸出
  393. //    PWMA_ENO |= ENO2N; //使能輸出
  394. //    PWMA_ENO |= ENO3P; //使能輸出
  395. //    PWMA_ENO |= ENO3N; //使能輸出
  396. //    PWMA_ENO |= ENO4P; //使能輸出
  397. //    PWMA_ENO |= ENO4N; //使能輸出

  398.                 PWMA_PS = 0x00;  //高級 PWM 通道輸出腳選擇位
  399.     PWMA_PS |= PWM1_1; //選擇 PWM1_2 通道
  400.     PWMA_PS |= PWM2_1; //選擇 PWM2_1 通道 p12口
  401. //    PWMA_PS |= PWM3_3; //選擇 PWM3_3 通道
  402. //    PWMA_PS |= PWM4_3; //選擇 PWM4_3 通道

  403.     PWMA_BKR = 0x80; //使能主輸出
  404.     PWMA_CR1 |= 0x01; //開始計時
  405.                 P_SW2 &= 0x7f;
  406.     while (1)
  407.     {
  408.                 keyscan();
  409.                 delay(4);


  410.                
  411.                 if(flag_led_onoff==1)        //開燈
  412.                 {
  413.                         switch(led_qhcount)
  414.                         {
  415. //                                case 0: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = PWM2_Dutyv; break;
  416. //
  417. //                                case 1: PWM2_Duty = 0; PWM1_Duty = PWM2_Dutyv; break;
  418. //
  419. //                                case 2: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = 0; break;
  420.                                 case 0: PWM2_Duty = PWM2_Dutyv/2; PWM1_Duty = PWM2_Dutyv/2; break;

  421.                                 case 1: PWM2_Duty = 0; PWM1_Duty = PWM2_Dutyv; break;

  422.                                 case 2: PWM2_Duty = PWM2_Dutyv; PWM1_Duty = 0; break;
  423.                                 default: break;
  424.                         }
  425.                 }
  426.                 else //關(guān)燈
  427.                 {
  428.                         PWM2_Duty=0;
  429.                         PWM1_Duty = 0;
  430.                         flag_qh1=0;         //關(guān)燈將flag_qh1,hcount2這兩個變量清零
  431.                         hcount2=0;         //否則關(guān)燈后再快速開燈會誤切換色溫
  432.                 }
  433.                
  434.                 UpdatePwm();
  435.                        
  436.         }
  437. }


  438. /********************** Timer0 1ms中斷函數(shù) ************************/
  439. void timer0(void) interrupt 1
  440. {
  441.         if(flag_qh1)
  442.         {
  443.                 hcount2++;
  444.                 if(hcount2==100)//0.2秒
  445.                 {
  446.                         hcount2=0;
  447.                         flag_qh1=0;
  448.                         flag_qh=1;       
  449.                 }       
  450.         }

  451.         if(flag_qh)
  452.         {
  453.                 hcount++;
  454.                 if(hcount==500)        //1秒
  455.                 {
  456.                         hcount=0;
  457.                         hcount1++;
  458.                         if(hcount1==3)
  459.                         {
  460.                                 hcount1=0;
  461.                                 flag_qh=0;
  462.                         }
  463.                 }
  464.         }       

  465. }


  466. //========================================================================
  467. // 函數(shù): UpdatePwm(void)
  468. // 描述: 更新PWM占空比.
  469. // 參數(shù): none.
  470. // 返回: none.
  471. // 版本: V1.0, 2012-11-22
  472. //========================================================================
  473. void UpdatePwm(void)
  474. {
  475.                 P_SW2 |= 0x80;
  476.           PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //設(shè)置占空比時間
  477.     PWMA_CCR1L = (u8)(PWM1_Duty);
  478.           PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //設(shè)置占空比時間
  479.     PWMA_CCR2L = (u8)(PWM2_Duty);
  480. //          PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //設(shè)置占空比時間
  481. //    PWMA_CCR3L = (u8)(PWM3_Duty);
  482. //          PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //設(shè)置占空比時間
  483. //    PWMA_CCR4L = (u8)(PWM4_Duty);
  484.                 P_SW2 &= 0x7f;
  485. }

復(fù)制代碼
回復(fù)

使用道具 舉報

ID:587810 發(fā)表于 2023-4-20 13:35 | 顯示全部樓層
可以吧按鍵1和2接到P1.0和P1.1上,led1與led2接到P1.2與P1.3上,然后判斷這兩個引腳的按下的狀態(tài),在通過程序判斷從而控制三個燈的亮滅
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2023-4-20 15:16 | 顯示全部樓層
太為難你了。沒事?lián)Q個東西玩玩,別玩這個燈,煩人。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 国产精品永久免费观看 | 91精品国产乱码久久久久久 | 一级大片免费 | 日韩成人免费视频 | 欧美白人做受xxxx视频 | 日韩欧美中文 | 亚洲精品久久久久久久久久久 | 国产成人一区在线 | 伊人超碰| 国产精品日产欧美久久久久 | 国产在线精品一区二区 | 久久久精品一区 | 中文字幕一区二区三 | 99久热在线精品视频观看 | 中文字幕精品一区二区三区精品 | 日本天天操 | 日本视频免费观看 | 亚洲综合成人网 | 精品成人 | 国产一二三区免费视频 | 精品日韩一区二区三区av动图 | 超碰97人人人人人蜜桃 | 国产精品一区二区三区久久久 | 国产精品日韩在线观看一区二区 | 精品欧美一区二区三区久久久 | 雨宫琴音一区二区在线 | 国产在线小视频 | 日批的视频 | 日本中文字幕在线视频 | 免费观看www | 亚洲精品视频免费观看 | 日日噜噜噜夜夜爽爽狠狠视频, | 91在线电影 | 亚洲一区 | 日韩乱码一二三 | 亚洲色欲色欲www | 91精品国产自产在线老师啪 | 看特级黄色片 | 国产日韩欧美一区二区 | 天堂网中文字幕在线观看 | 日韩视频在线播放 |