圣源电子制作

标题: 单片机PWM控制LED灯渐亮渐灭C51程序 [打印本页]

作者: sydz    时间: 2011-11-12 11:43
标题: 单片机PWM控制LED灯渐亮渐灭C51程序
转载自互联网!!!

  1. // PWM 控制 LED 灯渐亮渐灭程序
  2. // 晶振为11.0592M
  3. // 利用定时器控制产生占空比可变的 PWM 波
  4. // 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
  5. // 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
  6. // 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

  7. #i nclude < reg51.h >
  8. #i nclude < intrins.h >

  9. sbit  K1 =P1^4 ;                    //增加键
  10. sbit  K2 =P1^5 ;                    //减少键
  11. sbit  BEEP =P3^7 ;                //蜂鸣器
  12. unsigned char PWM=0x7f ;   //赋初值

  13. void Beep();
  14. void delayms(unsigned char ms);
  15. void delay(unsigned char t);


  16. void main()
  17. {

  18.      P1=0xff;
  19.     TMOD=0x21 ;
  20.     TH0=0xfc ;             //1ms延时常数
  21.     TL0=0x66 ;            //频率调节

  22.     TH1=PWM ;            //脉宽调节
  23.     TL1=0 ;

  24.      EA=1;
  25.      ET0=1;
  26.      ET1=1;
  27.    
  28.      TR0=1 ;

  29.    while(1)
  30.    {
  31.      do{
  32.             if(PWM!=0xff)
  33.            {PWM++ ;delayms(10);}
  34.            else Beep() ;
  35.          }
  36.      while(K1==0);

  37.      do{
  38.            if(PWM!=0x02)
  39.           {PWM-- ;delayms(10);}
  40.            else Beep() ;
  41.           }
  42.      while(K2==0);
  43.    }
  44. }

  45. /*********************************************************/
  46. // 定时器0中断服务程序.
  47. /*********************************************************/
  48. void timer0() interrupt 1
  49. {
  50.     TR1=0 ;
  51.     TH0=0xfc ;
  52.     TL0=0x66 ;
  53.     TH1=PWM ;
  54.     TR1=1 ;
  55.     P0=0x00 ;      //启动输出
  56. }

  57. /*********************************************************/
  58. // 定时器1中断服务程序
  59. /*********************************************************/
  60. void timer1() interrupt 3
  61. {
  62.     TR1=0 ;
  63.     P0=0xff ;     //结束输出
  64. }

  65. /*********************************************************/
  66. //蜂鸣器子程序
  67. /*********************************************************/

  68. void Beep()   
  69.   {
  70.       unsigned char i  ;
  71.       for (i=0  ;i<100  ;i++)
  72.         {
  73.           delay(100)  ;
  74.           BEEP=!BEEP  ;                //Beep取反
  75.         }
  76.      BEEP=1  ;                            //关闭蜂鸣器
  77.      delayms(100);
  78.   }

  79. /*********************************************************/
  80. // 延时子程序
  81. /*********************************************************/
  82. void delay(unsigned char t)
  83. {
  84.     while(t--)   ;
  85. }

  86. /*********************************************************/
  87. // 延时子程序
  88. /*********************************************************/
  89. void delayms(unsigned char ms)

  90. {
  91.     unsigned char i ;
  92.     while(ms--)
  93.      {
  94.         for(i = 0 ; i < 120 ; i++) ;
  95.      }

  96. }
复制代码










欢迎光临 圣源电子制作 (https://sydz.syyyd.com/) Powered by Discuz! X3.4