8051輸出PWM控制LED燈明亮度
這裡使用AT89S51做實驗,因無內建PWM功能(W78E65有),所以使用計時器來產生PWM波,改變流過LED的電壓來產生燈明暗變化。
1.電路圖
點圖可以放大
2.C程式
#include <regx51.h>
void timer0_initialize(void);
unsigned int sp=1843; //100Hz===>9216,高電位佔20%=9216*0.2=1843個機械週期
unsigned int sn=7373; //低電位佔80%=9216*0.8=7373個機械週期
unsigned int temp; //供計時器運算變數
void delay(unsigned char b) //延遲副程式
{
unsigned char i,j;
for(i=0;i<b;i++)
for(j=0;j<255;j++);
}
void timer0_initialize(void) //初始化計時器0
{
EA=0;
IE|=0x82;
TMOD|=0x01;
temp=65536-sp;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P1_0=1;
}
void timer0_isr(void) interrupt TF0_VECTOR using 1 // 用計時器0產生PWM波
{
if(P1_0==1)
{
TR0=0;
temp=65536-sn;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P1_0=0;
}
else
{
TR0=0;
temp=65536-sp;
TH0=temp/256;
TL0=temp%256;
TR0=1;
P1_0=1;
}
}
main()
{
timer0_initialize();
P1_0=0;
while(1) //主程式無限迴圈偵測P2_0~P2_5按鈕改變PWM佔空比
{
delay(10);
if(P2_0==0)sn=9206; //低電位佔100%,燈全暗 電壓=0.4V
if(P2_1==0)sn=7373; //低電位佔 80%,高電位佔20%=燈20%亮 電壓=1.1V
if(P2_2==0)sn=5530; //低電位佔 60%,高電位佔40%=燈40%亮 電壓=1.8V
if(P2_3==0)sn=3686; //低電位佔 40%,高電位佔60%=燈60%亮 電壓=2.5V
if(P2_4==0)sn=1843; //低電位佔 20%,高電位佔80%=燈80%亮 電壓=3.2V
if(P2_5==0)sn=10; //高電位佔100%,燈全亮 電壓=3.8V
sp=9216-sn; //高電位=9216-低電位
}
}
3.執行影片
真實中看的見LED的明暗,用成影片就看不見了,所以說手機的攝影功能真的很爛,還好我放了電壓表囧