找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3797|回复: 0
收起左侧

基于51单片机的pwm波产生

[复制链接]
ID:75926 发表于 2015-4-1 22:45 | 显示全部楼层 |阅读模式
利用定时器的中断来实现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;
      
   }
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表