标题: 基于51单片机的pwm波产生 [打印本页]

作者: xiaos    时间: 2015-4-1 22:45
标题: 基于51单片机的pwm波产生
利用定时器的中断来实现PWM调制。如果我们设定脉冲的周期为1000毫秒;每20毫秒产生一次中断,则知道要中断50次。
那么我们可以这样编写程序
  TH0=0XFF;
  TL0=0XEC;这是定时器0产生一次中断的时间,即20毫秒产生一次中断。我们再定义一个计数的变量NUM,让NUM从0开始加到50,程序如下
   void Timer0Interrupt(void) interrupt 1
   {
       TH0 = 0x0FE;
       TL0 = 0x0C;
    NUM++;
     if(NUM==33)
      {
       NUM=0;
      }
      if(NUM<=PWM)P1=0x00;
      if(NUM>PWM)P1=0xff;
      
   }
  其中的PWM为0到50的数值,这样通过控制PWM的值让小于PWM的NUM值里所产生的中断全为低电平,大于PWM的为高电平,这样通过控制计数就实现了PWM。
所有程序如下
    #include<reg51.h>
          #define uint unsigned int
    #define uchar unsigned char
    sbit k1=P3^2;
    sbit k2=P3^3;
    sbit beep=P2^7;
    uchar PWM=10;   //用来控制脉宽
    uchar NUM; //中断次数变量
       void delay(uint t)
    {
       uchar j;
    while(t--)for(j=0;j<120;j++);
    }
   void bee()
   {
     beep=0;
  delay(10);
  beep=1;
  delay(10);
   
   }
      void  keycheck()
         {
      if(k1==0)
      {  
         delay(10);
        if(k1==0)
      {
        if(PWM!=0X20)
        {
      PWM++;
        delay(20);
         }
      }
      else
      bee();  
            }
      if(k2==0)
      {  
         delay(10);
        if(k2==0)
      {
        if(PWM!=0X01)
        {
        PWM--;
        delay(20);
        }
      }
       else
        bee();
                }  
         }   
  void InitTimer0(void)
  {
      TMOD = 0x01;
      TH0 = 0xfe;    //我们设定500毫秒中断一次 共中断32次即一个周期
      TL0 = 0x0c;
      EA = 1;
      ET0 = 1;
      TR0 = 1;
  }
     void main()
  {     
      InitTimer0();     
    while(1)
  {   
         
   keycheck();  
  }
      }
    void Timer0Interrupt(void) interrupt 1
   {
       TH0 = 0x0FE;
       TL0 = 0x0C;
    NUM++;
     if(NUM==33)
      {
       NUM=0;
      }
      if(NUM<=PWM)P1=0x00;
      if(NUM>PWM)P1=0xff;
      
   }





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