C51-声光报警器

lemon Lv5

第三篇

一、功能模块解析

  1. ​引脚定义​​:

    • S1=P3^1:按键输入(低电平触发)
    • beep=P1^5:蜂鸣器输出
    • green=P2^0:绿灯控制(低电平亮)
    • red=P2^1:红灯控制(低电平亮)
  2. ​功能函数​​:

1
2
3
4
void delay(unsigned int i)  // 阻塞延时
void Beep(unsigned int i) // 产生频率可调的蜂鸣声
void Light(unsigned int i) // 红灯闪烁(未在main调用)
void all(unsigned int i) // 声光同步报警(红灯闪烁+蜂鸣)
  1. ​主控制逻辑​​:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void main() {
green=0; // 绿灯常亮(待机状态)
red=1; // 红灯熄灭
while(1) {
if(S1==0) { // 按键检测
delay(1200); // 消抖延迟
green=1; // 灭绿灯
if(S1==0) { // 二次确认按键
all(1000); // 触发声光报警
}
}
else green=0; // 松开按键恢复绿灯
}
}

二、核心工作原理

  1. ​待机状态​​:

    • 绿灯常亮(green=0)表示系统就绪
    • 红灯熄灭(red=1
  2. ​报警触发机制​​:

    • 当按键S1被按下时(低电平):
      1. 先进行1200单位的消抖延时
      2. 熄灭绿灯(green=1)指示状态切换
      3. 二次确认按键按下(防误触)
      4. 调用all(1000)执行声光报警
  3. ​声光报警实现​​:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    void all(unsigned int i) {
    for(a=0;a<i;a++) {
    red=0; // 红灯亮
    Beep(50); // 高频蜂鸣
    delay(5000); // 持续亮灯
    red=1; // 红灯灭
    Beep(50); // 不同频率蜂鸣
    }
    }
    • 红灯按固定频率闪烁
    • 亮/灭状态切换时蜂鸣器发出不同频率声响
    • 循环次数i=1000决定报警时长

三、关键设计特性

  1. ​硬件控制特性​​:

    • ​蜂鸣器驱动​​:通过Beep()函数实现PWM方波

      1
      2
      for(k=0;k<i;k++) { beep=0; }  // 低电平持续
      for(j=0;j<i;j++) { beep=1; } // 高电平持续
      • i值控制音频频率(值越小频率越高)
  2. ​安全设计​​:

    • 两级按键检测(首次扫描+消抖后确认)
    • 状态可视化(绿灯表示待机,红灯表示报警)
  3. ​待优化点​​:

    • Light()函数定义但未使用
    • 报警结束后无状态恢复逻辑
    • 延时精度依赖主频(未使用定时器)
    • 缺少按键释放检测(会持续触发)

系统典型应用场景:安全设备报警、异常状态提醒或工业设备紧急指示。当检测到按键触发(模拟异常事件)时,系统通过交替的灯光闪烁和多频蜂鸣实现高辨识度报警。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <reg51.h>

sbit S1=P3^1;
sbit beep=P1^5;
sbit green=P2^0;
sbit red=P2^1;

void delay(unsigned int i)
{
unsigned int k;
for(k=0;k<i;k++);
}

void Beep(unsigned int i)
{
unsigned int k,j,a;
for(a=0;a<1000;a++)
{
for(k=0;k<i;k++)
{
beep=0;
}
for(j=0;j<i;j++)
{
beep=1;
}
}
}

void Light(unsigned int i)
{
unsigned int k,j,a;
for(a=0;a<5000;a++)
{
for(k=0;k<i;k++)
{
red=0;
}
for(j=0;j<i;j++)
{
red=1;
}
}
}

void all(unsigned int i)
{
unsigned int k,j,a;
for(a=0;a<i;a++)
{
red=0;
Beep(50);
delay(5000);
red=1;
Beep(50);
}
}

void main()
{
green=0;
red=1;
while(1)
{
if(S1==0)
{
delay(1200);
green=1;
if(S1==0)
{
all(1000);
}
}
else green=0;
}
}

代码下载链接(123云盘):https://www.123684.com/s/wFuijv-i8Zgh

  • 标题: C51-声光报警器
  • 作者: lemon
  • 创建于 : 2025-07-22 21:24:10
  • 更新于 : 2025-07-23 00:11:41
  • 链接: https://lemon2003.github.io/post/20250722212410.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论