/***************************************************************
* 程序說明:使用P3.2和P3.4來控制P0端口的LED燈,達到手動調節漸亮或漸滅(也可一直按著),
到最亮或最暗時蜂鳴器發出提示聲音;
////////////////////////////////////////////////////////////////
晶振 11.0592M
* 利用定時器控制產生占空比可變的 PWM 波
* 按int0鍵,PWM值增加,則占空比減小,LED 燈漸暗。
* 按t0鍵,PWM值減小,則占空比增加,LED 燈漸亮。
什么是PWM技術?簡而言之,PWM是一種對模擬信號電平進行數字編碼的方法。通過計
數器的使用,方波的占空比被調制用來對一個具體模擬信號的電平進行編碼。PWM信號仍然
是數字的,因為在給定的任何時刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。
電壓或電流源是以一種通(ON)或斷(OFF)的重復脈沖序列被加到模擬負載上去的。通的時候即
是直流供電被加到負載上的時候,斷的時候即是供電被斷開的時候。只要帶寬足夠,任何模擬
值都可以使用PWM進行編碼。
MCS-51系列單片機本身無PWM輸出功能, 但可以采用定時器配合軟件的方法對輸出脈沖進行調
寬來模擬實現,對精度要求不是太高的場合是非常實用的。
****************************************************************/
#include <reg52.h >
#include <intrins.h >
sbit S1 =P3^2; //定義P3.2為增加鍵
sbit S2 =P3^4; //定義P3.3為減少鍵
sbit leds =P1^4; //定義P3.3為減少鍵
sbit BELL =P2^2; //定義蜂鳴器
unsigned char PWM=0x7f; //PWM賦初值
void Bee();
void delayms(unsigned char ms);
void delay(unsigned char t);
/*--------------------------------------------------*/
void main() //主程序
{
leds =0;
P0=0xff;
TMOD=0x21;
TH0=0xfc; //1ms延時常數
TL0=0x66; //頻率調節
TH1=PWM ; //脈寬調節
TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Bee();
}
while(S1==0);
do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Bee() ;
}
while(S2==0);
}
}
// ---------------------------定時器0中斷服務程序
void timer0() interrupt 1
{
TR1=0;
TH0=0xfc;
TL0=0x66;
TH1=PWM;
TR1=1;
P0=0x7f ; //啟動輸出
}
//---------------------------- 定時器1中斷服務程序
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //結束輸出
}
//-------------------------------蜂鳴器子程序
void Bee()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BELL=!BELL ;//BeLL取反
}
BELL=1 ; //關閉蜂鳴器
delayms(100);
}
//-------------------------------- 延時子程序1
void delay(unsigned char t)
{
while(t--);
}
//--------------------------------- 延時子程序2
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
} |