標題: 發(fā)個我用了很久的單片機PWM調(diào)節(jié)程序,0-9共10檔調(diào)節(jié)。 [打印本頁]

作者: 3760609865    時間: 2017-6-20 21:42
標題: 發(fā)個我用了很久的單片機PWM調(diào)節(jié)程序,0-9共10檔調(diào)節(jié)。
是基于51單片機制作的,此pwm程序注釋的很多,特別適合新手學習。本程序使用定時實現(xiàn)定時,使用開關(guān)語句實現(xiàn)檔位調(diào)節(jié)。上電時檔位0,停止時檔位0,最大可加至檔位9。 PWM-十檔增減.rar (54.38 KB, 下載次數(shù): 63)
仿真是新弄的Proteus 8 的文件。


單片機源程序如下:
  1. /*直流輸出的脈寬調(diào)整,0-9共
  2. 10檔9為最大輸出,0-9的變
  3. 化規(guī)律為最小-最大,用兩鍵實現(xiàn)增和減。
  4. 朱旭東  
  5. 2011年11月4日 使用STC15F104E時,無顯示, 而且只有P3口 */

  6. #include <reg52.h>
  7. sbit KEY2 = P3^2;
  8. sbit KEY1 = P3^3;
  9. sbit KEY3 = P3^4;
  10. sbit PWM =P3^5;
  11. sbit PWM1 = P3^1;
  12. unsigned char CYCLE; //定義周期 如果是10 則周期是10 x 定時時間
  13. unsigned char PWM_ON ;//定義高電平時間
  14. void delay(unsigned int cnt)
  15. {
  16. while(--cnt);
  17. }

  18. main()
  19. {
  20. unsigned char PWM_Num=0;//定義檔位

  21. P0=0x3f;
  22. P3=0xff;//因為104E上電時P3.3為低電平
  23. TMOD |=0x01;//定時器設置 1ms in 12M crystal
  24. TH0=(65536-1000)/256;
  25. TL0=(65536-1000)%256;//定時1mS

  26. IE= 0x82;  //打開中斷
  27. TR0=1;

  28. CYCLE = 20;// 時間可以調(diào)整 這個是20步調(diào)整 周期20ms 如果閃爍可減小定時或周期
  29. while(1)
  30.   {
  31. if(!KEY1)//加
  32.   {
  33.    delay(60000);//104延時, 使用51時需要60000/12
  34.    if(!KEY1)
  35.      {
  36.       while(!KEY1);//松手檢查
  37.       PWM_Num++;
  38.           if(PWM_Num==10)PWM_Num=9;
  39.        switch(PWM_Num){
  40.        case 0:P0=0x3f;PWM_ON=0;break;//高電平時長
  41.        case 1:P0=0x06;PWM_ON=2;break;
  42.        case 2:P0=0x5b;PWM_ON=4;break;
  43.        case 3:P0=0x4f;PWM_ON=6;break;
  44.        case 4:P0=0x66;PWM_ON=8;break;
  45.        case 5:P0=0x6d;PWM_ON=10;break;
  46.        case 6:P0=0x7d;PWM_ON=12;break;
  47.        case 7:P0=0x07;PWM_ON=16;break;
  48.        case 8:P0=0x7f;PWM_ON=18;break;
  49.        case 9:P0=0x6f;PWM_ON=20;break;
  50.        default:break;
  51.      }
  52.    }
  53.   }

  54. if(!KEY2)//減
  55.   {
  56.    delay(60000);//104延時, 使用51時需要60000/12
  57.    if(!KEY2)
  58.      {
  59.       while(!KEY2);//松手檢查
  60.       PWM_Num--;
  61.           if(PWM_Num==-1)PWM_Num=0;
  62.        switch(PWM_Num){
  63.        case 0:P0=0x3f;PWM_ON=0;break;//高電平時長
  64.        case 1:P0=0x06;PWM_ON=2;break;
  65.        case 2:P0=0x5b;PWM_ON=4;break;
  66.        case 3:P0=0x4f;PWM_ON=6;break;
  67.        case 4:P0=0x66;PWM_ON=8;break;
  68.        case 5:P0=0x6d;PWM_ON=10;break;
  69.        case 6:P0=0x7d;PWM_ON=12;break;
  70.        case 7:P0=0x07;PWM_ON=16;break;
  71.        case 8:P0=0x7f;PWM_ON=18;break;
  72.        case 9:P0=0x6f;PWM_ON=20;break;
  73.        default:break;
  74.      }
  75.    }
  76.   }

  77.   if(!KEY3)  //停止
  78.   {
  79.    delay(60000);//104延時, 使用51時需要60000/12
  80.    if(!KEY3)
  81.      {
  82.       while(!KEY3);//松手檢查
  83.       PWM_ON=0;
  84.       PWM_Num=0;
  85.       P0=0x3f;
  86.      }
  87.      }

  88. }
  89. }


  90. /********************************/
  91. /*      定時中斷                */
  92. /********************************/
  93. void tim(void) interrupt 1 using 1
  94. {
  95. unsigned char count; //
  96. TH0=(65536-1000)/256;
  97. TL0=(65536-1000)%256;//定時1mS

  98. if (count==PWM_ON)//達到所設高電平次數(shù)
  99. ……………………

  100. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼




作者: jxdianqi    時間: 2017-6-21 21:30
剛好想搞pwm,下載參考一下,謝謝
作者: zhao1524    時間: 2017-6-28 22:37
jxdianqi 發(fā)表于 2017-6-21 21:30
剛好想搞pwm,下載參考一下,謝謝

謝謝,好東西

作者: sundaykiller    時間: 2018-1-8 16:56
Proteus 8的原理圖沒有給出啊
作者: Xanthus    時間: 2018-1-13 16:56
MAKR 剛好想找相關(guān)的資料




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