5400|2

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

PWM实现LED背光板渐亮渐灭 AT89S52 [复制链接]

第一次接触PWM脉宽调制,终于实现了LED背光板的渐亮渐灭,把代码贴出来。一则请大家指点,二则把实现的思想跟新人分享。
/*****************************************************************************
硬件说明:
AT89S52,晶振11.0592MHz。P3.6为一个LED背光板,等于0时发光。
P0.0为一个按键,按下时为0。
*****************************************************************************/
/******************************************************************************
程序思路说明:
LED背光板的渐亮渐灭实际上就是LED的亮度等级由低到高(渐亮)再由高到低(渐灭)的
过程,那么首先要通过PWM脉宽调制实现LED显示不同的亮度等级。(脉宽调制的基本原理
可以参考http://hi.baidu.com/gdmgb520/blog/item/077f0601810d1a047bec2cb7.html
怎么实现不同的亮度等级呢?假设在某个长度的周期(一个适当的时间长度)内如果LED
的管脚一直输出0(我这里输出0时LED背光板点亮),那么很显然LED肯定是最亮的;相
反如果一直输出1,那LED肯定是最暗的(也就是不亮)。如果在这个周期内管脚输出的是
脉冲波(10101010……)那么LED的亮度就只有最亮时的一半,或者说如果前一半时间是
高电平后一半时间是低电平,那LED的亮度也是最亮的一半,这是由于LED的余晖效应,但
这个时间必须恰当,不然LED就不是亮而是闪烁。下面这段代码即可实现LED显示在某个亮度
等级:

  1. void
  2. timer0(void) interrupt 1 using 2
  3. {
  4. static uchar counter=0;     
  5. //中断次数计数器变量
  6. TH0=V_TH0;                  
  7. //恢复定时器初始值
  8. TL0=V_TL0;
  9. counter++;
  10. if (counter<=(ZKB1))  
  11. //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整
  12.    {LED3=0;}
  13. else
  14.   
  15. {LED3=1;}
  16. if
  17. (counter==100)
  18. {counter=0;}
  19. }
复制代码
那么现在我们就可以依次变换LED的亮度等级,从而实现LED的渐亮渐灭了。若上面的定时器
中断是0.1ms触发一次、ZKB1=20,那么整个周期为0.1ms*100=10ms,LED3为低脉冲的时间
长度为20*0.1ms=2ms,显示亮度为最亮的20%。如果我们把100个不同的亮度等级挨个显示
一遍就出现了有暗到亮的渐亮过程或渐灭过程。那么我们就在每当counter==100的时候,
ZKB1++就行了(由暗到亮)。上面的程序第24行{}内加入ZKB1++;,并在第25行加入
if (ZKB1==100) ZKB1=0; 语句即可。这样看到的效果是LED由暗变亮然后又有暗变亮。
现在我们再加入由亮变暗。新增一个变量ZKB2,counter==100时ZKB2++,当ZKB2<=100
时ZKB1=ZKB2,实现有暗变亮;当100 200 么渐亮耗时1s,渐灭耗时1s,熄灭保持2s,然后开始下一个周期。
这里我还加了一个flag0变量,作用是当K0按下时使LED停止发光。

  1. ******************************************************************************/

  2. #include
  3. #define uchar unsigned char      
  4. #define
  5. V_TH0 0xff  //定时器0初值
  6. #define V_TL0 0xa3
  7. sbit LED3=P3^6;    ///背光片接口
  8. sbit K0=P0^0;
  9. unsigned
  10. char ZKB1,ZKB2;
  11. bit
  12. flag0;
  13. /*-------------------------定时器初始化-----------------------------------*/

  14. void init_sys(void)
  15. {
  16.   TMOD=0x01;   //定时器0工作在方式1
  17.   TH0=V_TH0;  
  18. //定时周期为0.1ms
  19.   TL0=V_TL0;
  20.   TR0=1;
  21.   ET0=1;
  22.   EA=1;
  23. }

  24. /*-----------------------定时器0中断函数---------------------------------*/

  25. void timer0(void) interrupt 1 using 2
  26. {
  27. static uchar counter=0;     
  28.              //中断次数计数器变量
  29. TH0=V_TH0;                                   
  30. //恢复定时器初始值
  31. TL0=V_TL0;
  32. if (flag0==1)
  33. {
  34.   counter++;
  35.   if
  36. (counter>=100)
  37.   {
  38.    counter=0;
  39.    ZKB2++;
  40.    if
  41. (ZKB2<=100)    //占空比变化部分
  42.    { ZKB1=ZKB2;}
  43.    else if
  44. (ZKB2<=200)
  45.    { ZKB1=200-ZKB2;}
  46.    else
  47.    { ZKB1=0;}
  48.   }

  49.   if (counter<=(ZKB1))      //当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整
  50.    
  51. LED3=0;
  52.   else
  53.     LED3=1;
  54.   if (ZKB2>399) ZKB2=1;
  55. }
  56. else

  57. {

  58.   LED3=1;
  59. }  
  60. }
  61. /*------------------------------主函数-------------------------------------*/
  62. void
  63. main (void)
  64. {
  65. init_sys();
  66.    while(1)
  67.    {

  68.   P0=0xff;
  69.   flag0=K0;
  70.    }
  71. }
复制代码
/***************************************************************************
小结:这里定时器的定时长度需要根据具体情况作出适当调节
****************************************************************************/

最新回复

楼主做的是呼吸灯吧,1s的渐变时间看似也是在闪烁,渐变时间稍微长一点就能达到像呼吸一样的亮灭过程了,不过需要的亮度等级也要非常多。  详情 回复 发表于 2010-4-28 16:05
点赞 关注
 

回复
举报

2771

帖子

0

TA的资源

裸片初长成(中级)

沙发
 
楼主就用一个单片机去控制一个LED??
请问怎么去PWM 100个LED?
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
楼主做的是呼吸灯吧,1s的渐变时间看似也是在闪烁,渐变时间稍微长一点就能达到像呼吸一样的亮灭过程了,不过需要的亮度等级也要非常多。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表