/* 本程序是一个以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++){;}
}
}
|