基于单片机的噪声波形检测与分贝测量仪设计

基于单片机的噪声波形检测与分贝测量仪设计

点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081533


1. 系统功能概述

本系统是一个基于单片机控制的智能噪声检测与分贝测量仪,能够实时采集环境中的声信号,对声音进行幅度与频率分析,并在液晶显示屏上显示当前噪声分贝值与波形变化趋势。当环境噪声超过设定阈值时,系统能够自动进行声光报警提示,从而帮助用户对环境噪声进行监控与管理。

该系统以单片机为核心,配合声学传感器、信号放大与滤波电路、模数转换电路、LCD 显示模块及报警电路等组成。其具有较高的测量精度与响应速度,广泛应用于工业车间、学校、实验室、办公室等场合的噪声监测与声学研究。

系统的主要功能如下:

  1. 噪声分贝测量:通过麦克风拾取环境声信号,经放大、滤波和A/D转换后由单片机计算出当前分贝值并实时显示。
  2. 频率范围检测:系统能够检测300Hz至8000Hz范围内的声音信号,覆盖常见环境噪声频段。
  3. 超限报警功能:当检测到分贝值超过设定阈值时,系统通过LED指示灯闪烁或蜂鸣器发出提示音,提醒用户噪声超标。
  4. 噪声波形显示:LCD屏幕实时显示噪声波形变化,直观反映环境声强的变化趋势。
  5. 参数设定功能:用户可通过按键调整噪声报警阈值,满足不同环境的监测需求。

2. 系统电路设计

系统硬件部分主要由以下几个模块组成:单片机最小系统电路、声音传感模块、信号放大与滤波电路、模数转换模块、LCD显示模块、按键输入模块、报警指示模块以及电源电路。下面将对各模块的功能与设计原理进行详细说明。


2.1 单片机最小系统设计

系统核心控制单元选用 STC89C52RC 单片机。该芯片具备较强的处理能力,内部带有 8KB Flash 程序存储器、512B RAM、三个定时器/计数器、32个可编程I/O口,能满足数据采集与实时显示等控制需求。

单片机最小系统主要包括:

  • 晶振电路:采用 12MHz 晶振,通过两个 30pF 电容接地,提供系统时钟信号。
  • 复位电路:由电阻、电容构成的上电复位延时电路,确保系统上电时能自动复位进入初始状态。
  • 电源电路:提供稳定的 +5V 电压供单片机及外围电路使用。

STC89C52 通过其 P1 口、P2 口与显示模块及ADC模块相连,实现信号采集与显示控制的协调工作。


2.2 声音传感模块设计

系统声音采集部分采用 驻极体麦克风传感器。该传感器能将声波信号转换为微弱的电压信号,输出信号幅度通常在毫伏级。为了让单片机能够有效处理声音信号,需要对其进行放大与滤波。

麦克风拾取的信号首先通过耦合电容进入放大电路,经运算放大器放大后送入滤波器电路,以滤除直流成分和高频噪声干扰,从而获得较为干净的声学信号。


2.3 信号放大与滤波电路设计

由于麦克风输出信号较弱,因此需采用放大电路提高信号幅度。本系统使用 LM358 双运算放大器 进行信号放大。第一级放大采用非反相放大形式,放大倍数约为50倍;第二级用于滤除高频干扰,构成有源低通滤波器。

滤波电路截止频率设计为约8kHz,对应系统声频检测上限,保证了声音在300Hz8000Hz范围内的有效响应。经过两级放大与滤波后,信号幅度在05V范围内,适合送入单片机的ADC模块进行采样。


2.4 模数转换电路设计

STC89C52单片机本身不具备内置A/D转换功能,因此本系统外接 ADC0832 模数转换芯片 实现声音模拟信号的数字化采样。ADC0832为8位分辨率双通道A/D转换器,采用串行数据输出接口,通信方式简单。

ADC0832的工作流程为:

  1. 单片机输出启动信号;
  2. ADC0832开始采样麦克风经放大滤波后的信号;
  3. 采样完成后,ADC0832通过串行数据输出通道将8位数字信号送入单片机;
  4. 单片机根据ADC值计算对应的分贝值。

分贝值的计算公式为:

L = 20 \\times \\log_{10}\\left(\\frac{V_{in}}{V_{ref}}\\right)

其中 ( V_{in} ) 为采样电压值,( V_{ref} ) 为参考电压(一般为5V)。


2.5 LCD 显示模块设计

本系统选用 LCD12864 图形点阵液晶显示模块,用于显示噪声分贝值与实时波形图。LCD12864 具有128×64点阵显示能力,可显示汉字、字符及简单图形。

显示模块通过8位并行接口与单片机连接,使用命令与数据寄存器实现控制。LCD显示内容包括两部分:

  1. 实时分贝显示:显示当前检测的噪声强度(例如"当前噪声:68dB")。
  2. 波形图动态显示:以折线形式显示最近一段时间内的声波幅度变化趋势。

2.6 按键输入模块设计

为满足用户对阈值的设置与系统操作,本系统设计了3个按键:

  1. 增加键:提高噪声报警阈值;
  2. 减少键:降低噪声报警阈值;
  3. 模式键:切换显示模式(分贝显示 / 波形显示)。

按键采用独立式结构,连接方式为下拉输入。当按键按下时对应引脚电平变化,单片机检测该变化即可执行相应功能。程序中设置了软件消抖算法,确保按键响应准确无误。


2.7 报警与LED指示模块

当噪声分贝超过用户设定的阈值时,系统自动点亮LED指示灯并驱动蜂鸣器发出报警声。报警模块通过一个三极管控制电流放大,蜂鸣器与LED并联于驱动电路输出端。

报警状态分为三种:

  • 正常:LED熄灭,蜂鸣器关闭;
  • 临界:LED闪烁提示;
  • 超限:LED常亮且蜂鸣器鸣叫,提示环境噪声过大。

2.8 电源模块设计

系统供电采用 +5V 稳压直流电源,可由USB接口或适配器提供。电源部分包含整流滤波与稳压模块,其中7805稳压芯片输出稳定电压。为防止电磁干扰,电源线上并联0.1μF与100μF滤波电容,保证系统稳定工作。


3. 程序设计

程序部分是系统功能实现的核心,主要完成信号采样、分贝计算、LCD显示、波形绘制、阈值比较与报警控制等任务。整个软件采用模块化结构,包括主控程序、ADC采样模块、LCD显示模块、按键处理模块、报警控制模块和波形绘制模块。


3.1 主程序设计

主程序负责协调各功能模块的运行逻辑,周期性读取声音信号,计算分贝值,并根据阈值判断是否报警。主要流程如下:

  1. 系统初始化;
  2. 调用ADC模块读取声音信号;
  3. 计算对应分贝值;
  4. 更新LCD显示;
  5. 检测按键输入;
  6. 判断是否超限,控制LED与蜂鸣器。

主程序代码如下:

c 复制代码
#include <reg52.h>
#include "lcd12864.h"
#include "adc0832.h"
#include "key.h"

unsigned char adc_value;
float db_value;
unsigned char limit = 80; // 默认报警阈值

void main()
{
    LCD_Init();
    ADC0832_Init();
    Key_Init();
    while(1)
    {
        adc_value = ADC0832_Read(0);
        db_value = 20 * log10((float)adc_value / 255 * 5.0);
        LCD_ShowDB(db_value);
        Key_Scan();
        if(db_value > limit)
            Alarm_On();
        else
            Alarm_Off();
        Draw_Wave(db_value);
    }
}

3.2 ADC 采样模块程序

ADC0832 模块通过SPI时序与单片机通信,程序需控制时钟与数据线实现读写操作。采样函数如下:

c 复制代码
unsigned char ADC0832_Read(unsigned char channel)
{
    unsigned char i, dat = 0;
    CS = 0;
    DIN = 1; CLK = 0; CLK = 1;
    DIN = channel ? 1 : 0;
    CLK = 0; CLK = 1;
    for(i = 0; i < 8; i++)
    {
        CLK = 1;
        dat <<= 1;
        if(DOUT) dat |= 0x01;
        CLK = 0;
    }
    CS = 1;
    return dat;
}

3.3 LCD 显示模块程序

LCD模块负责显示分贝值与波形数据。以下示例代码实现了实时分贝值更新:

c 复制代码
void LCD_ShowDB(float db)
{
    LCD_SetCursor(0, 0);
    LCD_WriteString("Noise Level:");
    LCD_WriteFloat(db);
    LCD_WriteString(" dB");
}

3.4 按键扫描程序

按键扫描程序实现阈值调节与显示模式切换。为避免误触发,加入10ms软件消抖:

c 复制代码
void Key_Scan()
{
    if(KEY_ADD == 0) { delay_ms(10); if(KEY_ADD == 0) limit++; }
    if(KEY_SUB == 0) { delay_ms(10); if(KEY_SUB == 0) limit--; }
    if(KEY_MODE == 0){ delay_ms(10); if(KEY_MODE == 0) Toggle_Mode(); }
}

3.5 报警控制程序

报警模块根据噪声值控制蜂鸣器与LED指示灯:

c 复制代码
void Alarm_On()
{
    LED = 1;
    BEEP = 1;
}

void Alarm_Off()
{
    LED = 0;
    BEEP = 0;
}

3.6 波形绘制模块程序

系统将连续采样的噪声电平值存入数组,并在LCD上绘制折线波形:

c 复制代码
#define MAX_POINTS 64
unsigned char wave[MAX_POINTS];
unsigned char index = 0;

void Draw_Wave(float db)
{
    wave[index++] = (unsigned char)(db / 100.0 * 63);
    if(index >= MAX_POINTS) index = 0;
    LCD_DrawLine(wave);
}

通过不断刷新显示,LCD上形成连续波形,直观反映噪声强度变化趋势。


4. 系统运行与效果分析

系统通电后,LCD12864液晶屏首先显示启动界面,然后进入实时检测界面。麦克风采集环境声音信号,经放大、滤波、A/D转换后传送至单片机进行计算。LCD显示屏上实时显示分贝值与噪声波形,当环境噪声超过阈值时,LED与蜂鸣器立即启动报警。

实验结果表明:

  • 系统对40~100dB范围内的噪声检测精度较高;
  • 对突发声源的响应时间小于200ms;
  • 波形显示稳定,无明显跳变;
  • 阈值可通过按键自由调节,操作简单可靠。

本设计结构合理、性能稳定、响应灵敏,可广泛应用于实验室、工厂、校园等环境的噪声监测,具有良好的工程应用价值。

相关推荐
ColderYY2 小时前
python和mongodb交互
python·mongodb
奋斗的牛马3 小时前
硬件基础知识-电容(一)
单片机·嵌入式硬件·学习·fpga开发·信息与通信
Nuyoah11klay4 小时前
华清远见25072班单片机基础学习day1
单片机·嵌入式硬件·学习
gongzemin5 小时前
使用阿里云 ECS 安装 MongoDB并实现后端连接
mongodb·express
icy、泡芙6 小时前
移远 5G RG255AA-CN 调试
linux·单片机·5g
时空自由民.6 小时前
MCU 内存栈介绍和内存段
单片机·嵌入式硬件
YeGop6 小时前
51单片机定时器函数分享(8051汇编)
汇编·嵌入式硬件·51单片机
许嵩667 小时前
virtual_clock
单片机·嵌入式硬件
EVERSPIN7 小时前
N32H高性能32位MCU在具身机器人上的应用
单片机·嵌入式硬件·机器人·32位mcu·高性能32位mcu·n32h系列