基于51PWM调节LED背光.doc

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
基于51PWM调节LED背光

PWM实现LED背光板渐亮渐灭 AT89S52 第一次接触PWM脉宽调制,终于实现了LED背光板的渐亮渐灭,把代码贴出来。一则请大家指点,二则把实现的思想跟新人分享。 /***************************************************************************** 硬件说明: AT89S52,晶振11.0592MHz。P3.6为一个LED背光板,等于0时发光。 P0.0为一个按键,按下时为0。 *****************************************************************************/ /****************************************************************************** 程序思路说明: LED背光板的渐亮渐灭实际上就是LED的亮度等级由低到高(渐亮)再由高到低(渐灭)的 过程,那么首先要通过PWM脉宽调制实现LED显示不同的亮度等级。(脉宽调制的基本原理 可以参考/gdmgb520/blog/item/077f0601810d1a047bec2cb7.html) 怎么实现不同的亮度等级呢?假设在某个长度的周期(一个适当的时间长度)内如果LED 的管脚一直输出0(我这里输出0时LED背光板点亮),那么很显然LED肯定是最亮的;相反如果一直输出1,那LED肯定是最暗的(也就是不亮)。如果在这个周期内管脚输出的是脉冲波…)那么LED的亮度就只有最亮时的一半,或者说如果前一半时间是高电平后一半时间是低电平,那LED的亮度也是最亮的一半,这是由于LED的余晖效应,但这个时间必须恰当,不然LED就不是亮而是闪烁。下面这段代码即可实现LED显示在某个亮度等级: void timer0(void) interrupt 1 using 2 { static uchar counter=0;? ?? ?//中断次数计数器变量 TH0=V_TH0;? ?? ?? ?? ?? ?? ? //恢复定时器初始值 TL0=V_TL0; counter++; if (counter<=(ZKB1))? ?//当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整 ? ?{LED3=0;} else ? ?{LED3=1;} if (counter==100) {counter=0;} } 那么现在我们就可以依次变换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<ZKB2<=200时ZKB1=200-ZKB2,实现由亮变暗;当200<ZKB2<=400时ZKB1=0,LED保持熄灭。从时间上来说,每一个亮度等级耗时10ms,那么渐亮耗时1s,渐灭耗时1s,熄灭保持2s,然后开始下一个周期。 这里我还加了一个flag0变量,作用是当K0按下时使LED停止发光。 ******************************************************************************/ #include <REG52.H> #define uchar unsigned char? ?? ? #define V_TH0 0xff??//定时器0初值 #define V_TL0 0xa3 sbit LED3=P3^6;? ? ///背光片接口 sbit K0=P0^0; unsigned char ZKB1,ZKB2; bit flag0; /*-------------------------定时器初始化-----------------------------------*/ void init_sys(void) { ??TMOD=0x01;? ?//定时器0工作在方式1 ??TH0=V_TH0;? ?//定时周期为0.1ms ??TL

文档评论(0)

xy88118 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档