原创 [小雨的成长] 用PWM控制LED

2009-4-17 16:25 2495 5 5 分类: MCU/ 嵌入式

看我们以前做的流水灯呀,什么的,都是一直亮,有没有想过,让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.  大家可以参考下。。!!




     呵呵,我是小雨,希望,大家能和我一起成长!!!!


 


 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /3 下一条