标题: 发个我用了很久的单片机PWM调节程序,0-9共10档调节。 [打印本页]

作者: 3760609865    时间: 2017-6-20 21:42
标题: 发个我用了很久的单片机PWM调节程序,0-9共10档调节。
是基于51单片机制作的,此pwm程序注释的很多,特别适合新手学习。本程序使用定时实现定时,使用开关语句实现档位调节。上电时档位0,停止时档位0,最大可加至档位9。 PWM-十档增减.rar (54.38 KB, 下载次数: 63)
仿真是新弄的Proteus 8 的文件。


单片机源程序如下:
  1. /*直流输出的脉宽调整,0-9共
  2. 10档9为最大输出,0-9的变
  3. 化规律为最小-最大,用两键实现增和减。
  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;// 时间可以调整 这个是20步调整 周期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)//达到所设高电平次数
  99. ……………………

  100. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码




作者: jxdianqi    时间: 2017-6-21 21:30
刚好想搞pwm,下载参考一下,谢谢
作者: zhao1524    时间: 2017-6-28 22:37
jxdianqi 发表于 2017-6-21 21:30
刚好想搞pwm,下载参考一下,谢谢

谢谢,好东西

作者: sundaykiller    时间: 2018-1-8 16:56
Proteus 8的原理图没有给出啊
作者: Xanthus    时间: 2018-1-13 16:56
MAKR 刚好想找相关的资料




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1