基于单片机的噪声波形检测与分贝测量仪设计
点击链接下载资料:https://download.csdn.net/download/m0_51061483/92081533
1. 系统功能概述
本系统是一个基于单片机控制的智能噪声检测与分贝测量仪,能够实时采集环境中的声信号,对声音进行幅度与频率分析,并在液晶显示屏上显示当前噪声分贝值与波形变化趋势。当环境噪声超过设定阈值时,系统能够自动进行声光报警提示,从而帮助用户对环境噪声进行监控与管理。
该系统以单片机为核心,配合声学传感器、信号放大与滤波电路、模数转换电路、LCD 显示模块及报警电路等组成。其具有较高的测量精度与响应速度,广泛应用于工业车间、学校、实验室、办公室等场合的噪声监测与声学研究。
系统的主要功能如下:
- 噪声分贝测量:通过麦克风拾取环境声信号,经放大、滤波和A/D转换后由单片机计算出当前分贝值并实时显示。
- 频率范围检测:系统能够检测300Hz至8000Hz范围内的声音信号,覆盖常见环境噪声频段。
- 超限报警功能:当检测到分贝值超过设定阈值时,系统通过LED指示灯闪烁或蜂鸣器发出提示音,提醒用户噪声超标。
- 噪声波形显示:LCD屏幕实时显示噪声波形变化,直观反映环境声强的变化趋势。
- 参数设定功能:用户可通过按键调整噪声报警阈值,满足不同环境的监测需求。
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的工作流程为:
- 单片机输出启动信号;
- ADC0832开始采样麦克风经放大滤波后的信号;
- 采样完成后,ADC0832通过串行数据输出通道将8位数字信号送入单片机;
- 单片机根据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显示内容包括两部分:
- 实时分贝显示:显示当前检测的噪声强度(例如"当前噪声:68dB")。
- 波形图动态显示:以折线形式显示最近一段时间内的声波幅度变化趋势。
2.6 按键输入模块设计
为满足用户对阈值的设置与系统操作,本系统设计了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 主程序设计
主程序负责协调各功能模块的运行逻辑,周期性读取声音信号,计算分贝值,并根据阈值判断是否报警。主要流程如下:
- 系统初始化;
- 调用ADC模块读取声音信号;
- 计算对应分贝值;
- 更新LCD显示;
- 检测按键输入;
- 判断是否超限,控制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;
- 波形显示稳定,无明显跳变;
- 阈值可通过按键自由调节,操作简单可靠。
本设计结构合理、性能稳定、响应灵敏,可广泛应用于实验室、工厂、校园等环境的噪声监测,具有良好的工程应用价值。