看我们以前做的流水灯呀,什么的,都是一直亮,有没有想过,让LED渐明渐暗呢?<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
好,今天 ,我就教大家一个方法来实现渐明渐暗的LED.这里我们要用到的就是PWM技术,这个在工业上用的很广,希望大家,能通过我的贴子,对PWM有一定的了解。
这里我先给大家简单的说说什么PWM?
PWM的全称是Pulse Width Modulation(脉冲宽度调制),随着电子技术的发展,出现了多种PWM技术,其中包括:相电压控制PWM、脉宽PWM法、随机PWM、SPWM法、线电压控制PWM等,而本文介绍的是在镍氢电池智能充电器中采用的脉宽PWM法。它是把每一脉冲宽度均相等的脉冲列作为PWM波形,通过改变脉冲列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当控制方法即可使电压与频率协调变化。可以通过调整PWM的周期、PWM的占空比而达到控制充电电流的目的。
更多的PWM资料大家可以去我的BLOG看看。
网址:http://home.cepark.com/?6136
我主要是通过程例给大家说如何来控制。。
该程序的硬件电路:就是在P0.0接一个LED.
我们来看程序:
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,temp;
sbit led=P0^0; //上面是调函数,申明部分。
void main()
{
TMOD=0x01; //用到了定时器0,工作方式1.
TH0=(65536-500)/256;
TL0=(65536-500)%256; //给定时器赋初值,
EA=1;
ET0=1;
TR0=1; //上面是打看定时器1中断
count=1;
temp=1; //给我们定义的变量赋初值。
while(1) //主程序的大循环。
{
if(count==45) //当count加到45时,进入这个IF语句。
{
count=0;
temp++; //同时temp加1.
}
if(count<=temp) //这里就是我们为什么能加渐明渐亮的关键。
{
led=0; //count,temp这两个变量都会变,只是一个快一个慢
}
else led=1;
if(temp==45)
temp=0;
}
}
void into() interrupt 1 //这是定时中断,服务程序,定时时间到了。Count加1
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
count++;
}
下面我来结合上面的程序,说说它是如何实现PWM的。
大家做过,数码管的动态扫描的话,就一定看到过如里没有写好,不应该亮的数码管亮了,只是亮度不高,为什么会亮,为什么会亮度不高呢?
因为,他点亮的时间很短,只有几个机器周期,那我们想,如里我们能控制它,不就能实现,明暗不同的LED啦。。!!
对我们就是这样做的,我们这里是用的周期不变,只是高低电平时间变的方面来实现,
我们再来看看主函数中的大循环中的内容。
if(count==45) ①
{
count=0;
temp++;
}
if(count<=temp) ②
{
led=0;
}
else led=1;
if(temp==45)
temp=0;
一开始,count,temp都是1。中断一次count加1,为2,判断①,不满足,来到②,led=1.灭。
当count加了45次后,temp加1,这时,led能亮的时间为count=1,和count=2;
当再次count加了45次后,temp再加1.led能亮的时间为count=1,count=2,count=3.
这样下去,led亮的时间会越来越长,temp=45后,再重来。!!
这面,led亮与不亮的时间,就在不断的变化,从而达到了我们的目的。
大家,可以用PROTEUS来仿真用其中的示波器看到占空比的变化。。很有趣的。!!
呵呵。。。。不难吧。。!!想明白了不难。。可是我刚写这个的时候,还是写了1个小时。。。
大家可以试试,让亮从暗到明,再从明到暗,还有做一个由明到暗的流水灯,!
我也会把这两个程序写出来。。发在bbs.cepark.com. 大家可以参考下。。!!
呵呵,我是小雨,希望,大家能和我一起成长!!!!
文章评论(0条评论)
登录后参与讨论