/***************************************************************
* 程序說明:使用P3.2和P3.4來控制P0端口的LED燈,達(dá)到手動(dòng)調(diào)節(jié)漸亮或漸滅(也可一直按著),
到最亮或最暗時(shí)蜂鳴器發(fā)出提示聲音;
////////////////////////////////////////////////////////////////
晶振 11.0592M
* 利用定時(shí)器控制產(chǎn)生占空比可變的 PWM 波
* 按int0鍵,PWM值增加,則占空比減小,LED 燈漸暗。
* 按t0鍵,PWM值減小,則占空比增加,LED 燈漸亮。
什么是PWM技術(shù)?簡(jiǎn)而言之,PWM是一種對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼的方法。通過計(jì)
數(shù)器的使用,方波的占空比被調(diào)制用來對(duì)一個(gè)具體模擬信號(hào)的電平進(jìn)行編碼。PWM信號(hào)仍然
是數(shù)字的,因?yàn)樵诮o定的任何時(shí)刻,滿幅值的直流供電要么完全有(ON),要么完全無(OFF)。
電壓或電流源是以一種通(ON)或斷(OFF)的重復(fù)脈沖序列被加到模擬負(fù)載上去的。通的時(shí)候即
是直流供電被加到負(fù)載上的時(shí)候,斷的時(shí)候即是供電被斷開的時(shí)候。只要帶寬足夠,任何模擬
值都可以使用PWM進(jìn)行編碼。
MCS-51系列單片機(jī)本身無PWM輸出功能, 但可以采用定時(shí)器配合軟件的方法對(duì)輸出脈沖進(jìn)行調(diào)
寬來模擬實(shí)現(xiàn),對(duì)精度要求不是太高的場(chǎng)合是非常實(shí)用的。
****************************************************************/
#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延時(shí)常數(shù)
TL0=0x66; //頻率調(diào)節(jié)
TH1=PWM ; //脈寬調(diào)節(jié)
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);
}
}
// ---------------------------定時(shí)器0中斷服務(wù)程序
void timer0() interrupt 1
{
TR1=0;
TH0=0xfc;
TL0=0x66;
TH1=PWM;
TR1=1;
P0=0x7f ; //啟動(dòng)輸出
}
//---------------------------- 定時(shí)器1中斷服務(wù)程序
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //結(jié)束輸出
}
//-------------------------------蜂鳴器子程序
void Bee()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BELL=!BELL ;//BeLL取反
}
BELL=1 ; //關(guān)閉蜂鳴器
delayms(100);
}
//-------------------------------- 延時(shí)子程序1
void delay(unsigned char t)
{
while(t--);
}
//--------------------------------- 延時(shí)子程序2
void delayms(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<120;i++);
}
} |