標(biāo)題: 關(guān)于PWM控制LED燈的程序,有幾個(gè)問(wèn)題不懂 [打印本頁(yè)]

作者: wulingjie    時(shí)間: 2018-5-3 22:56
標(biāo)題: 關(guān)于PWM控制LED燈的程序,有幾個(gè)問(wèn)題不懂
單片機(jī)小白,網(wǎng)上找的程序,有幾點(diǎn)問(wèn)題不懂,希望大神解答:這段程序中a的值是多少,為什么最小亮度設(shè)置是1,最大是100,而總等級(jí)數(shù)是101,這應(yīng)該怎么理解,不應(yīng)該是100嗎。萬(wàn)分感謝。
單片機(jī)源碼:
  1. #include <REG51.h>//51頭文件
  2. /****************************************************************/
  3. //定義亮度變化
  4. #define DY_PORT          P2    //設(shè)置LED連接的I/O組
  5. #define DY_PWM          101    //設(shè)置明亮的總級(jí)數(shù)(級(jí)數(shù)過(guò)大會(huì)出現(xiàn)閃爍)
  6. (值域:0~65535)
  7. #define DY_MAX          100    //設(shè)置最大亮度(值域:小于明亮總級(jí)數(shù))
  8. #define DY_MIN      1     //設(shè)置最小亮度(值域:明亮大于等于1,小于最大亮度)
  9. sbit DY_KEY1 = P1 ^ 0;             //亮度加
  10. sbit DY_KEY2 = P1 ^ 1;             //亮度減

  11. /****************************************************************/
  12. // 1ms延時(shí)程序(12MHz 10倍于51單片機(jī)速度時(shí))
  13. void delay (unsigned inta){
  14.       unsigned char i;
  15.       while( --a != 0){
  16.              for(i = 0; i < 12; i++);
  17.       }                                 
  18. }
  19. /****************************************************************/
  20. //顯示程序(50ms的PWM寬度)
  21. void display (unsignedint a){
  22.       DY_PORT = 0x00;                //LED小燈亮
  23.       delay (a);                                 //延時(shí)a的長(zhǎng)度
  24.       DY_PORT = 0xff;                   //LED小燈滅
  25.       delay (DY_PWM-a);               //延時(shí)總PWM長(zhǎng)度減a
  26. }

  27. /****************************************************************/
  28. //主程序
  29. void main (void){
  30.       unsigned int k=5;
  31.       while (1){
  32.              display(k); //
  33.              if(DY_KEY1 == 0){                            //如果按鍵按下則繼續(xù)
  34.                     delay(20);                                       //消抖延時(shí)20mS
  35.                     if(DY_KEY1 == 0){                     //如果按鍵按下則繼續(xù)
  36.                            k++;
  37.                            if(k>DY_MAX){
  38.                                   k = DY_MAX;
  39.                            }
  40.                            while(DY_KEY1 == 0);         //等待按鍵松開
  41.                     }
  42.              }
  43.              if(DY_KEY2 == 0){                            //如果按鍵按下則繼續(xù)
  44.                     delay(20);                                        //消抖延時(shí)20mS
  45.                     if(DY_KEY2 == 0){                     //如果按鍵按下則繼續(xù)
  46.                            k--;
  47.                            if(k<DY_MIN){
  48.                                   k = DY_MIN;
  49.                            }
  50.                            while(DY_KEY2 == 0);          //等待按鍵松開
  51.                     }
  52.              }
  53.     }
  54. }
復(fù)制代碼



作者: st5ltn    時(shí)間: 2018-5-4 08:59
這個(gè)和他的程序處理方式有關(guān),      delay (DY_PWM-a); 是為了保證DY_PWM-a>0;你在仔細(xì)看看delay函數(shù)的寫法,參數(shù)的如果等于0會(huì)有問(wèn)題。
作者: 余暉    時(shí)間: 2018-5-4 09:32
本帖最后由 余暉 于 2018-5-4 09:35 編輯

a為一個(gè)形參,你可以理解為一個(gè)參數(shù),初始值由main中指令unsigned int k=5;得出k=5,由指令 display(k);將k傳遞給a;
作者: 余暉    時(shí)間: 2018-5-4 09:33
由這條指令 display(k);將k值傳遞給a




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1