声光报警器仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /* 本程序是一个以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++){;}
- }
- }
复制代码
所有资料51hei提供下载:
声光报警器 (C语言,适用于Proteus 7.72).rar
(27.52 KB, 下载次数: 195)
|