单片机利用PWM原理控制灯的渐变的问题
时间:10-02
整理:3721RD
点击:
在学习单片机的时候发现了一个很好的帖子(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--这句话就没有意义了啊。不知道看明白了没有(可以看看原帖,很好)。不过,我对调了位置以后,不管是彷真或者实际操作,放在两个位置出来的结果都没有区别。纳尼?请高手为我解答。谢谢了
之前没弄好程序,不好看,现在弄好了,大家帮忙看看啊。唉,这个论坛的修改真难用啊
请问你说的时哪条语句
不好意思,最重要的没说。static int8 tempPWM=0这条,谢谢了
自己顶啊自己顶。
还是没有人回复吗
我知道原因了。因为static变量只是在第一次调用的时候初始化,以后都不会了。
嗯。,。
写地不好,请见谅
