基于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;

      

   }

sitemap