要用51产生
PWM去控制
LED,首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准T,比如定时器溢出N次的时间是PWM的高电平的时间,则D*T=N*T,类似的可以求出PWM低电平时间需要多少个时间基准N。
那么就可以编写程序,根据定的时间基准T给定时器赋值初始化,然后开启定时器,定义一个标志位Flag,根据Flag的状态决定输出高平还是低电平,假设 定义Flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 N,如果到了说明高电平的时间够了,那么就改变Flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据Flag=0的情况跳 去判断记录变量的值是否到了N 如果到了,说明PWM的低电平时间够了,那么就改Flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形。
#I Nclude
Unsigned Char CYCLE;
Unsigned Char Count = 0;
Unsigned Char PWM_ON;
Void Delay()
{
Unsigned Char I, J;
For(J = 100; J; J--)
For(I = 255; I; I--)
;
}
Void Main()
{
Bit Flag;
TMOD = 0x01;
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256;
IE = 0x82;
TR0 = 1;
CYCLE = 10;
While(!Flag)
{
Delay();
PWM_ON++;
If(PWM_ON == CYCLE)
{
Flag = 1;
}
}
While(Flag)
{
Delay();
PWM_ON--;
If(PWM_ON == 0)
{
Flag = 0;
}
}
}
Void Time0_server() Interrupt 1 Using 1
{
TH0 = (65536 - 100) / 256;
TL0 = (65536 - 100) % 256;
If(Count == PWM_ON)
{
P2 = 0xFF;
}
Count++;
If(Count == CYCLE)
{
Count = 0;
If(PWM_ON != 0)
{
P2 = 0;
}
}
}