
占空比就是调整led通过电流和不通过电流的时间比来控制的,由于人眼有视觉暂留特性,所以只要频率比较高是看不出来闪烁的,当然通过电流比不通过电流的时间比例越大,led做的功就越多,这样也就越亮,需要注意的是led芯片的温升和最大电流值不要超标,不然会影响其寿命
/
模拟PWM输出控制灯的10个亮度级别
将定时器2溢出定为1/1200秒。每10次脉冲输出一个120HZ频率。
这每10次脉冲再用来控制高低电平的10个比值。
这样,在每个1/120秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED灯的10个级别的亮度。
/
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#include <reg52h> //包括一个52标准内核的头文件
sbit P10 = P1^0; //要控制的LED灯
sbit K1= P3^2; //按键K1
uchar scale;//用于保存占空比的输出0的时间份额,总共10份
char code dx516[3] _at_ 0x003b;//这是为了仿真设置的
//模拟PWM输出控制灯的10个亮度级别
void main(void) // 主程序
{
uint n;
RCAP2H =0xF3; //赋T2的预置值,溢出1次是1/1200秒钟
RCAP2L =0x98;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1) //程序循环
{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
scale++;
if(scale==10)scale=0;
}
}
//1/1200秒定时器2中断
timer2() interrupt 5
{
static uchar tt; //tt用来保存当前时间在一秒中的比例位置
TF2=0;
tt++;
if(tt==10) //每1/120秒整开始输出低电平
{
tt=0;
if(scale!=0) //这里加这一句是为了消除灭灯状态产生的鬼影
P10=0;
}
if(scale==tt) //按照当前占空比切换输出高电平
P10=1;
}
――――――――――――――――――
在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。
编译,运行,看结果。
可以看到,LED的亮度以每种亮度1秒左右不断变化,共有10个级别。
所加PWM信号的占空比。通过改变所加信号的占空比去控制IC的输出脉冲。再由IC去控制开关管。实现PWM调光。
PWM控制信号去控制IC然后IC再控制开关管就是这么个原理。改变导通与关断的时间比也就是你说的开一会关一会。来改变LED的明暗度。开与关的过程是很短暂的。人眼是感觉不出来的。调试这种电路的时候用示波器可以很明显的看出占空比的改变。
// PWM 控制 LED 灯渐亮渐灭程序
// 适用 ME300B 开发系统
// 晶振为110592M
// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。//#include < reg51h >
#include < intrinsh >sbit K1 =P1^4 ; //增加键
sbit K2 =P1^5 ; //减少键
sbit BEEP =P3^7 ; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);//
void main()
{ P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数
TL0=0x66 ; //频率调节 TH1=PWM ; //脉宽调节
TL1=0 ; EA=1;
ET0=1;
ET1=1;
TR0=1 ; while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0); do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}//
// 定时器0中断服务程序
//
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}//
// 定时器1中断服务程序
//
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}//
//蜂鸣器子程序
//void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
} //
// 延时子程序
//
void delay(unsigned char t)
{
while(t--) ;
}//
// 延时子程序
//
void delayms(unsigned char ms) {
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
首先要确定PWM的周期T和占空比D,确定了这些以后,可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则DT=nt,类似的可以求出PWM低电平时间需要多少个时间基准n‘。
那么就可以编写程序,根据定的时间基准t给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了n’ 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形。
以上就是关于占空比是怎么控制LED亮度的,举个例子说说。全部的内容,包括:占空比是怎么控制LED亮度的,举个例子说说。、请问:单片机使用C语言编程,怎样控制led灯的完成亮度强弱变换、LED的PWM调光原理 占空比与输出电流关系等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)