本帖最后由 宋-_菜刀-、 于 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;
sta
tic 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--这句话就没有意义了啊。。。不知道看明白了没有(可以看看原帖,很好)。不过,我对调了位置以后,不管是彷真或者实际操作,放在两个位置出来的结果都没有区别。纳尼?请高手为我解答。。谢谢了
一周热门 更多>