字号:    

PWM控制LED渐亮渐灭

 

111流水灯实验通过单片机控制LED的渐亮渐灭,通常在做流水灯时只用到I/O口的两种状态,

就是输出“1”或“0”,对于本实验板的发光二极管,采用了共阳联接(参见 原理图 ),当I/O口输出“0”时,LED就亮,为“1”时,LED就熄。问题来了,既然I/O口只能输出两种状态,如何实现渐亮或渐灭?这就要借助PWM(Pulse width modulation 脉冲宽度调制)

1.PWM简介
 

111要理解PWM 先要了解其中两个重要参数,周期T(调制频率f=1/T)和占空比,图1分别标示10%,50%,90%占空比的脉冲信号,对

于固定的模拟信号输入值,例如,9V,占空比10%代表模拟输出值为9x10%=0.9V,同样道理; 50%占空比相当于模拟输出值为4.5V,而

90%占空比相当于模拟输出值为8.1V,下面举个现实例子来说明,参见图2电路,输入电压为9V,电路中有一个开关和一个小灯炮,如

果我们合上开关50ms, 在此时间隔内,灯炮将得到9V的供电,然后再断开开关50ms,在此时间间隔内,灯炮将没有供电,如果我们在

一秒内重复上述开合动作10次,我们可以看到灯炮的亮度与接在4.5V电源时一样。我们定义此种状态为:50%占空比,10Hz的调制频

率(因每秒重复10次)。调制频率也是一个重要的参数,可以想象,图2的电路,如果合上开关持续5秒,断开开关持续5秒,此时的

占空比也是50%,但你是看不到灯炮像接在4.5V电源时的效果的,只能看到灯亮,然后灭,是不连续的。所以说要实现PWM控制,必须

同时满足调制频率和占空比两个参数才可以。

 
图1
 
图2
 
2.单片机程序
 

111经过以上的介绍,我想大家的思路都出来了吧,在调制频率足够小的前提下,不同的占空对应于不同的电压输出,而不同的电压

对应不同的LED亮度,这样,我们可以通过改变占空比,就可以实现LED的渐亮渐灭控制了。以下C51程序是运用PWM来控制LED(

P1_0口)的渐亮渐灭.

 
#include <at89x51.h>
#define uchar unsigned char
#define uint unsigned int

uchar percent,light,times;//percent,times:占空比控制;light:控制渐亮渐灭
uint i;

void delay();//延时函数

void pulse() interrupt 1 using 0 //定时器0中断服务程序

{

TH0 = -500/256;
TL0 = -500%256;
if (times++ == percent) P1_0 = 0;
else if (times == 100) {times = 0;P1_0 = 1;}

}

void main()
{
times = 0;
percent = 0;
light = 1;
TMOD = 0x01; //定时器0工作在方式1;
TH0 = -500/256; //赋初值,不同的TH0和TL0值对应不同的调制频率,而上面已说过,调制频率不能太高,否则
TL0 = -500%256; //会达不到调节效果。

EA = 1;
ET0 = 1;
TR0 = 1;
do
{

delay();
if (percent <100 && light==1) percent = percent+5;//调节percent值可以改变占空比,通过不同的占空比,输出不同的电
else light = 0;
if (percent >0 && light ==0) percent = percent-5; //压,从而实现渐亮渐灭调节
else light = 1; //改变percent的增减幅度可以控制速度的快慢

}
while(1);

}

void delay()

{
for(i = 0;i<7576;i++);
}

111keil c 程序下载 | hex文件下载
 
提示:如果你已在使用KEIL C,则可下载上述的keil c 程序,直接打开,并编译即得用来烧写的hex格式代码,当然,也可以单独下载上述的hex文件直接使用,随你喜欢。
分类:电子知识
?次阅读
 2007-08-01 16:58