📄 模拟pwm 输出控制灯的10 个亮度.c
字号:
/* 第14 课,模拟PWM 输出控制灯的10 个亮度级别
LED 一般是恒流操作的,如何改变LED 的亮度呢?答案就是PWM 控制。在一定的
频率的方波中,调整高电平和低电平的占空比,即可实现。比如我们用低电平点亮一个LED
灯,我们假设把一个频率周期分为10 个时间等份,如果方波中的高低电平占空比是9:1,
这是就是一个比较暗的亮度,如果方波中高低电平占空比是10:0,这时,全部是高电平,
灯是灭的。如果占空比是5:5,就是一个中间亮度,如果高低比是1:9,是一个比较亮的
亮度,如果高低是0:10,这时全部是低电平,就是最亮的。
实际上应用中,电视屏幕墙中的几十百万LED 象素都是这样控制的,而且每一个象素
都有红绿蓝3 个LED,每个LED 可以变化的亮度是几百到几万或者更多的级别,以实现真
彩色的显示。还有在您的手机中,背光灯的亮度如果是可以变化的,也应该是这种工作方式。
目前的城市彩灯也有很多都使用了LED,需要控制亮度是也是PWM 控制。
下面来分析我们的例程,在这个例程中,我们将定时器2 溢出定为1/1200 秒。每10
次脉冲输出一个120HZ 频率。这每10 次脉冲再用来控制高低电平的10 个比值。这样,在
每个1/120 秒的方波周期中,我们都可以改变方波的输出占空比,从而控制LED 灯的10 个
级别的亮度。
为什么输出方波的频率要 120HZ 这么高?因为如果频率太低,人眼就会看到闪烁感
觉。一般起码要在60HZ 以上才感觉好点,120HZ 就基本上看不到闪烁,只能看到亮度的变
化了。
下面请看程序,程序中有比较多的注释:
――――――――――――――――――――――― */
#define uchar unsigned char//宏定义
#define uint unsigned int
#define ulong unsigned long
#include <reg51.h>//51内部说明
sbit P10=P1^0;//输出所在口
sbit K1=P3^2;//按钮输入口
uchar scale;//定义变量为无符号字符型,用于保存占空比的输出0 的时间份额,总共10 份
void main(void)//主程序开始
{
uint n;//定义无符号整型
TMOD=0X01;//T0定时器工作方式1,16位,赋T2 的预置值,溢出1 次是1/1200 秒钟=833。33uS
TH0=0xf3;//初值
TL0=0x98;
TR0=1;//开始计时
ET0=1;//允许T0中断
EA=1;//开总中断
while(1)//主程序循环
{
for(n=0;n<50000;n++);//延时
scale++;//变量自加
if(scale==10)//判断加到10则回0
scale=0;
}
}
timer2() interrupt 1//中断服务程序
{
static uchar tt;//定义无符号字符型静态变量
TF0=0;//溢出肝后清零
tt++;//自加
if(tt==10)//判断加到10则回0
{
tt=0;
P10=0;//P10给值
}
if(scale==tt)//否则如=scale则P10=1
P10=1;
}
/*――――――――――――――――――
在主程序中,每延时一段时间,就自动换一个占空比,以使亮度自动变化,方便观察。
编译,运行,看结果。
可以看到,LED 的亮度以每种亮度1 秒左右不断变化,共有10 个级别。
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -