// 利用定時器控制產生占空比可變的 PWM 波
// 按K5,PWM值增加,則占空比減小,LED 燈漸暗。
// 按K6,PWM值減小,則占空比增加,LED 燈漸亮。
// 當PWM值增加到最大值或減小到最小值時,蜂鳴器將報警。
/*********************************************************/
#include < reg51.h >
#include < intrins.h >
sbit K5 =P3^2 ; //增加鍵
sbit K6 =P3^3 ; //減少鍵
sbit BEEP =P3^7 ; //蜂鳴器
unsigned char PWM=0x7f ; //賦初值
void Beep();
void delayms(unsigned char ms);
/*********************************************************/
void main()
{
P2=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延時常數 12M
TL0=0x18 ; //頻率調節
// TH1=PWM ; //脈寬調節
// TL1=0 ;
EA=1;
ET0=1;
ET1=1;
TR0=1 ;
while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K5==0);
do{
if(PWM!=0x00)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K6==0);
}
}
/*********************************************************/
// 定時器0中斷服務程序.
/*********************************************************/
void timer0() interrupt 1
{
// TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TR1=1 ;
P2=0x00 ; //啟動輸出
}
/*********************************************************/
// 定時器1中斷服務程序
/*********************************************************/
void timer1() interrupt 3
{
TH1=PWM ; //用定時器的方式2,是數據重裝TH-TL中,改變PWM的值即該變定時器的初值
TR1=0 ;
P2=0xff ; //結束輸出
}
/*********************************************************/
//蜂鳴器子程序
/*********************************************************/
void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delayms(2) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //關閉蜂鳴器
delayms(100);
}
/*********************************************************/
// 延時子程序
/*********************************************************/
void delayms(unsigned char ms)
{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}
/*********************************************************/
你想讓輸出口是P1^7,我這用的是P2口為輸出,將其變化一下即可
|