壓縮包包含文檔、程序等全部資料。
設計一套聲音定位系統。在一塊不大于 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 聲音接收模塊輸出電壓記錄表與測試數據 比較電路在不同靈敏度下,距聲源不同距離時聲音接收模塊輸出電壓測試結 果如下表所示:
51hei.png (5.16 KB, 下載次數: 89)
下載附件
2021-7-12 02:18 上傳
表 8.2
從表 8.2 可以看出,當電位器阻值較小時即比較器輸入端參考電壓接近 0 時
更易收到信號,但實際上這樣做也更容易受到干擾。接收模塊 C 相較于 A、B 模
塊了,由于焊接工藝的問題,靈敏度較低。合理調節電位器阻值之后,三個模塊
最終都能受到信號,滿足設計要求。
8.3 聲源實測坐標記錄表 對處于不同坐標的聲源進行了實際測量,最終得到了以下的一些實測數據如
下表所示:
51hei.png (3.5 KB, 下載次數: 100)
下載附件
2021-7-12 02:18 上傳
從表中可以看出,除個別點外,坐標紙的四個方向邊緣區域以及中間區域共
取了 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)
2021-7-11 18:48 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|