?? 模擬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 + -