|
聲光報(bào)警器仿真原理圖(文件下載請(qǐng)轉(zhuǎn)http://www.zg4o1577.cn/bbs/dpj-115948-1.html)

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