单片机利用PWM原理控制灯的渐变的问题

2019-07-16 04:16发布

本帖最后由 宋-_菜刀-、 于 2012-10-20 22:22 编辑

在学习单片机的时候发现了一个很好的帖子(http://bbs.elecfans.com/jishu_184829_1_1.html),在此感谢作者!里面有教怎么利用PWM原理控制灯的渐变,我照着写了一遍。发现了一个很奇怪的问题。代码如下://这是定时器的c文件,main.c里就是死循环而已了。
#include<reg51.h>
#include"MyDefine.h"
#define LED P1
#define LED_ON() LED=0X00;
#define LED_OFF() LED=0Xff;
static uint8 Count=0;//计数是否达到了20MS
static uint8 Direction=0;//亮还是灭的方向
static int8 PWM=0;//
//static int8 tempPWM=0;位置1
void Timer0Init(void)
{         
       TMOD&=0xf0;         
       TMOD|=0x01;      
       TH0=0XFF;//200us的中断         
    TL0=0X37;
         TR0=1;
         ET0=1;
}
void Timer0Isr(void)interrupt 1
{
         static int8 tempPWM=0;//位置2
         TH0=0XFF;
         TL0=0X37;
          if(++Count>=100)
         {
                  Count=0;
                  if(PWM<=99&&Direction==0)
                  {
                           ++PWM;
                              if((PWM)>99)
                           {
                                    Direction=1;
                                    PWM=99;
                           }
                  }
                  if(PWM>=0&&Direction==1)
                  {
                           --PWM;
                           if((PWM)<0)
                           {
                                    Direction=0;
                                    PWM=0;
                           }
                  }
                  tempPWM=PWM;
             }
         if(tempPWM>0)
         {
                  LED_ON();
                  tempPWM--;
         }
         else
         {
                  LED_OFF();
        }
         
}
我觉得应该把 static int8 tempPWM=0;放在位置1啊,因为我觉得这样才能算是PWM。不然每次到了200us的中断的时候如果不是到100次(也就是20MS)那么灯就一直是灭的(LED_OFF())。也就是说在这100次里有99次都是灭着的,而只有1次灯亮着。tempPWM--这句话就没有意义了啊。。。不知道看明白了没有(可以看看原帖,很好)。不过,我对调了位置以后,不管是彷真或者实际操作,放在两个位置出来的结果都没有区别。纳尼?请高手为我解答。。谢谢了
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。