历史上的今天
今天是:2024年12月07日(星期六)
2021年12月07日 | 基于51单片机声音噪声分贝检测采集显示设计
2021-12-07 来源:eefocus
硬件设计
功能说明:
1.基于STC89C51/52(与AT89S51/52、AT89C51/52通用)单片机作为主控制器
2、采用LCD1602液晶显示屏实时显示分贝值;
3、使用小麦克风采集声音经过LM358放大信号后经过ADC0832进行采集,最终转换成分贝值。
4、可以通过按键进行设定分贝限值,设定的分贝限值存储于STC单片机内部eeprom,具有掉电存储的功能;(AT单片机没有掉电存储功能)
5、当实测分贝值低于设定值时绿色指示灯亮,当实测分贝值高于设定值时红色指示灯亮并蜂鸣器报警;

仿真图:

程序设计
部分代码如下:
*******************************************************************************/
#include #include "ADC0832.h" #include "LCD1602.h" #include "eeprom52.h" typedef unsigned int u16; #define led P1 uint Noise_h=50; uint AD_dat=0; uint mmm=0; uint Noise=0; uchar ms=0; uchar sec=0; uchar sec1=0; sbit beep=P2^0; sbit led0=P1^6; sbit led1=P1^4; sbit key1=P3^5; sbit key2=P3^6;//位定义 bit key1_flag=0; bit key2_flag=0; bit beep1=0; bit memory_flag=0;//方向标志 int c=0; /******************************************************************************* * 函 数 名 : delay * 函数功能 : 延时函数,i=1时,大约延时10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 数 名 : memroy * 函数功能 : eeprom *******************************************************************************/ void memroy() { if(memory_flag) { memory_flag=0; SectorErase(0x2000); byte_write(0x2000,Noise_h/256);//取整 byte_write(0x2001,Noise_h%256);//取余 } } /******************************************************************************* * 函 数 名 : read_memory * 函数功能 : 设定可调噪声检测的最大值 *******************************************************************************/ void read_memory() { Noise_h=byte_read(0x2000)*256+byte_read(0x2001); if(Noise_h>999) { Noise_h=70; } } /******************************************************************************* * 函 数 名 : key_dispose * 函数功能 : 按键函数,调节噪声检测的上限 *******************************************************************************/ void key_dispose() { if(!key1) { if(key1_flag) { if(Noise_h<999) Noise_h++; } if(sec==0) { if(Noise_h<999) Noise_h++; } } else { if(key1_flag==0) { key1_flag=1; memory_flag=1; } sec=2; } if(!key2) { if(key2_flag) { key2_flag=0; if(Noise_h>0) Noise_h--; } if(sec1==0) { if(Noise_h>0) Noise_h--; } } else { if(key2_flag==0) { key2_flag=1; } sec1=2; } } /******************************************************************************* 文件地址: 链接:https://pan.baidu.com/s/1FY5kDcX6yzMzMzsM70kygg 提取码:cfu6
史海拾趣
|
大家觉得搞单片机(嵌入式电子技术开发)累吗??? http://bbs.21ic.com/viewthread.php?tid=127427… 查看全部问答> |
|
定时器产生的中断请求,如何获取来响应自己的程序呢? 我想利用定时器在指定的时间到达时,执行我写的一段程序,怎么获取定时器的这个中断呢? 有例程最好,我不知道这个过程如何写,是不是中断有一个固定的模式?? 新手求指教啊~~~~… 查看全部问答> |
|
PSDSoft Express软件生成的编程文件obj格式解析 各位好: 最近用到PSDSoft Express软件,其生成的编程文件obj中,包含:PLD映射,SRAM数据,EPROM数据,不知如何划分!因为编程PSD501芯片要用到这个文件. 另外,发现此软件生成的项目中,在生成obj文件之前,会自动 ...… 查看全部问答> |
|
就是在一个SPI总线上我有两个一样的IC,A,B;现在SPI总线是如何识别他们两个呢?怎样确定他们的优先级呢?比如说要把A的那个信号切换到什么状态的方法? 请高手指教!… 查看全部问答> |
|
使用NiosII控制高频头CU1216,在NiosII IDE中运行下列程序后,由于没有应答,程序死在Write_I2C_Byte函数的while(I2C_Ackn() );,reset,sda,scl均加了上拉电阻,进行了一些检查均没有结果 ,哪位高手能帮我指点迷津?谢谢。 #include \"i2c.h\" ...… 查看全部问答> |
|
很早的时候知道嵌入式很火,自己也很喜欢。于是自己抱着书看,看51、arm... ,最后还学linux,学习移植,编译内核,都是蒙着头过河。一味的追求想象中的 高科技,现在才发现自己的学习之路走的有点偏。 &n ...… 查看全部问答> |
|
我最近在设计一个正弦波发生器的过程中,出现了很诡异的问题。频率稍微上调多点,输出波形就截止。采取fpga的de0开发板,方案如下:1. 频率处理以及显示(元件1) ——> 输出整形(integer)频率 f2. 输入频率 —— ...… 查看全部问答> |




