/* 本程序是一個以89C51為核心的聲光報警器控制程序
系統的晶振頻率12MHz,外界報警觸發脈沖接至INT0,報警復位按鈕接P1.2,喇叭接P1.1
當外界報警脈沖觸發報警后,LED(接P1.0)以1Hz的頻率閃動,同時喇叭種發出"Wu,Wa......"的警笛聲
該聲音由1kHz和500Hz方波以0.5秒為間隔交替發聲
值班人員按動報警復位鈕后聲光報警停止。*/
#include "AT89X51.h"
bit hisound; /* 高音標志 */
sbit led=P1^0; /* 報警燈接口 */
sbit speak=P1^1; /* 喇叭接口 */
sbit stop=P1^2; /* 復位按鈕 */
unsigned char data i; /* 50ms中斷次數計數單元 */
void delayms(unsigned int x); /* 延時1ms倍數的延時子程序 */
void main(void)
{
IT0=1; /* 設置INT0為邊沿中斷 */
ET0=1; /* 允許T0中斷 */
ET1=1; /* 允許T1中斷 */
EX0=1; /* 允許INT0中斷 */
PT0=1; /* T0設為高級中斷 */
EA=1; /* 開中斷 */
hisound=1; /* 高音標志置1,先發高音 */
led=1; /* 熄滅報警燈 */
speak=0; /* 喇叭斷電 */
TMOD=0x11; /* 設T0、T1為定時器,方式1 */
TH0=0xfe; /* 0.5ms定時初值 */
TL0=0x0c;
TH1=0x3c; /* 50ms定時初值 */
TL1=0xb0;
i=10; /* 50ms中斷10次為0.5秒 */
stop=1; /* 允許報警復位按鈕輸入 */
while (1)
{
if (stop==0) /* 如果按下停止報警按鈕 */
{
delayms(20); /* 延時20ms消除開關抖動 */
}
if (stop==0)
{
TR0=0; /* 停止T0定時 */
TR1=0; /* 停止T1定時 */
led=1; /* 熄滅報警燈 */
speak=0; /* 關閉喇叭 */
}
}
}
/* INT0 中斷服務程序 */
void int0(void) interrupt 0
{
TR0=1; /* 啟動T0定時 */
TR1=1; /* 啟動T1定時 */
}
/* T0中斷服務程序 */
/* 用來產生救護車的警笛聲 */
void timer0(void) interrupt 1
{
if (hisound==1) /* 如果產生高音 */
{
TH0=0xfe; /* 0.5ms定時初值 */
TL0=0x0c;
}
else
{
TH0=0xfc; /* 1ms定時初值 */
TL0=0x18;
}
speak=!speak; /* 驅動喇叭的輸出取反 */
}
/* T1中斷服務程序 */
/* 用來產生0.5秒的定時 */
void timer1(void) interrupt 3
{
TH1=0x3c; /* 50ms定時初值 */
TL1=0xb0;
i=i-1;
if (i==0) /* 如果到0.5秒 */
{
i=10;
hisound=!hisound; /* 高音標志取反,變音 */
led=!led; /* 報警燈改變亮滅 */
}
}
/* 延時子程序,延時1ms的倍數 */
void delayms(unsigned int x)
{
unsigned char j;
while(x--)
{
for(j=0;j<123;j++){;}
}
}
|