LED 一般是恒流点亮的,如何改变 LED 的亮度呢?答案就是 PWM 控制。
在一定的频率的方波中,调整高电平和低电平的占空比,即可实现。
比如我们用低电平点亮一个 LED 灯,我们假设把一个频率周期分为
10 个时间等份,如果方波中的高低电平占空比是 9:1,这是就是一
个比较暗的亮度,如果方波中高低电平占空比是 10:0,这时,
全部是高电平,灯是灭的。如果占空比是 5:5,就是一个中间亮度,
如果高低比是 1:9,是一个比较亮的亮度,如果高低是 0:10,这时
全部是低电平,就是最亮的。
下面来分析我的程序,在这个程序中,我们将定时器 0 溢出定为 1/1000 秒。
每 10 次脉冲输出一个 100HZ 频率。这每 10 次脉冲再用来控制高低电平
的 10 个比值。这样,在每个 1/100 秒的方波周期中,我们都可以改变
方波的输出占空比,从而控制 LED 灯的 10 个级别的亮度。
为什么输出方波的频率要 100HZ 这么高?因为如果频率太低,人眼就会看
到闪烁感觉。一般起码要在 60HZ 以上才感觉好点,100HZ 就基本上看不到
闪烁,
只能看到亮度的变化了。
下面请看程序,程序中有比较多的注释:
//―――――――――――――――――――――――
#dene uchar unsigned char //定义一下方便使用
#dene uint unsigned int
#include <reg52.h> //包括一个 52 标准内核的头文件
sbit P10 = P1^0; //要控制的 LED 灯
uchar scale;//用于保存占空比的输出 0 的时间份额,总共 10 份
void main(void) // 主程序
{
uint n;
TMOD=0x01; //定时器 T0 工作在 16 位模式
TH0=(65536-1000)/256; //赋 T0 的高 8 位初值
TL0=(65536-1000)%256; //赋 T0 的低 8 位初值
TR0=1; //启动定时器
ET0=1; //打开定时器 0 中断
EA=1; //打开总中断
while(1) //程序循环
{ ;//主程序在这里就不断自循环,实际应用中,这里是做主要工作
for(n=0;n<50000;n++); //每过一会儿就自动加一个档次的亮度
scale++;
if(scale==10)scale=0;
}
}
评论12
最新资源