找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

基于51單片機(jī)的聲音定位系統(tǒng)電路與源程序設(shè)計(jì)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:58647 發(fā)表于 2021-7-11 18:49 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
壓縮包包含文檔、程序等全部資料。
設(shè)計(jì)一套聲音定位系統(tǒng)。在一塊不大于 1m2 的平板上貼一張 500mm×350mm
的坐標(biāo)紙,在其四角外側(cè)分別固定安裝一個(gè)聲音接收模塊,聲音接收模塊通過導(dǎo)
線將聲音信號傳輸?shù)叫畔⑻幚砟K,聲音定位系統(tǒng)根據(jù)聲響模塊通過空氣傳播到 各聲音接收模塊的聲音信號,判定聲響模塊所在的位置坐標(biāo)。系統(tǒng)結(jié)構(gòu)示意圖如 圖 1 所示。



2.1 要求
圖 1 聲音定位系統(tǒng)結(jié)構(gòu)示意圖

(1) 設(shè)計(jì)制作一個(gè)聲響模塊,含信號產(chǎn)生電路、放大電路和微型揚(yáng)聲器等, 每按鍵一次發(fā)聲一次,聲音信號持續(xù)時(shí)間約為 1s。要求聲響模塊采用 5V 以下電 池供電,功耗不大于 200mW。
(2) 設(shè)計(jì)制作四路聲音接收模塊,由麥克風(fēng)、放大電路等組成,并分別與信 息處理模塊相連接,以便將聲音信號傳送至信息處理模塊。
(3) 設(shè)計(jì)制作一個(gè)信息處理模塊,要求該模塊能根據(jù)從聲音接收模塊傳來的 信號判斷聲響模塊所在位置的 x、y 坐標(biāo),并以數(shù)字形式顯示 x、y 坐標(biāo)值,位置 坐標(biāo)值誤差的絕對值不大于 30mm。
3.1 說明
(1)  注意預(yù)留測量聲響模塊功耗的電流電壓和信號放大電路輸出信號的測試
點(diǎn)。
(2) 采用三個(gè)聲音接收模塊即可實(shí)現(xiàn)定位,第四個(gè)模塊可對定位作進(jìn)一步校 正。
(3) 不允許聲響模塊與其他電路有任何連接,并要求在聲響模塊上做出明顯 標(biāo)記,以便清晰判讀模塊所在坐標(biāo)數(shù)值。
(4) 注意聲音通過其它傳播介質(zhì)帶來的影響。 二、總體設(shè)計(jì)與分析


為了實(shí)現(xiàn)本次設(shè)計(jì)的要求,系統(tǒng)必須具備以下功能:按鍵聲源發(fā)聲且持續(xù)時(shí) 間 1s、接收聲音、信號放大濾波、聲源定位等功能。其系統(tǒng)主要可以劃分為:聲 響模塊、聲音接收模塊、控制器和顯示模塊。
在整體的方案上,聲響模塊利用 555 單穩(wěn)態(tài)振蕩電路來達(dá)到每按鍵一次發(fā)聲一次
的功能。另外由于聲響模塊產(chǎn)生的聲音信號傳遞到接收模塊時(shí)是十分微弱的,所
以聲音接收模塊必須含有濾波,放大和比較等環(huán)節(jié),以便觸發(fā)控制器進(jìn)行運(yùn)算和 處理。本次設(shè)計(jì)采用了比較器 LM358 結(jié)合放大電路形成的聲音接收模塊。此系 統(tǒng)結(jié)構(gòu)框圖如下所示:



三、方案比較與選擇
3.1 處理器
圖 2.1 系統(tǒng)結(jié)構(gòu)框圖

方案一:采用 TI 公司生產(chǎn)的 MSP430 單片機(jī)。MSP430 系列單片機(jī)含有一種 超高速、低功耗的同時(shí)具有精簡指令集(RISC)的 16 位處理器。該系列芯片片內(nèi) 資源豐富,中斷源的數(shù)量較多,足以滿足本次設(shè)計(jì)對中斷源的需求。同時(shí) MSP430 系列單片機(jī)運(yùn)算速度快,片內(nèi)硬件資源豐富,能夠?qū)崿F(xiàn)一些較為復(fù)雜的算法和數(shù) 據(jù)處理。但在短時(shí)間內(nèi)掌握 MSP430 的編程與開發(fā)具有一定的難度。
方案二:采用 STC 公司生產(chǎn)的 STC89C52RC 單片機(jī)。STC89C52RC 是 STC 公司 生產(chǎn)的一種高性能 CMOS、低功耗的 8 位微控制器。其片內(nèi)含有五個(gè)可屏蔽中斷 源,且容易對其進(jìn)行編程處理,基本可以滿足本次設(shè)計(jì)要求。另外 STC89C52RC 單片機(jī)小系統(tǒng)的焊接較為簡單,后期調(diào)試工作也更加方便。 綜上所述,方案一成本較高,并且考慮到短時(shí)間內(nèi)不易掌握,經(jīng)過討論采取方案 二。
3.2 聲源裝置 方案一:采用單片機(jī)產(chǎn)生聲音信號,經(jīng)過功率放大電路,驅(qū)動無源蜂鳴器發(fā)
聲,這可以通過程序?qū)崿F(xiàn)。但由于 STC89C52RC 單片機(jī)片內(nèi)資源有限,需要另外 再焊接一個(gè)單片機(jī)小系統(tǒng),較為浪費(fèi)資源。
方案二:采用 555 單穩(wěn)態(tài)振蕩電路產(chǎn)生聲音信號,經(jīng)過三極管放大電路,驅(qū) 動無源蜂鳴器發(fā)聲。其通過內(nèi)部的定時(shí)器產(chǎn)生時(shí)基電路,外部只需簡單的驅(qū)動電 路便可實(shí)現(xiàn)按鍵一次,聲音持續(xù)時(shí)間 1s 的功能。該電路結(jié)構(gòu)簡單,可外接 5V 電 源,方便焊接與測試。
綜上所述,經(jīng)討論采取方案二。

3.3 聲音接收裝置 方案一:采用壓電式聲敏傳感器。壓電式聲敏傳感器是利用壓電晶體的壓電
效應(yīng)制成一種能實(shí)現(xiàn)聲-電轉(zhuǎn)換器件。但壓電聲敏傳感器不是常用器件,價(jià)格較 貴。
方案二:采用電容式駐極體話筒(咪頭)。該元件能將一般的聲音信號轉(zhuǎn)化為 電信號。價(jià)格便宜,便于設(shè)計(jì),之后再自行設(shè)計(jì)濾波與放大電路,一起構(gòu)成聲音 信號接收模塊。
綜上所述,電容式駐極體話筒對于滿足設(shè)計(jì)要求綽綽有余,經(jīng)過討論采取方 案二。
3.4 聲音信號放大電路 方案一:采用聲控開關(guān)。聲控開關(guān)使用簡單,價(jià)格便宜,但是反應(yīng)不夠靈敏,
精度較低。 方案二:采用多級放大整波電路,將接收的信號經(jīng)放大、濾波、電壓比較排
除噪聲干擾,精度高。 綜上所述,雖然方案二電路復(fù)雜運(yùn)用模電知識,但是項(xiàng)目要求精度比較高,
所以采用方案二。3.5 顯示模塊
方案一:LCD1602 液晶顯示屏,是一種工業(yè)字符型液晶,能夠同時(shí)顯示 16x02
(16 列 2 行)即 32 個(gè)字符。對于本次設(shè)計(jì)而言,雖然其能基本完成顯示坐標(biāo)軸
上 X 與 Y 的值,但考慮在調(diào)試過程中,需要顯示時(shí)間差值和因中斷觸發(fā)產(chǎn)生的標(biāo)
志值。LCD1602 顯然做不到實(shí)時(shí)顯示,增加了調(diào)試的難度。
方案二:LCD12864 液晶顯示屏,是一種具有多種接口方式,內(nèi)部簡體中文字
庫的點(diǎn)陣圖形液晶顯示模塊;其顯示分辨率為 128×64, 內(nèi)置 8192 個(gè) 16*16 點(diǎn)
漢字,和 128 個(gè) 16*8 點(diǎn) ASCII 字符集。利用該模塊靈活的接口方式和簡單、方
便的操作指令,完全滿足本次設(shè)計(jì)中的顯示需求和調(diào)試需求。
綜上所述,經(jīng)討論采取方案二。 四、電路設(shè)計(jì)
4.1 按鍵發(fā)聲模塊電路設(shè)計(jì)
聲音信號是通過 555 單穩(wěn)態(tài)振蕩電路產(chǎn)生。通過按下開關(guān)按鈕后,下降沿觸
發(fā),555 電路產(chǎn)生持續(xù)時(shí)間為 1s 的聲音信號,使三極管電路飽和導(dǎo)通并放大電
流,驅(qū)動無源蜂鳴器發(fā)聲。整個(gè)電路由 5V 紐扣電池供電,使用小功率三極管 A42
進(jìn)行放大電流,以實(shí)現(xiàn)低功耗。
按鍵發(fā)聲模塊的具體電路如下圖所示:

圖 4.1 按鍵發(fā)聲模塊電路


圖中公有兩個(gè) 555 單穩(wěn)態(tài)振蕩電路,其中第一個(gè) 555 單穩(wěn)態(tài)振蕩電路對按鍵延 時(shí)防抖,產(chǎn)生準(zhǔn)確的負(fù)脈沖。第二個(gè) 555 單穩(wěn)態(tài)振蕩電路中則產(chǎn)生持續(xù) 1s 的正 脈沖?梢 555 單穩(wěn)態(tài)振蕩電路中,每來一次負(fù)脈沖,便輸出一個(gè)正脈沖,其寬 度 Tw 由 RC 決定,滿足下列公式:
Tw = 1.1 × RC (s)
其中 R 在圖 4.1 中分別為 R22、R28;C 分別為 C17、C18。通過調(diào)節(jié) R28 即 可產(chǎn)生持續(xù) 1s 的高電平信號。
4.2 聲音接收模塊電路設(shè)計(jì) 聲音接收模塊采用駐極體話筒作為聲電轉(zhuǎn)換元件。駐極體話筒輸出端是內(nèi)部
場效應(yīng)管的漏極 D 和源極 S,此電路采用源極輸出,漏極接地的連接方式,故在 源極 S 與電源正極之間接入 10K 電阻。通過共基極放大電路放大電流信號,再經(jīng) 過由 LM358 組成的過零比較器電路輸出方波信號。電路中設(shè)置有 1K 的電位器 R18,以便調(diào)節(jié) LM358 比較器端的參考電壓,改變電路的靈敏度,使調(diào)試更為方 便。
聲音接收模塊電路具體如下圖所示:
圖 3.2 聲音接收模塊電路 由圖 3.2 可知,比較器輸入端參考電壓實(shí)際為:


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



五、算法與程序設(shè)計(jì)
5.1 數(shù)據(jù)處理原理:
圖 4.3 STC89C52RC 單片機(jī)模塊

本算法基于時(shí)間差算出未知點(diǎn)的坐標(biāo)點(diǎn)。從理論上分析,只需三個(gè)已知點(diǎn)就 可以對聲音源進(jìn)行定位,我們首先先將問題簡化為二維平面內(nèi)對聲音源進(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è)傳感器將先后接收 到信號,設(shè)信號到達(dá) A,B 的時(shí)間差為 t1,到達(dá) B,C 的時(shí)間差為 t2,則有:

我們只需在單片機(jī)程序中將 x, y 所有可能值都帶入到上式中,檢查有哪些值滿 足條件即可。



5.2 程序流程圖
圖 5.1 聲音定位系統(tǒng)等效平面圖

圖 5.2

5.3 子程序流程圖:


六、測試方案
6.1 主要的測試儀器、儀表
圖 5.3


本次主要使用的測試儀器與儀表有,函數(shù)信號發(fā)生器、示波器與數(shù)字萬用表。
6.2 測試方法 在硬件測試中,按鍵發(fā)聲模塊通過示波器測試電路輸出波形,調(diào)節(jié)電位器改
變電阻值來調(diào)節(jié)觸發(fā)時(shí)間,保證發(fā)出的聲響持續(xù)時(shí)間為 1s;另外使用數(shù)字萬用表 測量按鍵發(fā)聲模塊的功耗。聲音接收模塊通過數(shù)字萬用表,測量當(dāng)發(fā)聲模塊距接 收模塊不同距離時(shí),比較器輸出電壓,直至調(diào)節(jié)電位器,改變比較器靈敏度使輸
出電壓在要求距離內(nèi)能受到信號,并以下降沿觸發(fā)單片機(jī)。聲響模塊和接收模塊 都可以使用函數(shù)發(fā)生器和示波器來檢測電路的連接是否正常。
在軟件測試中,我們組軟件調(diào)試的中心思想是分模塊調(diào)試。先將程序分為三 個(gè)接受模塊,算法模塊,顯示模塊,我們在分塊調(diào)試時(shí),將各個(gè)模塊的輸出都顯 示出來以便于觀察各模塊是否正確。運(yùn)用這種方法,可以將軟件上的錯誤精確定


位到某一個(gè)環(huán)節(jié),大大提高了調(diào)試的效率。以下是具體方法:
1、將程序中的標(biāo)志位 signalA,signalB,signalC 通過 LCD 屏幕顯示出來,以方便 觀察是否所有傳感器都收到了信號。
2、將各信號間的時(shí)間差通過 LCD 屏幕顯示出來,以方便觀察各傳感器的響
應(yīng)速度以及接受信號的先后順序是否與實(shí)際一致。
3、在接入傳感器前,先用另一片單片機(jī)模仿傳感器發(fā)出的信號,并通過程序 設(shè)置時(shí)間差等參數(shù),用于檢查算法是否正確。
七、系統(tǒng)調(diào)試
7.1 按鍵發(fā)聲模塊
測試輸出電流(通過測量蜂鳴器串聯(lián)的 1Ω的電阻得到電流值),從圖中可知
為 0.042A:


圖 7.1.1
測試蜂鳴器兩端電壓,從圖中可知為 4.36V:



7.2 聲音接收模塊
圖 7.1.2


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



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



7.3 LCD 液晶顯示模塊
圖 7.2.1


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





八、數(shù)據(jù)測試與處理
圖 7.3.1


8.1 聲響模塊參數(shù)記錄表與測試數(shù)據(jù) 當(dāng)給聲響模塊供電時(shí)聲響模塊測試結(jié)果如下表所示:
測試內(nèi)容
測試結(jié)果
按鍵發(fā)生
聲音信號持續(xù)時(shí)間
1 .023s
功耗測試
183.12mW(4.36V,0.042A)
表 8.1
8.2 聲音接收模塊輸出電壓記錄表與測試數(shù)據(jù)
比較電路在不同靈敏度下,距聲源不同距離時(shí)聲音接收模塊輸出電壓測試結(jié)
果如下表所示:
表 8.2
從表 8.2 可以看出,當(dāng)電位器阻值較小時(shí)即比較器輸入端參考電壓接近 0 時(shí)
更易收到信號,但實(shí)際上這樣做也更容易受到干擾。接收模塊 C 相較于 A、B 模
塊了,由于焊接工藝的問題,靈敏度較低。合理調(diào)節(jié)電位器阻值之后,三個(gè)模塊
最終都能受到信號,滿足設(shè)計(jì)要求。
8.3 聲源實(shí)測坐標(biāo)記錄表 對處于不同坐標(biāo)的聲源進(jìn)行了實(shí)際測量,最終得到了以下的一些實(shí)測數(shù)據(jù)如

下表所示:

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



相關(guān)作品圖片
(1)作品整體圖:

(2)按鍵發(fā)聲模塊


(3)聲音接收模塊
(4)單片機(jī)小系統(tǒng)



單片機(jī)源程序如下:
  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ù)制代碼

以上文檔與程序資料51hei下載(初學(xué)作品,如有錯誤請大家多多指導(dǎo)):
基于51的聲音定位系統(tǒng).rar (1.6 MB, 下載次數(shù): 177)

評分

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

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:1020584 發(fā)表于 2022-4-23 14:08 | 只看該作者
請問您這個(gè)定位系統(tǒng)在使用另一個(gè)單片機(jī)仿真模擬傳感器信號的時(shí)候怎么操作的呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:1018456 發(fā)表于 2022-4-24 23:39 | 只看該作者
PSNR 發(fā)表于 2022-4-23 14:08
請問您這個(gè)定位系統(tǒng)在使用另一個(gè)單片機(jī)仿真模擬傳感器信號的時(shí)候怎么操作的呀

protues上可以仿真一下信號
回復(fù)

使用道具 舉報(bào)

地板
ID:1020584 發(fā)表于 2022-4-25 12:39 | 只看該作者
783748306 發(fā)表于 2022-4-24 23:39
protues上可以仿真一下信號

我用兩個(gè)單片機(jī)實(shí)際仿真總是出現(xiàn)問題 顯示的時(shí)間差與設(shè)定的不一樣 是因?yàn)閱纹瑱C(jī)引腳輸出信號不穩(wěn)定嗎 求助
回復(fù)

使用道具 舉報(bào)

5#
ID:1039802 發(fā)表于 2022-7-17 20:30 | 只看該作者
請問這個(gè)程序里面是不是還有一些時(shí)間之類的程序代碼需要另外寫啊,我照著寫了一下,結(jié)果出現(xiàn)了bug,求助
回復(fù)

使用道具 舉報(bào)

6#
ID:979908 發(fā)表于 2022-11-16 22:13 來自手機(jī) | 只看該作者
783748306 發(fā)表于 2022-4-24 23:39
protues上可以仿真一下信號

用proteus怎么仿真啊,在發(fā)聲模塊會出聲音嗎?在顯示模塊會顯示坐標(biāo)嗎?求助
回復(fù)

使用道具 舉報(bào)

7#
ID:979908 發(fā)表于 2022-11-16 22:15 來自手機(jī) | 只看該作者
在proteus怎么仿真啊,發(fā)聲模塊會發(fā)出聲音嗎?顯示模塊會顯示坐標(biāo)嗎?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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