压缩包包含文档、程序等全部资料。
设计一套声音定位系统。在一块不大于 1m2 的平板上贴一张 500mm×350mm 的坐标纸,在其四角外侧分别固定安装一个声音接收模块,声音接收模块通过导 线将声音信号传输到信息处理模块,声音定位系统根据声响模块通过空气传播到 各声音接收模块的声音信号,判定声响模块所在的位置坐标。系统结构示意图如 图 1 所示。
2.1 要求 图 1 声音定位系统结构示意图
(1) 设计制作一个声响模块,含信号产生电路、放大电路和微型扬声器等, 每按键一次发声一次,声音信号持续时间约为 1s。要求声响模块采用 5V 以下电 池供电,功耗不大于 200mW。 (2) 设计制作四路声音接收模块,由麦克风、放大电路等组成,并分别与信 息处理模块相连接,以便将声音信号传送至信息处理模块。 (3) 设计制作一个信息处理模块,要求该模块能根据从声音接收模块传来的 信号判断声响模块所在位置的 x、y 坐标,并以数字形式显示 x、y 坐标值,位置 坐标值误差的绝对值不大于 30mm。 3.1 说明 (1) 注意预留测量声响模块功耗的电流电压和信号放大电路输出信号的测试 点。 (2) 采用三个声音接收模块即可实现定位,第四个模块可对定位作进一步校 正。 (3) 不允许声响模块与其他电路有任何连接,并要求在声响模块上做出明显 标记,以便清晰判读模块所在坐标数值。 (4) 注意声音通过其它传播介质带来的影响。 二、总体设计与分析
为了实现本次设计的要求,系统必须具备以下功能:按键声源发声且持续时 间 1s、接收声音、信号放大滤波、声源定位等功能。其系统主要可以划分为:声 响模块、声音接收模块、控制器和显示模块。 在整体的方案上,声响模块利用 555 单稳态振荡电路来达到每按键一次发声一次 的功能。另外由于声响模块产生的声音信号传递到接收模块时是十分微弱的,所 以声音接收模块必须含有滤波,放大和比较等环节,以便触发控制器进行运算和 处理。本次设计采用了比较器 LM358 结合放大电路形成的声音接收模块。此系 统结构框图如下所示:
三、方案比较与选择 3.1 处理器 图 2.1 系统结构框图
方案一:采用 TI 公司生产的 MSP430 单片机。MSP430 系列单片机含有一种 超高速、低功耗的同时具有精简指令集(RISC)的 16 位处理器。该系列芯片片内 资源丰富,中断源的数量较多,足以满足本次设计对中断源的需求。同时 MSP430 系列单片机运算速度快,片内硬件资源丰富,能够实现一些较为复杂的算法和数 据处理。但在短时间内掌握 MSP430 的编程与开发具有一定的难度。 方案二:采用 STC 公司生产的 STC89C52RC 单片机。STC89C52RC 是 STC 公司 生产的一种高性能 CMOS、低功耗的 8 位微控制器。其片内含有五个可屏蔽中断 源,且容易对其进行编程处理,基本可以满足本次设计要求。另外 STC89C52RC 单片机小系统的焊接较为简单,后期调试工作也更加方便。 综上所述,方案一成本较高,并且考虑到短时间内不易掌握,经过讨论采取方案 二。 3.2 声源装置 方案一:采用单片机产生声音信号,经过功率放大电路,驱动无源蜂鸣器发 声,这可以通过程序实现。但由于 STC89C52RC 单片机片内资源有限,需要另外 再焊接一个单片机小系统,较为浪费资源。 方案二:采用 555 单稳态振荡电路产生声音信号,经过三极管放大电路,驱 动无源蜂鸣器发声。其通过内部的定时器产生时基电路,外部只需简单的驱动电 路便可实现按键一次,声音持续时间 1s 的功能。该电路结构简单,可外接 5V 电 源,方便焊接与测试。 综上所述,经讨论采取方案二。
3.3 声音接收装置 方案一:采用压电式声敏传感器。压电式声敏传感器是利用压电晶体的压电 效应制成一种能实现声-电转换器件。但压电声敏传感器不是常用器件,价格较 贵。 方案二:采用电容式驻极体话筒(咪头)。该元件能将一般的声音信号转化为 电信号。价格便宜,便于设计,之后再自行设计滤波与放大电路,一起构成声音 信号接收模块。 综上所述,电容式驻极体话筒对于满足设计要求绰绰有余,经过讨论采取方 案二。 3.4 声音信号放大电路 方案一:采用声控开关。声控开关使用简单,价格便宜,但是反应不够灵敏, 精度较低。 方案二:采用多级放大整波电路,将接收的信号经放大、滤波、电压比较排 除噪声干扰,精度高。 综上所述,虽然方案二电路复杂运用模电知识,但是项目要求精度比较高, 所以采用方案二。3.5 显示模块 方案一:LCD1602 液晶显示屏,是一种工业字符型液晶,能够同时显示 16x02 (16 列 2 行)即 32 个字符。对于本次设计而言,虽然其能基本完成显示坐标轴 上 X 与 Y 的值,但考虑在调试过程中,需要显示时间差值和因中断触发产生的标 志值。LCD1602 显然做不到实时显示,增加了调试的难度。 方案二:LCD12864 液晶显示屏,是一种具有多种接口方式,内部简体中文字 库的点阵图形液晶显示模块;其显示分辨率为 128×64, 内置 8192 个 16*16 点 汉字,和 128 个 16*8 点 ASCII 字符集。利用该模块灵活的接口方式和简单、方 便的操作指令,完全满足本次设计中的显示需求和调试需求。 综上所述,经讨论采取方案二。 四、电路设计 4.1 按键发声模块电路设计 声音信号是通过 555 单稳态振荡电路产生。通过按下开关按钮后,下降沿触 发,555 电路产生持续时间为 1s 的声音信号,使三极管电路饱和导通并放大电 流,驱动无源蜂鸣器发声。整个电路由 5V 纽扣电池供电,使用小功率三极管 A42 进行放大电流,以实现低功耗。  按键发声模块的具体电路如下图所示:
图 4.1 按键发声模块电路
图中公有两个 555 单稳态振荡电路,其中第一个 555 单稳态振荡电路对按键延 时防抖,产生准确的负脉冲。第二个 555 单稳态振荡电路中则产生持续 1s 的正 脉冲。可见 555 单稳态振荡电路中,每来一次负脉冲,便输出一个正脉冲,其宽 度 Tw 由 RC 决定,满足下列公式: Tw = 1.1 × RC (s) 其中 R 在图 4.1 中分别为 R22、R28;C 分别为 C17、C18。通过调节 R28 即 可产生持续 1s 的高电平信号。 4.2 声音接收模块电路设计 声音接收模块采用驻极体话筒作为声电转换元件。驻极体话筒输出端是内部 场效应管的漏极 D 和源极 S,此电路采用源极输出,漏极接地的连接方式,故在 源极 S 与电源正极之间接入 10K 电阻。通过共基极放大电路放大电流信号,再经 过由 LM358 组成的过零比较器电路输出方波信号。电路中设置有 1K 的电位器 R18,以便调节 LM358 比较器端的参考电压,改变电路的灵敏度,使调试更为方 便。 声音接收模块电路具体如下图所示: 图 3.2 声音接收模块电路 由图 3.2 可知,比较器输入端参考电压实际为:
本次设计采用 STC89C52RC 单片机进行运算处理和驱动 LCD12864 液晶显示 屏显示定位结果,即利用单片机内部定时器 0 计时,由外部中断 0、外部中断 1 和定时器 1 触发,检测接收信号的下降沿,通过这种方式计算声音传播后,不同 模块接收到信号的时间差,通过时间差计算出声源信号到接收模块距离,然后由 单片机编程计算出声源的位置坐标,最终显示在液晶屏上。 STC89C52RC 单片机小系统电路和 LCD12864 驱动电路如下图所示:
五、算法与程序设计 5.1 数据处理原理: 图 4.3 STC89C52RC 单片机模块
本算法基于时间差算出未知点的坐标点。从理论上分析,只需三个已知点就 可以对声音源进行定位,我们首先先将问题简化为二维平面内对声音源进行定位。 如下图所示,在一个平面内分布有三个传感器 A、B 和 C 坐标分别为(0,350)、 (0,0)、(500,0)。当平面内某处 S(x,y)发出声音时,3 个传感器将先后接收 到信号,设信号到达 A,B 的时间差为 t1,到达 B,C 的时间差为 t2,则有:
我们只需在单片机程序中将 x, y 所有可能值都带入到上式中,检查有哪些值满 足条件即可。
5.2 程序流程图 图 5.1 声音定位系统等效平面图
图 5.2
5.3 子程序流程图:
六、测试方案 6.1 主要的测试仪器、仪表 图 5.3
本次主要使用的测试仪器与仪表有,函数信号发生器、示波器与数字万用表。 6.2 测试方法 在硬件测试中,按键发声模块通过示波器测试电路输出波形,调节电位器改 变电阻值来调节触发时间,保证发出的声响持续时间为 1s;另外使用数字万用表 测量按键发声模块的功耗。声音接收模块通过数字万用表,测量当发声模块距接 收模块不同距离时,比较器输出电压,直至调节电位器,改变比较器灵敏度使输 出电压在要求距离内能受到信号,并以下降沿触发单片机。声响模块和接收模块 都可以使用函数发生器和示波器来检测电路的连接是否正常。 在软件测试中,我们组软件调试的中心思想是分模块调试。先将程序分为三 个接受模块,算法模块,显示模块,我们在分块调试时,将各个模块的输出都显 示出来以便于观察各模块是否正确。运用这种方法,可以将软件上的错误精确定
位到某一个环节,大大提高了调试的效率。以下是具体方法: 1、将程序中的标志位 signalA,signalB,signalC 通过 LCD 屏幕显示出来,以方便 观察是否所有传感器都收到了信号。 2、将各信号间的时间差通过 LCD 屏幕显示出来,以方便观察各传感器的响 应速度以及接受信号的先后顺序是否与实际一致。 3、在接入传感器前,先用另一片单片机模仿传感器发出的信号,并通过程序 设置时间差等参数,用于检查算法是否正确。 七、系统调试 7.1 按键发声模块 测试输出电流(通过测量蜂鸣器串联的 1Ω的电阻得到电流值),从图中可知  为 0.042A:
图 7.1.1 测试蜂鸣器两端电压,从图中可知为 4.36V:
7.2 声音接收模块 图 7.1.2
当声响模块离接收模块距离较近时,接收模块输出电压达到 3.6V 左右。
图 7.2.1 当声响模块离接收模块较远时(但坐标仍属于坐标纸的范围),接收模块输出 电压将会变小。这个时候就需要调节电位器,改变电阻值以减小比较器 LM358 输 入端参考电压的值。
7.3 LCD 液晶显示模块 图 7.2.1
进行测试时,LCD12864 液晶显示模块除了显示坐标 X 与 Y 的值外,还会显示 A、B、C 三个声音接收模块的中断触发标志值(如下图显示屏中第一行所显示的 内容,其中显示值为 0 表示未触发,为 1 则表示已触发),以及 A、B 和 C 三个 声音接收模块依次收到信号时的计时时刻(其中从右到左依次为 0us,65us 和 68us, 此时模块 C 最先收到声音信号),这样方便系统调试。 下图坐标 X 与 Y 值在误差范围内,满足测量要求。
八、数据测试与处理 图 7.3.1
8.1 声响模块参数记录表与测试数据 当给声响模块供电时声响模块测试结果如下表所示: 测试内容 | 测试结果 | 按键发生 | 能 | 声音信号持续时间 | 1 .023s | 功耗测试 | 183.12mW(4.36V,0.042A) |
表 8.1 8.2 声音接收模块输出电压记录表与测试数据 比较电路在不同灵敏度下,距声源不同距离时声音接收模块输出电压测试结 果如下表所示: 表 8.2
从表 8.2 可以看出,当电位器阻值较小时即比较器输入端参考电压接近 0 时
更易收到信号,但实际上这样做也更容易受到干扰。接收模块 C 相较于 A、B 模
块了,由于焊接工艺的问题,灵敏度较低。合理调节电位器阻值之后,三个模块
最终都能受到信号,满足设计要求。
8.3 声源实测坐标记录表 对处于不同坐标的声源进行了实际测量,最终得到了以下的一些实测数据如
下表所示:
从表中可以看出,除个别点外,坐标纸的四个方向边缘区域以及中间区域共
取了 5 个点,其实测坐标基本满足设计要求。而个别点的误差可能是由于接收模 块放置的位置不准确或声源放置地不准确而产生。
九、总结
本次设计以 STC89C52 为核心部件,利用了声音检测与辨识技术,利用严密的 数学方法实现和确定了声源的准确定位。在系统设计过程中,力求硬件电路简单, 降低硬件成本,节约功耗。
在这次设计中,我们遇到了许多问题,这些问题我们之前从未遇到过, 但最终我们都找到了解决这些问题的办法,这对我们来说是一次很好的锻炼。在 程序设计与软件调试的过程之中,由于我们同时使用了 STC89C52 单片机中的四 个中断进行控制处理,对于单片机各个中断的优先级与触发的考虑更为复杂,但 只要结合函数信号发生器模拟声音信号触发单片机得到调试结果,并且根据这些
结果不断改正程序,就能得到最优的程序设计。另外在程序设计过程,由于子程 序中数据处理十分重要,我们查阅了许多的资料,对于 C51 中的数据类型以及常 用的库函数也更加的熟悉。在硬件调试过程中,出现了声音接收模块电路不稳定, 易受到干扰,以及放大电路难以调试的问题。对于接下来设计之后,我们也 会考虑重新设计相关电路,例如采用双比较器电路进行比较放大,来提高电路的性能。
电路原理图
相关作品图片 (1)作品整体图:
(2)按键发声模块
(3)声音接收模块 (4)单片机小系统

单片机源程序如下:
- #include<reg52.h>
- #include<stdio.h>
- #include "delay.h"
- #include "lcd.h"
- #include<math.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define BOOL bit
- #define BYTE unsigned char
- #define WORD unsigned int
- uchar signalA,signalB,signalC;
- uchar wolsignalA,wolsignalB,wolsignalC;
- uchar wolCount,obv;
- unsigned int posX,posY; //坐标取值
- code unsigned char byValidShow[] = {" V值: "};
- code unsigned char DispX[] = {" X轴: "};
- code unsigned char DispY[] = {" Y轴: "};
- void Init_Show() //LCD初始化显示子程序
- {
- Delay400Ms();
- LCDInit();
- LCDClear();
- Delay5Ms();
- LCDClear();
- //DisplayListChar(0,1,byValidShow);
- DisplayListChar(0,2,DispX);
- DisplayListChar(0,3,DispY);
- Delay5Ms();
- }
- void Init_isr() //中断初始化设置子程序
- {
- EA = 0;
- TMOD = 0x62;
- /*外部中断0*/
- IT0 = 1; EX0 = 1;
- /*外部中断1*/
- IT1 = 1; EX1 = 1;
- /* 计数器 0*/
- TH1 = 0xFF; TL1 = 0xFF; TR1 = 1; ET1 = 1;
- /* 定时器 1*/
- TH0 = 246; TL0 = 246; TR0 = 0; ET0 = 0;
- /***********/
- IE0=0;IE1=0;TF1=0;TF0=0;
- EA = 1;
- }
- void signalchuli(float m,float n) //坐标定位计算程序
- {
- BOOL r1=0;
- BOOL r2=0; //方程是否成立变量
- BOOL suc=0; //解题是否成功变量
- float x,y;
- for(x=10;x<=500;x+=10)
- {
- for(y=10;y<=350;y+=10)
- {
- if(fabs(sqrt(x*x+(350-y)*(350-y))- sqrt(x*x+y*y)-m)<=20.0)
- r1=1;
- //else r1=0;
- if(fabs(sqrt(x*x+y*y)-sqrt(y*y+(500-x)*(500-x)) -n)<=20.0)
- r2=1;
- //else r2=0;
- if(r1&&r2)
- {
- suc=1;
- break;
- }
- else
- {
- r1=0;
- r2=0;
- }
- }
- if(suc)
- break;
- }
-
- posX=x;
- posY=y;
-
- }
- void main()
- {
- float cha1,cha2;
- uchar cha1_temp,cha2_temp;
- EA=0;
- Init_Show();
- Init_isr();
- while(1)
- {
- if( signalA && signalB && signalC)
- {
- EA = 0;
- TR0=0;
- obv++;
- cha1_temp = wolsignalA - wolsignalB;
- cha2_temp = wolsignalB - wolsignalC;
- if(wolsignalA < wolsignalB)
- {
- cha1_temp = 65536 - cha1_temp;
- cha1 = -(3.4*cha1_temp);
- }
- else
- {
- cha1 = 3.4*cha1_temp;
- }
- if(wolsignalB < wolsignalC)
- {
- cha2_temp = 65536 - cha2_temp;
- cha2 = -(3.4*cha2_temp);
- }
- else
- {
- cha2 = 3.4*cha2_temp;
- }
- signalchuli(cha1,cha2);
- DisplayADData(4,2,posX);
- DisplayADData(4,3,posY); //显示坐标
- signalA = 0;
- signalB = 0;
- signalC = 0;
- wolCount = 0;
- Init_isr();
- }
- DisplayADData(0,4,wolsignalA);
- DisplayADData(3,4,wolsignalB);
- DisplayADData(6,4,wolsignalC); //显示时间插值,方便调试
- DisplayADData(0,1,signalA);
- DisplayADData(3,1,signalB);
- DisplayADData(6,1,signalC); //显示触发标志位,方便调试
- }
- }
- void JsA_isr() interrupt 0 //外部中断0,下降沿触发
- {
- EX0 = 0;
- if(wolCount == 0)
- {
- wolsignalA = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalA = wolCount;
- }
- signalA = 1;
- }
- void JsB_isr() interrupt 2 //外部中断1,下降沿触发
- {
-
- if(wolCount == 0)
- {
- wolsignalB = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalB = wolCount;
- }
- signalB =1;
- EX1 = 0;
- }
- void Timer1_isr() interrupt 3 //计数器1,工作方式2
- {
- if(wolCount == 0)
- {
- wolsignalC = 0;
- TR0 = 1;
- ET0 = 1;
- }
- else
- {
- wolsignalC = wolCount;
- }
- signalC = 1;
- ET1 = 0;
- }
- void Timer0_isr() interrupt 1 //定时器0,工作方式2 , 10us
- {
- wolCount++;
- }
复制代码
以上文档与程序资料51hei下载(初学作品,如有错误请大家多多指导):
基于51的声音定位系统.rar
(1.6 MB, 下载次数: 177)
|