久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 12281|回復: 21
收起左側

我的單片機聲音定位系統課程設計 含源碼,仿真,原理圖,報告

  [復制鏈接]
ID:358557 發表于 2018-6-25 16:46 | 顯示全部樓層 |閱讀模式
這是我大三時的電子課程設計,做的聲音定位系統,課設具體要求如下:
0.png
附件里包含了,整個系統的源碼,設計報告(含原理圖)
2.png
3.png

本次設計采用 STC89C52RC 單片機進行運算處理和驅動 LCD12864 液晶顯示
屏顯示定位結果,即利用單片機內部定時器 0 計時,由外部中斷 0、外部中斷 1和定時器 1觸發,檢測接收信號的下降沿,通過這種方式計算聲音傳播后,不同模塊接收到信號的時間差,通過時間差計算出聲源信號到接收模塊距離,然后由單片機編程計算出聲源的位置坐標,最終顯示在液晶屏上。 STC89C52RC 單片機小系統電路和 LCD12864驅動電路如下圖所示:

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

0.png

0.png

六、測試方案
6.1  主要的測試儀器、儀表
本次主要使用的測試儀器與儀表有,函數信號發生器、示波器與數字萬用表。  
6.2  測試方法
在硬件測試中,按鍵發聲模塊通過示波器測試電路輸出波形,調節電位器改變電阻值來調節觸發時間,保證發出的聲響持續時間為 1s;另外使用數字萬用表測量按鍵發聲模塊的功耗。聲音接收模塊通過數字萬用表,測量當發聲模塊距接收模塊不同距離時,比較器輸出電壓,直至調節電位器,改變比較器靈敏度使輸出電壓在要求距離內能受到信號,并以下降沿觸發單片機。聲響模塊和接收模塊都可以使用函數發生器和示波器來檢測電路的連接是否正常。
在軟件測試中,我們組軟件調試的中心思想是分模塊調試。先將程序分為三個接受模塊,算法模塊,顯示模塊,我們在分塊調試時,將各個模塊的輸出都顯示出來以便于觀察各模塊是否正確。運用這種方法,可以將軟件上的錯誤精確定位到某一個環節,大大提高了調試的效率。以下是具體方法:
1、將程序中的標志位signalA,signalB,signalC 通過LCD屏幕顯示出來,以方便
觀察是否所有傳感器都收到了信號。
2、將各信號間的時間差通過 LCD 屏幕顯示出來,以方便觀察各傳感器的響應速度以及接受信號的先后順序是否與實際一致。
3、在接入傳感器前,先用另一片單片機模仿傳感器發出的信號,并通過程序設置時間差等參數,用于檢查算法是否正確。
七、系統調試   
7.1  按鍵發聲模塊
測試輸出電流(通過測量蜂鳴器串聯的 1Ω的電阻得到電流值),從圖中可知
為0.042A:
0.png
7.2  聲音接收模塊
當聲響模塊離接收模塊距離較近時,接收模塊輸出電壓達到 3.6V 左右。
0.png
當聲響模塊離接收模塊較遠時(但坐標仍屬于坐標紙的范圍),接收模塊輸出電壓將會變小。這個時候就需要調節電位器,改變電阻值以減小比較器 LM358 輸入端參考電壓的值。
0.png

7.3 LCD 液晶顯示模塊
進行測試時,LCD12864 液晶顯示模塊除了顯示坐標 X 與 Y的值外,還會顯示A、B、C 三個聲音接收模塊的中斷觸發標志值(如下圖顯示屏中第一行所顯示的內容,其中顯示值為 0 表示未觸發,為 1 則表示已觸發),以及 A、B 和 C 三個聲音接收模塊依次收到信號時的計時時刻(其中從右到左依次為0us,65us和68us,此時模塊 C 最先收到聲音信號) ,這樣方便系統調試。 下圖坐標 X 與Y值在誤差范圍內,滿足測量要求。
0.png
0.png
從表 8.2 可以看出,當電位器阻值較小時即比較器輸入端參考電壓接近 0 時更易收到信號,但實際上這樣做也更容易受到干擾。接收模塊 C 相較于A、B 模塊了,由于焊接工藝的問題,靈敏度較低。合理調節電位器阻值之后,三個模塊最終都能受到信號,滿足設計要求。
8.3  聲源實測坐標記錄表
對處于不同坐標的聲源進行了實際測量,最終得到了以下的一些實測數據如下
0.png
從表中可以看出,除個別點外,坐標紙的四個方向邊緣區域以及中間區域共取了5個點,其實測坐標基本滿足設計要求。而個別點的誤差可能是由于接收模塊放置的位置不準確或聲源放置地不準確而產生。
九、總結
本次設計以 STC89C52 為核心部件,利用了聲音檢測與辨識技術,利用嚴密的數學方法實現和確定了聲源的準確定位。在系統設計過程中,力求硬件電路簡單,降低硬件成本,節約功耗。
在這次課程設計中,我們遇到了許多問題,這些問題我們之前從未遇到過,
但最終我們都找到了解決這些問題的辦法,這對我們來說是一次很好的鍛煉。在程序設計與軟件調試的過程之中,由于我們同時使用了 STC89C52 單片機中的四個中斷進行控制處理,對于單片機各個中斷的優先級與觸發的考慮更為復雜,但只要結合函數信號發生器模擬聲音信號觸發單片機得到調試結果,并且根據這些結果不斷改正程序,就能得到最優的程序設計。另外在程序設計過程,由于子程序中數據處理十分重要,我們查閱了許多的資料,對于 C51中的數據類型以及常用的庫函數也更加的熟悉。 在硬件調試過程中,出現了聲音接收模塊電路不穩定,易受到干擾,以及放大電路難以調試的問題。對于接下來課程設計之后,我們也會考慮重新設計相關電路,例如采用雙比較器電路進行比較放大,來提高電路的性能。


主程序源碼
  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;         //坐標取值

  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()                //中斷初始化設置子程序
  31. {
  32.         EA = 0;
  33.         TMOD = 0x62;        
  34.         /*外部中斷0*/
  35.         IT0 = 1; EX0 = 1;
  36.         /*外部中斷1*/
  37.         IT1 = 1; EX1 = 1;
  38.         /* 計數器 0*/
  39.         TH1 = 0xFF; TL1 = 0xFF; TR1 = 1; ET1 = 1;
  40.         /* 定時器 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)  //坐標定位計算程序
  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);  //顯示坐標
  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);        //顯示時間插值,方便調試

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

  132. void JsA_isr() interrupt 0         //外部中斷0,下降沿觸發
  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,下降沿觸發
  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        //計數器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  //定時器0,工作方式2 , 10us
  179. {
  180.         wolCount++;        
  181. }
復制代碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png

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

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:403610 發表于 2018-10-28 21:06 | 顯示全部樓層
樓主在嗎,我們小組也做了這個,有些不懂得想問一下
回復

使用道具 舉報

ID:487995 發表于 2019-3-10 17:07 | 顯示全部樓層
架向櫻的星空 發表于 2018-10-28 21:06
樓主在嗎,我們小組也做了這個,有些不懂得想問一下

我也想問一下
回復

使用道具 舉報

ID:476221 發表于 2019-3-11 10:33 | 顯示全部樓層
請問一下有清楚的原理圖嗎
回復

使用道具 舉報

ID:218046 發表于 2019-4-12 21:04 | 顯示全部樓層
看設計報告蠻詳細的,很有幫助,程序還沒測試,感謝樓主
回復

使用道具 舉報

ID:514784 發表于 2019-4-17 17:22 | 顯示全部樓層
問下,那個LCD.h和delay.h的源代碼是怎么樣的
回復

使用道具 舉報

ID:514845 發表于 2019-4-17 18:26 | 顯示全部樓層
哎  求一個51 nrf24L01的收發完整控制燈亮程序
回復

使用道具 舉報

ID:366634 發表于 2019-5-23 20:32 | 顯示全部樓層
對于下面這段話能再解釋一下這三個時間怎么來的嗎?謝謝。
以及 A、B 和 C 三個聲音接收模塊依次收到信號時的計時時刻(其中從右到左依次為0us,65us和68us,此時模塊 C 最先收到聲音信號)
回復

使用道具 舉報

ID:440755 發表于 2019-7-5 12:27 | 顯示全部樓層
講的很詳細,謝謝樓主
回復

使用道具 舉報

ID:458437 發表于 2019-11-4 10:33 | 顯示全部樓層
好東西
回復

使用道具 舉報

ID:662583 發表于 2019-12-31 15:10 | 顯示全部樓層
這個真心不錯
回復

使用道具 舉報

ID:692176 發表于 2020-2-11 18:21 | 顯示全部樓層
請問樓主,這個聲源定位系統能對3-5米的人聲方位進行大概定位嗎?
回復

使用道具 舉報

ID:707901 發表于 2020-3-13 19:27 來自手機 | 顯示全部樓層
樓主在嗎想聯系一下解決一下問題
回復

使用道具 舉報

ID:707901 發表于 2020-3-15 16:30 | 顯示全部樓層
有誰知道聲音或者震動定位還有什么產品 比較成熟的那種
回復

使用道具 舉報

ID:698983 發表于 2020-4-21 16:15 | 顯示全部樓層
飛飛會飛 發表于 2020-3-15 16:30
有誰知道聲音或者震動定位還有什么產品 比較成熟的那種

問一下,你有用樓主這個設計嗎?能行嗎?
回復

使用道具 舉報

ID:698983 發表于 2020-4-21 16:18 | 顯示全部樓層
看了下樓主的測試圖,12684顯示上,第一行為啥全是0(未觸發中斷)?
回復

使用道具 舉報

ID:698983 發表于 2020-4-25 12:23 | 顯示全部樓層
我裂開了,我單獨仿真了一次,發現根本不會產生中斷,這也太坑了吧
回復

使用道具 舉報

ID:259850 發表于 2020-5-15 01:21 來自手機 | 顯示全部樓層
飛飛會飛 發表于 2020-3-13 19:27
樓主在嗎想聯系一下解決一下問題

你解決好沒
回復

使用道具 舉報

ID:259850 發表于 2020-5-15 22:22 來自手機 | 顯示全部樓層
呼呼哈 發表于 2020-4-25 12:23
我裂開了,我單獨仿真了一次,發現根本不會產生中斷,這也太坑了吧

你解決好沒
回復

使用道具 舉報

ID:660950 發表于 2021-1-2 19:56 | 顯示全部樓層
你們根據這些文件做出來的實物實現定位的功能了嗎?
回復

使用道具 舉報

ID:1026260 發表于 2022-5-13 22:20 來自手機 | 顯示全部樓層
這個文件是有問題的嗎
回復

使用道具 舉報

ID:1039802 發表于 2022-7-17 20:57 | 顯示全部樓層
樓主的仿真圖
是用什么打開的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区影院 | 久久国产成人午夜av影院武则天 | 日本亚洲精品成人欧美一区 | av片免费 | 日韩在线观看 | 欧美成人免费在线视频 | 成人伊人 | 久久国产高清 | 国产日韩欧美一区二区 | 91视频在线 | 欧美成人精品一区二区男人看 | 欧美日韩综合精品 | 日韩在线精品视频 | 超黄毛片 | jav成人av免费播放 | 欧美成人h版在线观看 | 久久精品高清视频 | 免费观看一级毛片 | 中文字幕精品一区二区三区精品 | 欧美激情精品久久久久 | 亚洲欧美日韩电影 | 99re在线视频 | 日本久久久一区二区三区 | 91视频a | 精品久久久久久久久久 | 自拍偷拍一区二区三区 | 精品欧美一区免费观看α√ | 国产精品成人一区二区三区吃奶 | 成人在线一区二区 | 欧美va大片| 中文字幕在线第一页 | 国产欧美一区二区三区在线看 | 一区二区三区在线看 | 亚洲成人一区二区三区 | 99久久婷婷国产精品综合 | 国产精品视频一区二区三区四区国 | 欧美xxxx黑人又粗又长 | 久久精品青青大伊人av | 91一区| 日韩a在线 | 亚洲精品毛片av |