找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 12563|回復(fù): 21
打印 上一主題 下一主題
收起左側(cè)

我的單片機(jī)聲音定位系統(tǒng)課程設(shè)計(jì) 含源碼,仿真,原理圖,報(bào)告

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是我大三時(shí)的電子課程設(shè)計(jì),做的聲音定位系統(tǒng),課設(shè)具體要求如下:

附件里包含了,整個(gè)系統(tǒng)的源碼,設(shè)計(jì)報(bào)告(含原理圖)



本次設(shè)計(jì)采用 STC89C52RC 單片機(jī)進(jìn)行運(yùn)算處理和驅(qū)動(dòng) LCD12864 液晶顯示
屏顯示定位結(jié)果,即利用單片機(jī)內(nèi)部定時(shí)器 0 計(jì)時(shí),由外部中斷 0、外部中斷 1和定時(shí)器 1觸發(fā),檢測(cè)接收信號(hào)的下降沿,通過(guò)這種方式計(jì)算聲音傳播后,不同模塊接收到信號(hào)的時(shí)間差,通過(guò)時(shí)間差計(jì)算出聲源信號(hào)到接收模塊距離,然后由單片機(jī)編程計(jì)算出聲源的位置坐標(biāo),最終顯示在液晶屏上。 STC89C52RC 單片機(jī)小系統(tǒng)電路和 LCD12864驅(qū)動(dòng)電路如下圖所示:

五、算法與程序設(shè)計(jì)
5.1數(shù)據(jù)處理原理:
本算法基于時(shí)間差算出未知點(diǎn)的坐標(biāo)點(diǎn)。從理論上分析,只需三個(gè)已知點(diǎn)就可以對(duì)聲音源進(jìn)行定位,我們首先先將問(wèn)題簡(jiǎn)化為二維平面內(nèi)對(duì)聲音源進(jìn)行定位。  如下圖所示,在一個(gè)平面內(nèi)分布有三個(gè)傳感器A、 B和C坐標(biāo)分別為(0,350)、(0,0)、(500,0)。當(dāng)平面內(nèi)某處 S(x,y)發(fā)出聲音時(shí),3 個(gè)傳感器將先后接收到信號(hào),設(shè)信號(hào)到達(dá)A,B的時(shí)間差為 t1,到達(dá)B,C的時(shí)間差為 t2,則有:






六、測(cè)試方案
6.1  主要的測(cè)試儀器、儀表
本次主要使用的測(cè)試儀器與儀表有,函數(shù)信號(hào)發(fā)生器、示波器與數(shù)字萬(wàn)用表。  
6.2  測(cè)試方法
在硬件測(cè)試中,按鍵發(fā)聲模塊通過(guò)示波器測(cè)試電路輸出波形,調(diào)節(jié)電位器改變電阻值來(lái)調(diào)節(jié)觸發(fā)時(shí)間,保證發(fā)出的聲響持續(xù)時(shí)間為 1s;另外使用數(shù)字萬(wàn)用表測(cè)量按鍵發(fā)聲模塊的功耗。聲音接收模塊通過(guò)數(shù)字萬(wàn)用表,測(cè)量當(dāng)發(fā)聲模塊距接收模塊不同距離時(shí),比較器輸出電壓,直至調(diào)節(jié)電位器,改變比較器靈敏度使輸出電壓在要求距離內(nèi)能受到信號(hào),并以下降沿觸發(fā)單片機(jī)。聲響模塊和接收模塊都可以使用函數(shù)發(fā)生器和示波器來(lái)檢測(cè)電路的連接是否正常。
在軟件測(cè)試中,我們組軟件調(diào)試的中心思想是分模塊調(diào)試。先將程序分為三個(gè)接受模塊,算法模塊,顯示模塊,我們?cè)诜謮K調(diào)試時(shí),將各個(gè)模塊的輸出都顯示出來(lái)以便于觀察各模塊是否正確。運(yùn)用這種方法,可以將軟件上的錯(cuò)誤精確定位到某一個(gè)環(huán)節(jié),大大提高了調(diào)試的效率。以下是具體方法:
1、將程序中的標(biāo)志位signalA,signalB,signalC 通過(guò)LCD屏幕顯示出來(lái),以方便
觀察是否所有傳感器都收到了信號(hào)。
2、將各信號(hào)間的時(shí)間差通過(guò) LCD 屏幕顯示出來(lái),以方便觀察各傳感器的響應(yīng)速度以及接受信號(hào)的先后順序是否與實(shí)際一致。
3、在接入傳感器前,先用另一片單片機(jī)模仿傳感器發(fā)出的信號(hào),并通過(guò)程序設(shè)置時(shí)間差等參數(shù),用于檢查算法是否正確。
七、系統(tǒng)調(diào)試   
7.1  按鍵發(fā)聲模塊
測(cè)試輸出電流(通過(guò)測(cè)量蜂鳴器串聯(lián)的 1Ω的電阻得到電流值),從圖中可知
為0.042A:

7.2  聲音接收模塊
當(dāng)聲響模塊離接收模塊距離較近時(shí),接收模塊輸出電壓達(dá)到 3.6V 左右。

當(dāng)聲響模塊離接收模塊較遠(yuǎn)時(shí)(但坐標(biāo)仍屬于坐標(biāo)紙的范圍),接收模塊輸出電壓將會(huì)變小。這個(gè)時(shí)候就需要調(diào)節(jié)電位器,改變電阻值以減小比較器 LM358 輸入端參考電壓的值。


7.3 LCD 液晶顯示模塊
進(jìn)行測(cè)試時(shí),LCD12864 液晶顯示模塊除了顯示坐標(biāo) X 與 Y的值外,還會(huì)顯示A、B、C 三個(gè)聲音接收模塊的中斷觸發(fā)標(biāo)志值(如下圖顯示屏中第一行所顯示的內(nèi)容,其中顯示值為 0 表示未觸發(fā),為 1 則表示已觸發(fā)),以及 A、B 和 C 三個(gè)聲音接收模塊依次收到信號(hào)時(shí)的計(jì)時(shí)時(shí)刻(其中從右到左依次為0us,65us和68us,此時(shí)模塊 C 最先收到聲音信號(hào)) ,這樣方便系統(tǒng)調(diào)試。 下圖坐標(biāo) X 與Y值在誤差范圍內(nèi),滿足測(cè)量要求。


從表 8.2 可以看出,當(dāng)電位器阻值較小時(shí)即比較器輸入端參考電壓接近 0 時(shí)更易收到信號(hào),但實(shí)際上這樣做也更容易受到干擾。接收模塊 C 相較于A、B 模塊了,由于焊接工藝的問(wèn)題,靈敏度較低。合理調(diào)節(jié)電位器阻值之后,三個(gè)模塊最終都能受到信號(hào),滿足設(shè)計(jì)要求。
8.3  聲源實(shí)測(cè)坐標(biāo)記錄表
對(duì)處于不同坐標(biāo)的聲源進(jìn)行了實(shí)際測(cè)量,最終得到了以下的一些實(shí)測(cè)數(shù)據(jù)如下

從表中可以看出,除個(gè)別點(diǎn)外,坐標(biāo)紙的四個(gè)方向邊緣區(qū)域以及中間區(qū)域共取了5個(gè)點(diǎn),其實(shí)測(cè)坐標(biāo)基本滿足設(shè)計(jì)要求。而個(gè)別點(diǎn)的誤差可能是由于接收模塊放置的位置不準(zhǔn)確或聲源放置地不準(zhǔn)確而產(chǎn)生。
九、總結(jié)
本次設(shè)計(jì)以 STC89C52 為核心部件,利用了聲音檢測(cè)與辨識(shí)技術(shù),利用嚴(yán)密的數(shù)學(xué)方法實(shí)現(xiàn)和確定了聲源的準(zhǔn)確定位。在系統(tǒng)設(shè)計(jì)過(guò)程中,力求硬件電路簡(jiǎn)單,降低硬件成本,節(jié)約功耗。
在這次課程設(shè)計(jì)中,我們遇到了許多問(wèn)題,這些問(wèn)題我們之前從未遇到過(guò),
但最終我們都找到了解決這些問(wèn)題的辦法,這對(duì)我們來(lái)說(shuō)是一次很好的鍛煉。在程序設(shè)計(jì)與軟件調(diào)試的過(guò)程之中,由于我們同時(shí)使用了 STC89C52 單片機(jī)中的四個(gè)中斷進(jìn)行控制處理,對(duì)于單片機(jī)各個(gè)中斷的優(yōu)先級(jí)與觸發(fā)的考慮更為復(fù)雜,但只要結(jié)合函數(shù)信號(hào)發(fā)生器模擬聲音信號(hào)觸發(fā)單片機(jī)得到調(diào)試結(jié)果,并且根據(jù)這些結(jié)果不斷改正程序,就能得到最優(yōu)的程序設(shè)計(jì)。另外在程序設(shè)計(jì)過(guò)程,由于子程序中數(shù)據(jù)處理十分重要,我們查閱了許多的資料,對(duì)于 C51中的數(shù)據(jù)類型以及常用的庫(kù)函數(shù)也更加的熟悉。 在硬件調(diào)試過(guò)程中,出現(xiàn)了聲音接收模塊電路不穩(wěn)定,易受到干擾,以及放大電路難以調(diào)試的問(wèn)題。對(duì)于接下來(lái)課程設(shè)計(jì)之后,我們也會(huì)考慮重新設(shè)計(jì)相關(guān)電路,例如采用雙比較器電路進(jìn)行比較放大,來(lái)提高電路的性能。


主程序源碼
  1. #include<reg52.h>
  2. #include<stdio.h>
  3. #include "delay.h"
  4. #include "lcd.h"
  5. #include<math.h>
  6. #define uchar unsigned char
  7. #define uint unsigned int
  8. #define BOOL bit
  9. #define BYTE unsigned char
  10. #define WORD unsigned int

  11. uchar signalA,signalB,signalC;
  12. uchar wolsignalA,wolsignalB,wolsignalC;
  13. uchar wolCount,obv;
  14. unsigned int posX,posY;         //坐標(biāo)取值

  15. code unsigned char byValidShow[] = {" V值:           "};
  16. code unsigned char DispX[] = {" X軸:           "};
  17. code unsigned char DispY[] = {" Y軸:           "};

  18. void Init_Show()           //LCD初始化顯示子程序
  19. {
  20.         Delay400Ms();
  21.         LCDInit();
  22.         LCDClear();
  23.         Delay5Ms();
  24.         LCDClear();
  25.         //DisplayListChar(0,1,byValidShow);
  26.         DisplayListChar(0,2,DispX);
  27.         DisplayListChar(0,3,DispY);
  28.         Delay5Ms();
  29. }

  30. void Init_isr()                //中斷初始化設(shè)置子程序
  31. {
  32.         EA = 0;
  33.         TMOD = 0x62;        
  34.         /*外部中斷0*/
  35.         IT0 = 1; EX0 = 1;
  36.         /*外部中斷1*/
  37.         IT1 = 1; EX1 = 1;
  38.         /* 計(jì)數(shù)器 0*/
  39.         TH1 = 0xFF; TL1 = 0xFF; TR1 = 1; ET1 = 1;
  40.         /* 定時(shí)器 1*/
  41.         TH0 = 246; TL0 = 246; TR0 = 0; ET0 = 0;
  42.         /***********/
  43.         IE0=0;IE1=0;TF1=0;TF0=0;
  44.         EA = 1;
  45. }

  46. void signalchuli(float m,float n)  //坐標(biāo)定位計(jì)算程序
  47. {

  48.         BOOL r1=0;
  49.         BOOL r2=0; //方程是否成立變量
  50.         BOOL suc=0; //解題是否成功變量
  51.         float x,y;        
  52.         for(x=10;x<=500;x+=10)
  53.         {
  54.                 for(y=10;y<=350;y+=10)
  55.                 {
  56.                         if(fabs(sqrt(x*x+(350-y)*(350-y))- sqrt(x*x+y*y)-m)<=20.0)
  57.                                 r1=1;
  58.                         //else r1=0;
  59.                         if(fabs(sqrt(x*x+y*y)-sqrt(y*y+(500-x)*(500-x)) -n)<=20.0)
  60.                                 r2=1;
  61.                         //else r2=0;
  62.                         if(r1&&r2)
  63.                                 {
  64.                                         suc=1;
  65.                                         break;
  66.                                 }
  67.                         else
  68.                                 {
  69.                                         r1=0;
  70.                                         r2=0;
  71.                                 }
  72.                 }
  73.                 if(suc)
  74.                         break;
  75.         }
  76.         
  77.         posX=x;
  78.         posY=y;
  79.         
  80. }

  81. void main()
  82. {
  83.         float cha1,cha2;
  84.         uchar cha1_temp,cha2_temp;
  85.         EA=0;
  86.         Init_Show();
  87.         Init_isr();               
  88.         while(1)
  89.         {
  90.                 if( signalA && signalB && signalC)
  91.                 {
  92.                         EA = 0;
  93.                         TR0=0;
  94.                         obv++;
  95.                         cha1_temp = wolsignalA - wolsignalB;
  96.                         cha2_temp = wolsignalB - wolsignalC;
  97.                         if(wolsignalA < wolsignalB)
  98.                         {
  99.                                 cha1_temp = 65536 - cha1_temp;
  100.                                 cha1 = -(3.4*cha1_temp);
  101.                         }
  102.                         else
  103.                         {
  104.                                 cha1 = 3.4*cha1_temp;
  105.                         }
  106.                         if(wolsignalB < wolsignalC)
  107.                         {
  108.                                 cha2_temp = 65536 - cha2_temp;
  109.                                 cha2 = -(3.4*cha2_temp);
  110.                         }
  111.                         else
  112.                         {
  113.                                 cha2 = 3.4*cha2_temp;
  114.                         }
  115.                         signalchuli(cha1,cha2);
  116.                         DisplayADData(4,2,posX);
  117.                         DisplayADData(4,3,posY);  //顯示坐標(biāo)
  118.                         signalA = 0;         
  119.                         signalB = 0;
  120.                         signalC = 0;                        
  121.                         wolCount = 0;
  122.                         Init_isr();
  123.                 }
  124.                 DisplayADData(0,4,wolsignalA);
  125.                 DisplayADData(3,4,wolsignalB);
  126.                 DisplayADData(6,4,wolsignalC);        //顯示時(shí)間插值,方便調(diào)試

  127.                 DisplayADData(0,1,signalA);        
  128.                 DisplayADData(3,1,signalB);
  129.                 DisplayADData(6,1,signalC);                //顯示觸發(fā)標(biāo)志位,方便調(diào)試
  130.         }
  131. }

  132. void JsA_isr() interrupt 0         //外部中斷0,下降沿觸發(fā)
  133. {
  134.         EX0 = 0;
  135.         if(wolCount == 0)
  136.         {
  137.                 wolsignalA = 0;
  138.                 TR0 = 1;
  139.                 ET0 = 1;
  140.         }
  141.         else
  142.         {
  143.                 wolsignalA = wolCount;
  144.         }
  145.         signalA = 1;
  146. }

  147. void JsB_isr() interrupt 2          //外部中斷1,下降沿觸發(fā)
  148. {
  149.         
  150.         if(wolCount == 0)
  151.         {
  152.                 wolsignalB = 0;
  153.                 TR0 = 1;
  154.                 ET0 = 1;
  155.         }        
  156.         else
  157.         {
  158.                 wolsignalB = wolCount;
  159.         }
  160.         signalB =1;
  161.         EX1 = 0;
  162. }

  163. void Timer1_isr() interrupt 3        //計(jì)數(shù)器1,工作方式2
  164. {
  165.         if(wolCount == 0)
  166.         {
  167.                 wolsignalC = 0;
  168.                 TR0 = 1;
  169.                 ET0 = 1;
  170.         }
  171.         else
  172.         {
  173.                 wolsignalC = wolCount;
  174.         }
  175.         signalC = 1;
  176.         ET1 = 0;        
  177. }                 

  178. void Timer0_isr() interrupt 1  //定時(shí)器0,工作方式2 , 10us
  179. {
  180.         wolCount++;        
  181. }
復(fù)制代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


全部資料51hei下載地址:
聲音定位系統(tǒng).rar (1.6 MB, 下載次數(shù): 353)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:403610 發(fā)表于 2018-10-28 21:06 | 只看該作者
樓主在嗎,我們小組也做了這個(gè),有些不懂得想問(wèn)一下
回復(fù)

使用道具 舉報(bào)

板凳
ID:487995 發(fā)表于 2019-3-10 17:07 | 只看該作者
架向櫻的星空 發(fā)表于 2018-10-28 21:06
樓主在嗎,我們小組也做了這個(gè),有些不懂得想問(wèn)一下

我也想問(wèn)一下
回復(fù)

使用道具 舉報(bào)

地板
ID:476221 發(fā)表于 2019-3-11 10:33 | 只看該作者
請(qǐng)問(wèn)一下有清楚的原理圖嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:218046 發(fā)表于 2019-4-12 21:04 | 只看該作者
看設(shè)計(jì)報(bào)告蠻詳細(xì)的,很有幫助,程序還沒(méi)測(cè)試,感謝樓主
回復(fù)

使用道具 舉報(bào)

6#
ID:514784 發(fā)表于 2019-4-17 17:22 | 只看該作者
問(wèn)下,那個(gè)LCD.h和delay.h的源代碼是怎么樣的
回復(fù)

使用道具 舉報(bào)

7#
ID:514845 發(fā)表于 2019-4-17 18:26 | 只看該作者
哎  求一個(gè)51 nrf24L01的收發(fā)完整控制燈亮程序
回復(fù)

使用道具 舉報(bào)

8#
ID:366634 發(fā)表于 2019-5-23 20:32 | 只看該作者
對(duì)于下面這段話能再解釋一下這三個(gè)時(shí)間怎么來(lái)的嗎?謝謝。
以及 A、B 和 C 三個(gè)聲音接收模塊依次收到信號(hào)時(shí)的計(jì)時(shí)時(shí)刻(其中從右到左依次為0us,65us和68us,此時(shí)模塊 C 最先收到聲音信號(hào))
回復(fù)

使用道具 舉報(bào)

9#
ID:440755 發(fā)表于 2019-7-5 12:27 | 只看該作者
講的很詳細(xì),謝謝樓主
回復(fù)

使用道具 舉報(bào)

10#
ID:458437 發(fā)表于 2019-11-4 10:33 | 只看該作者
好東西
回復(fù)

使用道具 舉報(bào)

11#
ID:662583 發(fā)表于 2019-12-31 15:10 | 只看該作者
這個(gè)真心不錯(cuò)
回復(fù)

使用道具 舉報(bào)

12#
ID:692176 發(fā)表于 2020-2-11 18:21 | 只看該作者
請(qǐng)問(wèn)樓主,這個(gè)聲源定位系統(tǒng)能對(duì)3-5米的人聲方位進(jìn)行大概定位嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:707901 發(fā)表于 2020-3-13 19:27 來(lái)自觸屏版 | 只看該作者
樓主在嗎想聯(lián)系一下解決一下問(wèn)題
回復(fù)

使用道具 舉報(bào)

14#
ID:707901 發(fā)表于 2020-3-15 16:30 | 只看該作者
有誰(shuí)知道聲音或者震動(dòng)定位還有什么產(chǎn)品 比較成熟的那種
回復(fù)

使用道具 舉報(bào)

15#
ID:698983 發(fā)表于 2020-4-21 16:15 | 只看該作者
飛飛會(huì)飛 發(fā)表于 2020-3-15 16:30
有誰(shuí)知道聲音或者震動(dòng)定位還有什么產(chǎn)品 比較成熟的那種

問(wèn)一下,你有用樓主這個(gè)設(shè)計(jì)嗎?能行嗎?
回復(fù)

使用道具 舉報(bào)

16#
ID:698983 發(fā)表于 2020-4-21 16:18 | 只看該作者
看了下樓主的測(cè)試圖,12684顯示上,第一行為啥全是0(未觸發(fā)中斷)?
回復(fù)

使用道具 舉報(bào)

17#
ID:698983 發(fā)表于 2020-4-25 12:23 | 只看該作者
我裂開(kāi)了,我單獨(dú)仿真了一次,發(fā)現(xiàn)根本不會(huì)產(chǎn)生中斷,這也太坑了吧
回復(fù)

使用道具 舉報(bào)

18#
ID:259850 發(fā)表于 2020-5-15 01:21 來(lái)自觸屏版 | 只看該作者
飛飛會(huì)飛 發(fā)表于 2020-3-13 19:27
樓主在嗎想聯(lián)系一下解決一下問(wèn)題

你解決好沒(méi)
回復(fù)

使用道具 舉報(bào)

19#
ID:259850 發(fā)表于 2020-5-15 22:22 來(lái)自觸屏版 | 只看該作者
呼呼哈 發(fā)表于 2020-4-25 12:23
我裂開(kāi)了,我單獨(dú)仿真了一次,發(fā)現(xiàn)根本不會(huì)產(chǎn)生中斷,這也太坑了吧

你解決好沒(méi)
回復(fù)

使用道具 舉報(bào)

20#
ID:660950 發(fā)表于 2021-1-2 19:56 | 只看該作者
你們根據(jù)這些文件做出來(lái)的實(shí)物實(shí)現(xiàn)定位的功能了嗎?
回復(fù)

使用道具 舉報(bào)

21#
ID:1026260 發(fā)表于 2022-5-13 22:20 來(lái)自觸屏版 | 只看該作者
這個(gè)文件是有問(wèn)題的嗎
回復(fù)

使用道具 舉報(bào)

22#
ID:1039802 發(fā)表于 2022-7-17 20:57 | 只看該作者
樓主的仿真圖
是用什么打開(kāi)的
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表