/****************************************************************************?
功能:LED燈慢慢變暗,再慢慢變亮。
用定時器模擬的PWM調制。單片機:AT89S52
******************************************************************************/?
#include?<reg52.h>?
#define?V_TH0?0XFF?//設定定時器0,高8位的初值?
#define?V_TL0?0XF6?//設定定時器0,低8位的初值
#define?V_TMOD?0X01?//設定定時器0的工作方式為:方式1(計數位數是16位?//,由TL0作為低8位、TH0作為高8位)
#define?uchar?unsigned?char?
#define?uint?unsigned?int
void?init_sys();?//系統初始化函數
void?delay(uint);//延時函數
unsigned?char?ZKB;//占空比
void?main?(void)?
{?
init_sys();//初始化
while(1)
{?
for(ZKB=5;ZKB<40;ZKB=ZKB+2)?//每調節壹次占空比,就延時大概8ms左右,這使得LED現象更明顯{
delay(8);?
}
for(ZKB=40;ZKB>5;ZKB=ZKB-2){
delay(8);?
}
}?
}
void?delay(uint?z)
{
uint?x,y; for(x=z;x>0;x--) for(y=100;y>0;y--);?}
void?init_sys()/*系統初始化函數*/?
{?
/*定時器初始化*/? TMOD=V_TMOD;? TH0=V_TH0;? TL0=V_TL0;? TR0=1;? ET0=1;? EA=1;?}
void?timer0(void)?interrupt?1?using?2?
{?
static?uchar?click=0;//中斷次數計數器變量 TH0=V_TH0;//重新恢復定時器初始值 TL0=V_TL0;? ++click;//每計數10次,產生壹個中斷,並且click增加壹個 if?(click>=100) click=0;?//計滿壹百次,這重新計數。 /*因為計壹次數的時間是1us,10次產生壹個中斷,也就是壹個中斷10us。100個中斷為1ms。則,可以在這100個數中隨便取值,用於表示占空比的多少,占空比的範圍為(1~100)*/
if?(click<=ZKB)?//當小於占空比值時輸出低電平,高於時是高電平,從而實現占空比的調整?P1=0x00;?//P1口接的是LED燈
else?P1=0xff;
}
此程序的總中斷時間為100ms,即頻率為:100KHZ,占空比從5?變為40(即5%~25%)。