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的明暗,用成影片就看不見了,所以說手機的攝影功能真的很爛,還好我放了電壓表囧