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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17478|回復: 3
打印 上一主題 下一主題
收起左側

單片機超聲波測距+WTD588D語音播報的設計(附程序源碼+論文)

[復制鏈接]
跳轉到指定樓層
樓主
ID:417865 發表于 2018-10-30 13:37 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
摘 要

在空氣介質中超聲測距傳感器因其性能好,價格低廉、使用方便,在現場機器人定位系統、車輛自動導航、車輛安全行駛輔助系統、城市交通管理和高速公路管理監測系統,以及河道、油井和倉庫及料位的探測中都有應用。由于超聲波傳播不易受干擾,能量消耗緩慢,在介質中傳播的距離較遠,因而超聲波經常用于距離的測量,如測距和物位測量等都可以通過超聲波來實現。為此,深入研究超聲波的產生與傳播規律、開發高性能超聲波換能器及其收發電路,對于超聲波檢測技術的發展具有十分重要的現實意義。

本設計介紹了基于單片機控制的超聲測距的原理:由STC89C52控制定時器產生一定頻率脈沖,計算從發射到接收回波時間,從而得到實測距離,數據處理采用,lcd1602顯示距離,WTD588D語音播報。


目錄

摘 要
Abstract
第一章 緒論
1.1 課題設計目的及意義
1.1.1設計的目的
1.1.2設計的意義
1.2 國內外研究動態
1.3 本課題研究的主要內容
第二章 總體方案
2.1 方案選擇
2.2 超聲波測距儀的設計思路
2.2.1 超聲波測距原理
2.2.2 超聲波測距原理框圖
2.3 使用元件選擇
第三章 系統的硬件結構設計
3.1 STC89C52單片機的功能及特點
3.2單片機最小系統
3.4 語音播報
3.5 顯示單元
第四章 系統的軟件設計
4.1 主程序流程圖
4.2 超聲波發生子程序和超聲波接收中斷程序
第五章超聲波測距接收
5.1 HC-SR04模塊
5.2 T40、R40超聲波傳感器簡介
5.2.1 超聲波傳感器的基本介紹
5.2.2 超聲波傳感器的主要應用
5.2.3 超聲波傳感器的工作原理
5.3 超聲波發射電路
5.4 超聲波接收電路
5.5 超聲波接收過程
5.6 接收數據處理
第六章總結
致  謝
參考資料
附錄1原理圖
附錄2主要源程序

第一章 緒論

1.1 課題設計目的及意義

1.1.1設計的目的

隨著科學技術的快速發展,超聲波在測距中的應用越來越廣。但就目前的急速水平來說,人們可以具體利用的測距技術還十分有限,因此,這是一個正在蓬勃發展而又有無限前景的技術及產業領域。由于超聲波指向性強,能量消耗緩慢,在介質中傳播的距離較遠,因此超聲波經常用于距離測量,如超聲波測距和物位測量等都可以通過超聲波來實現。利用超聲波檢測往往比較迅速、方便、計算簡單、易于做到實時控制。為了研究和利用超聲波,人們已經設計和制成了許多超聲波發生器。研制具有更高定位精度的被動測距聲納,以滿足水中武器實施全隱蔽攻擊的需求;繼續發展采用低頻線譜檢測的潛艇拖拽線列陣聲納,實現超遠程的被動探測和識別;研制更適合與前還工作的潛艇聲納,特別是解決淺海水中目標識別問題;搭理降低潛艇自噪聲,改善潛艇聲納的工作環境。毋庸置疑,無線的超聲波測距將于自動化智能化接軌,與其他的測距儀集成和融合,形成多測距。隨著測距儀的技術進步,測距儀將從具有單純判斷功能發展到具有學習功能,最終發展到具有創造力。在新的世紀里,面貌一新的測距儀將發揮更大的作用。

1.1.2設計的意義

由于超聲測距是一種非接觸檢測技術,不受光線、被測對象顏色等的影響,較其它儀器更衛生,更耐潮濕、粉塵、高溫、腐蝕氣體等惡劣環境,具有少維護、不污染、高可靠、長壽命等特點,所以超聲波測距系統主要應用于汽車的倒車雷達、機器人自動避障行走、建筑施工工地以及一些工業現場中的液位、井深、管進長度測量等場合。因此研究超聲波測距系統有著很大的現實意義。對本課題的研究與設計,還能進一步提高自己的電路設計水平,深入對單片機的理解和應用。

1.2 國內外研究動態

    國外在提高超聲波測距方面做了大量的研究,國內一些學者也作了相關的研究。目前超聲波測距方法主要有三種:(1)相位檢測法:精度高,但檢測范圍有限;(2)聲波幅值檢測法:易受反射波的影響;(3)渡越時間法:工作方式簡單,直觀。現在對超聲波測距的精度主要取決于所測的超聲波傳輸時間和超聲波在介質中的傳輸速度,二者中以傳輸時間的精度影響較大,所以大部分文獻采用降低傳輸時間的不確定度來提高測距精度。溫度對傳感器的影響也很大,因此,需要用溫度傳感器進行校正,目前相位探測法和聲譜輪廓分析法或二者結合起來的方法是主要的降低探測傳輸不確定度的方法。

1.3 本課題研究的主要內容

超聲波是指頻率高于20KHz的機械波。為了以超聲波作為檢測手段,必須產生超生波和接收超聲波。完成這種功能的裝置就是超聲波換能器。超聲波傳感器有發送器和接收器,但一個超聲波換能器也可具有發送和接收聲波的雙重作用。超聲波換能器是利用壓電效應的原理將電能和超聲波相互轉化,即在發射超聲波的時候,將電能轉換,發射超聲波;而在收到回波的時候,則將超聲振動轉換成電信號。
超聲波測距的原理一般采用渡越時間法TOF(time of flight)。首先測出超聲波從發射到遇到障礙物返回所經歷的時間,再乘以超聲波的速度就得到二倍的聲源與障礙物之間的距離,擬應用以下三種技術:

    a、單片機技術:STC89C52系列的單片機具有體積小,重量輕,結構較為簡單,成本低廉,可以實現一般的控制功能的優點。而且單片機更適用應用于小型的嵌入式系統,因此它得到了廣泛的應用。現代人類生活大部分電子和機械產品中都會集成有單片機。

    b、超聲波測距技術:超聲波測距技術與一般測距技術相比,具有操作方便、系統簡單以及計算簡單的優點。

    c、顯示技術:數據處理,數碼管顯示測出與物體之間的距離。

    d、語音模塊技術:ISD1730A芯片來語音播報距離。


第二章 總體方案

2.1 方案選擇

采用單片機來控制超聲波測距,信號線發射到與超聲波發射器相連的信號端,超聲波發射器向既定方向發射,在發射的同時開始計時,超聲波在空氣中傳播,途中碰到障礙物將產生回波。

2.2 超聲波測距儀的設計思路
2.2.1 超聲波測距原理

超聲波測距的方法有多種,如相位檢測法、聲波幅值檢測法和渡越時間檢測法等。相位檢測法雖然精度高,但檢測范圍有限,聲波幅值檢測法易受反射波的影響。

本測距系統采用超聲波渡越時間檢測法。其原理為:檢測從發射傳感器發射的超聲波經氣體介質傳播到接收傳感器的時間t,這個時間就是渡越時間,然后求出距離l。設l為測量距離,t為往返時間差,超聲波的傳播速度為c,則有l=ct/2。超聲波接收器收到反射波就立即停止計時。再由單機計算出距離,送數碼管顯示測量結果。

超聲波測距的算法設計: 超聲波在空氣中傳播速度為每秒鐘340米(15℃時)。t2是接收超聲波時刻,t1是超聲波聲波發射時刻,t2-t1得出的是一個時間差的絕對值,假定t2-t1=0.03S,則有340m×0.03S=10.2m。由于在這10.2m的時間里,超聲波發出到遇到返射物返回的距離如下: 如圖2-2-1為測距原理[4]

圖2-1測距原理

因為θ/2角度較小,可以忽略不計,所以L≈S。

超聲波發出到遇到返射物返回的距離如下:

L=C x ( t2 -t1 )/ 2

由于超聲波也是一種聲波,其聲速c與空氣溫度有關,一般來說,溫度每升高1攝氏度,聲速增加0.6米/秒。表2-1列出了幾種溫度下的聲速。


表2-1  聲速與溫度的關系表

溫度(攝氏度)

-30

-20

-10

0

10

20

30

100

聲速(米/秒)

313

319

325

323

338

344

349

386


在使用時,如果溫度變化不大,則可認為聲速c是基本不變的,計算時取c為340m/s。如果測距精度要求很高,則可通過改變硬件電路增加溫度補償電路的方法或者在硬件電路基本不變的情況下通過軟件改進算法的方法來加以校正。

2.2.2 超聲波測距原理框圖

     超聲波測距模塊用HC-SR04,溫度傳感器使用DS18B20,微處理器使用STC89C52單片機,顯示部分采用共陽數碼管。HC-SR04集成的發射電路模塊發出超聲波,遇到障礙物產生回波,被接收電路模塊接收,STC89C52單片機統計出聲波傳輸所用時間,經過溫度補償溫,計算出正確的待測距離,同時ISD1730A根據相關數據處理進行組合播報當前測試距離,并且由數碼管顯示。

圖2-2 超聲波測距系統結構圖


2.3 使用元件選擇

由于測量距離的精度和長度要求不是很高,精度達到2cm,測量距離達到2m即可,因此超聲波模塊選用價格低廉且實用的HC-SR04即可。

    控制核心部分選擇實用的STC89C52單片機即可滿足計算和控制要求。

溫度補償的溫度傳感器選擇普遍且實用的DS18B20。

    語音播報:ISD1730A是華邦公司新推出的語音芯片,用來替代已經停產的ISD1400 系列及ISD2500 系列芯片。ISD1730A不僅在錄音時間上有更多的選擇(從20秒到240 秒),而且在功能上繼承14及25系列的所有錄放功能,并增加了一些更加人性化的提示功能及對存儲地址的精確操作。根據我們經營 ISD 系列芯片多年的經驗來看,ISD1700 的音質也較14及25系列有明顯的提高

ISD1700 系列芯片是華邦公司新推出的單片優質語音錄放電路,該芯片提供多項新功能,包括內置專利的多信息管理系統,新信息提示(vAlert ),雙運作模式(獨立&嵌入式),以及可定制的信息操作指示音效。芯片內部包含有自動增益控制、麥克風前置擴大器、揚聲器驅動線路、振蕩器與內

存等的全方位整合系統功能。。

    顯示部分:選擇了四位數碼管。


第三章 系統的硬件結構設計
3.1 STC89C52單片機的功能及特點

    STC89C52單片機是宏晶科技推出的新一代高速/低功耗/超強抗干擾的單片機,指令代碼完全兼容傳統 8051 單片機,12 時鐘/機器周期和 6 時鐘/機器周 期可以任意選擇。

    主要特性如下:

    增強型 8051 單片機,6 時鐘/機器周期和 12 時鐘/機器周期可以任 意選擇,指令代碼完全兼容傳統 8051.

    工作電壓:5.5V~3.3V(5V 單片機)/3.8V~2.0V(3V 單片機)

    工作頻率范圍:0~40MHz,相當于普通 8051 的 0~80MHz,實際工 作頻率可達 48MHz

    用戶應用程序空間為 8K 字節

    片上集成 512 字節 RAM

    通用 I/O 口(32 個)復位后為:P1/P2/P3/P4 是準雙向口/弱上拉,P0口是漏極開路輸出,作為總線擴展用時,不用加上拉電阻,作為 I/O 口用時,需加上拉電阻。

    ISP(在系統可編程)/IAP(在應用可編程) ,無需專用編程器,無 需專用仿真器,可通過串口(RxD/P3.0,TxD/P3.1)直接下載用戶程 序,數秒即可完成一片

    具有 EEPROM 功能

    具有看門狗功能

    共 3 個 16 位定時器/計數器。即定時器 T0、T1、T2

    外部中斷 4 路,下降沿中斷或低電平觸發電路,Power Down 模式可由外部中斷低電平觸發中斷方式喚醒

    通用異步串行口(UART),還可用定時器軟件實現多個UART

    工作溫度范圍:-40~+85℃(工業級)/0~75℃(商業級)

STC89C52RC單片機的工作模式

掉電模式:典型功耗<0.1μA,可由外部中斷喚醒,中斷返回后,繼續執行原 程序
    空閑模式:典型功耗 2mA 典型功耗

正常工作模式:典型功耗 4Ma~7mA 典型功耗

掉電模式可由外部中斷喚醒,適用于水表、氣表等電池供電系統及便攜設備
    STC89C52RC 引腳功能說明

    VCC(40 引腳):電源電壓

VSS(20 引腳):接地

    P0 端口(P0.0~P0.7 P0.7,39~32 引腳) :P0口是一個漏極開路的 8 位雙向 I/O 口。作為輸出端口,每個引腳能驅動 8 個 TTL 負載,對端口 P0 寫入 每個引腳能驅動 寫入“1”時,可 以作為高阻抗輸入。在訪問外部程序和數據存儲器時 在訪問外部程序和數據存儲器時,P0 口也可以提供低 8 位 地址和 8 位數據的復用總線 位數據的復用總線。此時,P0 口內部上拉電阻有效。在 Flash ROM編在程時,P0 端口接收指令字節 端口接收指令字節;而在校驗程序時,則輸出指令字節 則輸出指令字節。驗證時,要求外接上拉電阻。

P1 端口(P1.0~P1.7,1~8 引腳) :P1口是一個帶內部上拉電阻的 8 位雙向 I/O 口。P1 的輸出緩沖器可驅動(吸收或者輸出電流方式)4 個 TTL 輸入。對端 口寫入 1 時,通過內部的上拉電阻把端口拉到高電位,這是可用作輸入口。P1 口作輸入口使用時,因為有內部上拉電阻,那些被外部拉低的引腳會輸出一個電 流( ) 。

此外,P1.0 和 P1.1 還可以作為定時器/計數器 2 的外部技術輸入(P1.0/T2)和定時器/計數器 2 的觸發輸入(P1.1/T2EX),具體參見下表:

在對 Flash ROM 編程和程序校驗時,P1接收低 8 位地址。

表 XX P1.0 和 P1.1引腳復用功能

P2 端口(P2.0~P2.7,21~28 引腳) :P2 口是一個帶內部上拉電阻的 8 位雙向 I/O 端口。P2 的輸出緩沖器可以驅動(吸收或輸出電流方式)4個TTL輸入。對端口寫入 1 時,通過內部的上拉電阻把端口拉到高電平,這時可用作輸入口。P2 作為輸入口使用時,因為有內部的上拉電阻,那些被外部信號拉低的引腳會 輸出一個電流(I) 。

    在訪問外部程序存儲器和16位地址的外部數據存儲器(如執行“MOVX @DPTR”指令)時,P2 送出高 8 位地址。在訪問 8 位地址的外部數據存儲器(如 執行“MOVX @R1”指令)時,P2口引腳上的內容(就是專用寄存器(SFR)區 中的 P2 寄存器的內容),在整個訪問期間不會改變。

    在對 Flash ROM 編程和程序校驗期間,P2也接收高位地址和一些控制信號。

    P3 端口(P3.0~P3.7,10~17 引腳) :P3 是一個帶內部上拉電阻的 8 位雙向 I/O 端口。P3 的輸出緩沖器可驅動(吸收或輸出電流方式)4 個 TTL 輸入。對端 口寫入 1 時,通過內部的上拉電阻把端口拉到高電位,這時可用作輸入口。P3 做輸入口使用時,因為有內部的上拉電阻,那些被外部信號拉低的引腳會輸入一 個電流( ) 。
    在對 Flash ROM 編程或程序校驗時,P3 還接收一些控制信號。
    P3 口除作為一般 I/O 口外,還有其他一些復用功能,如下表所示:

表XX P3口引腳復用功能 復用功能

    RST(9 引腳) :復位輸入。當輸入連續兩個機器周期以上高電平時為有效,用來完成單片機單片機的復位初始化操作。看門狗計時完成后,RST 引腳輸出 96 個晶振周期的高電平。特殊寄存器 AUXR(地址 8EH)上的 DISRTO 位可以使此功 能無效。DISRTO 默認狀態下,復位高電平有效。

    ALE/ ROG(30 引腳) 地址鎖存控制信號 :(ALE)是訪問外部程序存儲器時, 鎖存低 8 位地址的輸出脈沖。在 Flash 編程時,此引腳( ROG)也用作編程輸入 脈沖。

    在一般情況下,ALE 以晶振六分之一的固定頻率輸出脈沖,可用來作為外部 定時器或時鐘使用。然而,特別強調,在每次訪問外部數據存儲器時,ALE 脈沖 將會跳過。

    如果需要,通過將地址位 8EH 的 SFR 的第 0 位置“1”,ALE 操作將無效。這 一位置“1”,ALE 僅在執行 MOVX 或 MOV 指令時有效。否則,ALE 將被微弱拉 高。這個 ALE 使能標志位(地址位 8EH 的 SFR 的第 0 位)的設置對微控制器處于 外部執行模式下無效。
    外部程序存儲器選通信號(SEN)是外部程序存儲器選 SEN(29引腳)
通信號。當 STC89C52RC 從外部程序存儲器執行外部代碼時,SEN在每個機器周 期被激活兩次,而訪問外部數據存儲器時, SEN將不被激活。A/VPP(31引腳) 訪問外部程序存儲器控制信號。為使能從 0000H 到 FFFFH 的外部程序存儲器讀取指令,A必須接 GND。注意加密方式 1 時, A將內部鎖 定位 RESET。為了執行內部程序指令, A應該接 VCC。在 Flash 編程期間, A也接收 12 伏 VPP 電壓。 XTAL1(19 引腳) :振蕩器反相放大器和內部時鐘發生電路的輸入端。 XTAL2(18 引腳):振蕩器反相放大器的輸入端。


圖3-1 STC89C52引腳圖

3.2單片機最小系統

    單片機最小系統,或者稱為最小應用系統,是指用最少的元件組成的單片機可以工作的系統.
    對52系列單片機來說,最小系統一般應該包括:單片機、晶振電路、復位電路.

    單片機最小系統電路介紹
    52單片機最小系統復位電路的極性電容C1的大小直接影響單片機的復位時間,一般采用10~30uF,51單片機最小系統容值越大需要的復位時間越短。
    52單片機最小系統晶振Y1也可以采用12MHz,在正常工作的情況下可以采用更高頻率的晶振,51單片機最小系統晶振的振蕩頻率直接影響單片機的處理速度,頻率越大處理速度越快。
    52單片機最小系統起振電容C2、C3一般采用15~33pF,并且電容離晶振越近越好,晶振離單片機越近越好4.P0口為開漏輸出,作為輸出口時需加上拉電阻,阻值一般為10k。
    設置為定時器模式時,加1計數器是對內部機器周期計數(1個機器周期等于12個振蕩周期,即計數頻率為晶振頻率的1/12)。計數值N乘以機器周期Tcy就是定時時間t。
    設置為計數器模式時,外部事件計數脈沖由T0或T1引腳輸入到計數器。在每個機器周期的S5P2期間采樣T0、T1引腳電平。當某周期采樣到一高電平輸入,而下一周期又采樣到一低電平時,則計數器加1,更新的計數值在下一個機器周期的S3P1期間裝入計數器。由于檢測一個從1到0的下降沿需要2個機器周期,因此要求被采樣的電平至少要維持一個機器周期。當晶振頻率為12MHz時,最高計數頻率不超過1/12MHz,即計數脈沖的周期要大于2 ms。

圖3-2單片機最小系統


3.4 語音播報
    語音模塊采用WT588D語音模塊,WT588D是廣州唯創與臺灣華邦合作研發的一款語音芯片(單片機)。WT588D不僅可以作為一般語音芯片,當從片發聲,而且因為I/O口多,帶控制功能和外置FLASH存儲器,所以能做FLASH單片機;最重要的是還可以按照樣品直接投掩膜,管腳完全不用改動,價錢便宜一半。WT588D性能卓越,簡單易用,與51單片機有著極為相似的性能。WT588D語音芯片是一款功能強大的可重復擦除燒寫的語音單片機芯片。配套WT588D VioceChip上位機操作軟件可隨意更換WT588D語音單片機芯片的任何一種控制模式,把信息下載到SPI-Flash上即可。軟件操作方式簡潔易懂,撮合了語音組合技術,大大減少了語音編輯的時間。 MP3控制模式下,完全迎合市場上MP3的播放/暫停、停止、上一曲、下一曲、音量+、音量-等功能; 按鍵控制模式下觸發方式靈活,可隨意設置任意按鍵為脈沖可重復觸發、脈沖不可重復觸發、無效按鍵、電平保持不循環、電平保持可循環、非電平保持可循環、單鍵向前不循環、單鍵向后不循環、單鍵向前可循環、單鍵向后可循環、音量+、音量-、播放/暫停、停止、播放/停止等15種觸發方式,最多可控制10個按鍵觸發輸出; 3×8按鍵組合控制模式下能以脈沖可重復觸發的方式觸發24個地址位語音,所觸發地址位語音可在0~219之間設置;并口控制模式最多可用8個I/O口進行控制; 一線串口控制模式可通過發碼端控制語音播放、停止、循環播放和音量大小,或者直接觸發0~219地址位的任意語音,發碼速度600us~2000us; 三線串口控制模式和三線串口控制I/O口擴展輸出模式之間可通過發碼切換,三線串口控制模式下,能控制語音播放、停止、循環播放和音量大小,或者直接觸發0~219地址位的任意語音,三線串口控制I/O口擴展輸出可以擴展輸出8位,在兩種模式下切換,能讓上一個模式的最后一種狀態保持著進入下一個模式。 PWM和DAC輸出方式,PWM輸出可直接推動0.5W/8Ω的揚聲器,DAC輸出外接功放,音質好。 應用范圍廣,幾乎可以涉及到所有的語音場所,如報站器、報警器、提醒器、鬧鐘、學習機、智能家電、治療儀、電子玩具、電訊、以及各種自動控制裝置等場所,工藝上達到工業應用的要求。

WT588D的特性:
1.外掛2M~32M的Flash,時間從32—1054秒。掩膜為內置ROM,最長支持400秒(@6K采樣)。采樣率支持6K~22K
2.DAC輸出:13Bit,PWM輸出:12Bit
3.內置0.5W功放,可直接推動0.5W/8Ω揚聲器
4.支持加載MP3/WAV/WMA三種音頻格式
5.工作電壓:DC2.8V~5.5V
6.靜態休眠電流:<10uA
7.可通過電腦軟件,隨意組合語音,可插入靜音,插入的靜音不占用內存的容量,一個已加載語音可重復調用到多個地址,重復調用的,不占空間,這是其它芯片所不具備的
8.USB下載方式,支持在線下載/ISP下載
9.7種控制方式: MP3控制模式、按鍵控制模式、3×8矩陣控制模式、并口控制模式、一線串口控制模式、三線串口控制模式以及三線串口控制I/O口擴展輸出模式
10.掩膜后的管腳與原來一致,性能一樣,音質一樣。不用更改電路。且不用焊接FLASH
11.最多可加載500段語音;210段可控制地址位,單個地址位最多可加載128段語音,地址位內的語音組合播放;
12.插入的靜音時間范圍10ms~25min;靜音不占用存儲空間;
語音提示模塊電路圖如圖17所示



圖3-3 語音播報電路

3.5 顯示單元
本設計在接收端部分采用LCD1602液晶顯示模塊來顯示溫度,,P1由上拉電阻提高驅動能力,作為數據輸出并作為LCD的驅動,P2口的P2.7-P2.6分別作為液晶顯示模塊的使能信號E,數據/命令選擇RS,R/W端則配置成寫。具體電路如圖2.11所示。

圖3-6 顯示電路圖

第四章 系統的軟件設計

超聲波測距儀的軟件設計主要有主程序、超聲波發生程序、超聲波接收中斷程序及顯示子程序組成。我們知道C語言程序有利于實現較復雜的算法,匯編語言程序則具有較高的效率且容易精細計算程序運行的時間,而超聲波測距儀的程序需要有較復雜的計算(計算距離時),所以控制程序可采用C語言編程。

4.1 主程序流程圖

軟件分為兩部分,主程序和中斷服務程序,如圖4-1、圖4-2、圖4-3所示。主程序完成初始化工作、各路超聲波發射和接收順序的控制。

定時中斷服務子程序完成單方向超聲波的發射,外部中斷服務子程序主要完成時間值的讀取、距離計算、結果的輸出等工作。

主程序首先是對系統環境初始化,設置定時器T0工作模式為16位定時計數器模式。置位總中斷允許位EA并給顯示端口P0和P1清0。然后調用超聲波發生子程序送出一個超聲波脈沖,為了避免超聲波從發射器直接傳送到接收器引起的直射波觸發,需要延時約0.1ms(這也就是超聲波測距儀會有一個最小可測距離的原因)后,才打開外中斷1接收返回的超聲波信號.

圖4-1主程序流程

由于采用的是12MHz的晶振,計數器每計一個數就是1μs,當主程序檢測到接收成功的標志位后,將計數器T0中的數(即超聲波來回所用的時間)按式(4-1)計算,即可得被測物體與測距儀之間的距離,設計時取20℃時的聲速為344m/s則有:

d=(ct)/2=172T0/10000cm                     (4-1)

其中,T0為計數器T0的計算值。

測出距離后結果將傳給LCD數碼顯示約5s,同時測量距離送語音模塊播報。然后再發超聲波脈沖重復測量過程。為了有利于程序結構化和容易計算出距離,主程序采用C語言編寫。

4.2 超聲波發生子程序和超聲波接收中斷程序

超聲波發生子程序的作用是通過P1.1端口發送2個左右超聲波脈沖信號(頻率約40kHz的方波),脈沖寬度為20μs左右,同時把計數器T0打開進行計時。超聲波發生子程序較簡單,但要求程序運行準確。

圖4-2 定時中斷服務子程序

圖4-3 外部中斷服務子程序

超聲波測距儀主程序利用外中斷1檢測返回超聲波信號,一旦接收到返回超聲波信號(即INT1引腳出現低電平),立即進入中斷程序。進入中斷后就立即關閉計時器T0停止計時,并將測距成功標志字賦值1。如果當計時器溢出時還未檢測到超聲波返回信號,則定時器T0溢出中斷將外中斷1關閉,并將測距成功標志字賦值2以表示此次測距不成功。

1





1




第五章超聲波測距接收

5.1 HC-SR04模塊

HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,其結構簡單,使用單片機控制電路簡單容易,而且價格便宜。該模塊包括超聲波發射、接收與控制電路。實物如圖5-1。

圖5-1  HC-SR04模塊實物圖

基本工作原理

①采用IO口TRIG觸發測距,給至少10us的高電平信號;

②模塊自動發送8個40khz的方波,自動檢測是否有信號返回;

③有信號返回,通過IO口ECHO輸出一個高電平,高電平持續時間就是超

聲波從發射到返回的時間。

電氣參數

HC-SR04模塊參數如下表5-1所示。


表5-1模塊參數
電氣參數
HC-SR04超聲波模塊
工作電壓
DC 5V
工作電流
15mA
工作頻率
40khz
最遠射程
4m
最近射程
2cm
測量角度
15°
輸入觸發信號
10us的TTL脈沖
輸入回響信號
輸出TTL電平信號,與射程成比例
規格尺寸
45*20*15cm

超聲波時序圖
超聲波時序圖如圖5-2所示
圖5-2超聲波時序圖

以上時序圖表明只需要提供一個10us以上脈沖信號,該模塊內部將發出8個40khz周期電平并檢測回波。一旦檢測到有回波信號則輸出回響信號。回響信號的脈沖寬度與測量的距離成正比。由此通過發射信號到收到的回響信號時間間隔可以計算得到距離:

距離=高電平時間*聲速(340m/s)/2。

為防止發射信號對回響信號的影響,測量周期一般要60ms以上。

模塊主要由Em78p153單片機、MAX232、TL074、超聲波傳感器:T40-16、R40-16組成。

Em78p153單片機

①概況描述

Em78p153是采用高速CMOS工藝制造的8位單片機。其內部有512*13位一次性ROM(OTPROM)。因此,用戶可以方便改進完善程序。程序代碼可用EMC編程器寫入芯片。有13位選項位可滿足用戶要求,其中的保護位可用來防止程序被讀出。

②功能特點

工作電壓范圍:2.0V~6.0V;

工作溫度范圍:0℃~70℃;

工作頻率范圍:DC~8MHz;

512×13位片內ROM;32×8位片內寄存器(SDRAM);

片內有4MHz校準RC振蕩器;

2個雙向I/O端口;

8位實時定時/計數器(TCC),信號源、觸發沿可編程選擇,溢出產生中斷;

掉電模式(SLEEP模式);

3個中斷源:TCC溢出中斷、輸入引腳狀態變化中斷、外部中斷;

EM78P153為14腳封裝;封裝形式:SOP、SSOP和DIP。

③引腳分配

Em78p153單片機引腳分配如圖5-3。

圖5-3 Em78p153引腳圖

MAX232

MAX232芯片是美信公司專門為電腦的RS-232標準串口設計的單電源電平轉換芯片,使用+5v單電源供電。MAX232多用于串口通信,起到電平轉換的作用,而本設計只用到其電平轉換,將40kHz的方波由5V轉換成20V,提高發射功率。超聲波發射頭采用共振頻率為40kHz的TCT40-16探頭,接收頭采用RCT40-16。

①MAX232引腳圖

芯片引腳如圖5-4。

圖5-4 MAX232引腳圖

②引腳介紹
第一部分是電荷泵電路。由1、2、3、4、5、6腳和4只電容構成。功能是產生+12v和-12v兩個電源,提供給RS-232串口電平的需要。
第二部分是數據轉換通道。由7、8、9、10、11、12、13、14腳構成兩個數據通道。其中13腳(R1IN)、12腳(R1OUT)、11腳(T1IN)、14腳(T1OUT)為第一數據通道;8腳(R2IN)、9腳(R2OUT)、10腳(T2IN)、7腳(T2OUT)為第二數據通道。
第三部分是供電。15腳GND、16腳VCC(+5v)。
TL074
常用的低噪聲JFET輸入運算放大器,引腳如圖5-5。
圖5-5 TL074引腳圖

1、2、3腳是通道1的輸出端、反相輸入端、同相輸入端,5、6、7腳是通道2的同相輸入端、反相輸入端、輸出端,8、9、10腳是通道3的輸出端、反相輸入端、同相輸入端,12、13、14腳是通道4的同相輸入端、反相輸入端、輸出端,4腳是正電源,11腳是負電源。TL074內部組件數量如下表5-2所示

表5-2 TL074組件
電阻
44
晶體管
56
JFET
6
二極管
4
電容
4
epi-FET
4

T40-16與R40-16

為了研究和利用超聲波,人們已經設計和制成了許多超聲波發生器。總體上講,超聲波發生器可以分為兩大類:

電氣方式產生超聲波, 主要包括壓電型、磁致伸縮型和電動型等;

機械方式產生超聲波,主要包括加爾統笛、液哨和氣流旋笛等。

    它們所產生的超聲波的頻率、功率和聲波特性各不相同,因而用途也各不相同。目前較為常用的是壓電式超聲波發生器。

壓電式超聲波發生器實際上是利用壓電晶體的諧振來工作的。其內部有兩個壓電晶片和一個共振板。當它的兩極外加脈沖信號,其頻率等于壓電晶片的固有振蕩頻率時,壓電晶片發生共振,帶動共振板振動,便產生超聲波。反之,如果兩電極間未外加電壓,當共振板接收到超聲波時,將壓迫壓電晶片作振動,將機械能轉換為電信號,這時它就成為超聲波接收器了。模塊使用T40-16T/R超聲波換能器即為壓電型。

①器件說明

名 稱:壓電陶瓷超聲波傳感器;

型 號:T40-16T/R;

類 別:通用型;

中心頻率:40KHZ;

外 徑:16mm;

使用方式:T為發射頭,R為接收頭,TR為收發兼用;

適用范圍:家用電器及其它電子設備的超聲波遙控裝置;超聲波測距及汽車倒車防撞裝置;液面探測;超聲波接近開關及其它應用的超聲波發射與接收。

②器件性能

1.標稱頻率(KHz):40KHz;

2.發射電壓at10V(0dB=0.02mPa):≥110dB;

3.接收靈敏度at40KHz(0dB=V/ubar):≥-70dB;

4.靜電容量at1KHz,<1V(PF):2000±30%;

5.探測距離(m):0.02-10。

傳感器實物如圖5-5 所示。


圖5-6 傳感器實物圖

HC-SR04模塊集成了發射和接受電路,硬件上不必再自行設計繁復的發射及接收電路,軟件上也無需再通過定時器產生40Khz的方波引起壓電陶瓷共振從而產生超聲波。使用時,只要在控制端‘Trig’發一個大于10us寬度的高電平,就可以在接收端‘Echo’等待高電平輸出。單片機一旦檢測到有輸出就打開定時器開始計時。當此口變為低電平時就停止計時并讀出定時器的值,此值就為此次測距的時間,再根據傳播速度方可算出障礙物的距離。

5.2 T40、R40超聲波傳感器簡介
5-7 元件內部結構
5-8 元件外部結構

5.2.1 超聲波傳感器的基本介紹

超聲波測距換能器是利用超聲波的特性研制而成的換能器。超聲波是一種振動頻率高于聲波的機械波,由換能晶片在電壓的激勵下發生振動產生的,它具有頻率高、波長短、繞射現象小,特別是方向性好、能夠成為射線而定向傳播等特點。超聲波對液體、固體的穿透本領很大,尤其是在陽光不透明的固體中,它可穿透幾十米的深度。超聲波碰到雜質或分界面會產生顯著反射形成反射成回波,碰到活動物體能產生多普勒效應。因此超聲波檢測廣泛應用在工業、國防、生物醫學等方面。

以超聲波作為檢測手段,必須產生超聲波和接收超聲波。完成這種功能的裝置就是超聲波換能器,或者探頭。

超聲波換能器主要由壓電晶片組成,既可以發射超聲波,也可以接收超聲波。小功率超聲探頭多作探測作用。它有許多不同的結構,可分直探頭(縱波)、斜探頭(橫波)、表面波探頭(表面波)、蘭姆波探頭(蘭姆波)、雙探頭(一個探頭反射、一個探頭接收)等。

5.2.2 超聲波傳感器的主要應用

超聲波傳感技術應用在生產實踐的不同方面,而醫學應用是其最主要的應用之一,下面以醫學為例子說明超聲波傳感技術的應用。超聲波在醫學上的應用主要是診斷疾病,它已經成為了臨床醫學中不可缺少的診斷方法。超聲波診斷的優點是:對受檢者無痛苦、無損害、方法簡便、顯像清晰、診斷的準確率高等。因而推廣容易,受到醫務工作者和患者的歡迎。超聲波診斷可以基于不同的醫學原理,我們來看看其中有代表性的一種所謂的A型方法。這個方法是利用超聲波的反射。當超聲波在人體組織中傳播遇到兩層聲阻抗不同的介質界面是,在該界面就產生反射回聲。每遇到一個反射面時,回聲在示波器的屏幕上顯示出來,而兩個界面的阻抗差值也決定了回聲的振幅的高低。

在工業方面,超聲波的典型應用是對金屬的無損探傷和超聲波測厚兩種。過去,許多技術因為無法探測到物體組織內部而受到阻礙,超聲波傳感技術的出現改變了這種狀況。當然更多的超聲波傳感器是固定地安裝在不同的裝置上,“悄無聲息”地探測人們所需要的信號。在未來的應用中,超聲波將與信息技術、新材料技術結合起來,將出現更多的智能化、高靈敏度的超聲波傳感器。

超聲波距離傳感器技術應用

超聲波對液體、固體的穿透本領很大,尤其是在陽光不透明的固體中,它可穿透幾十米的深度。

超聲波碰到雜質或分界面會產生顯著反射形成反射成回波,碰到活動物體能產生多普勒效應。因此超聲波檢測廣泛應用在工業、國防、生物醫學等方面。超聲波距離傳感器可以廣泛應用在物位(液位)監測,機器人防撞,各種超聲波接近開關,以及防盜報警等相關領域,工作可靠,安裝方便, 防水型,發射夾角較小,靈敏度高,方便與工業顯示儀表連接,也提供發射夾角較大的探頭。

5.2.3 超聲波傳感器的工作原理

超聲波是一種在彈性介質中的機械振蕩,有兩種形式:橫向振蕩(橫波)及縱向振蕩(縱波)。在工業中應用主要采用縱向振蕩。超聲波可以在氣體、液體及固體中傳播,其傳播速度不同。另外,它也有折射和反射現象,并且在傳播過程中有衰減。在空氣中傳播超聲波,其頻率較低,一般為幾十KHZ,而在固體、液體中則頻率可用得較高。在空氣中衰減較快,而在液體及固體中傳播,衰減較小,傳播較遠。利用超聲波的特性,可做成各種超聲傳感器,配上不同的電路,制成各種超聲測量儀器及裝置,并在通迅,醫療家電等各方面得到廣泛應用。

超聲波傳感器主要材料有壓電晶體(電致伸縮)及鎳鐵鋁合金(磁致伸縮)兩類。電致伸縮的材料有鋯鈦酸鉛(PZT)等。壓電晶體組成的超聲波傳感器是一種可逆傳感器,它可以將電能轉變成機械振蕩而產生超聲波,同時它接收到超聲波時,也能轉變成電能,所以它可以分成發送器或接收器。有的超聲波傳感器既作發送,也能作接收。這里僅介紹小型超聲波傳感器,發送與接收略有差別,它適用于在空氣中傳播,工作頻率一般為23-25KHZ及40-45KHZ。這類傳感器適用于測距、遙控、防盜等用途。該種有T/R-40-60,T/R-40-12等(其中T表示發送,R表示接收,40表示頻率為40KHZ,16及12表示其外徑尺寸,以毫米計)。另有一種密封式超聲波傳感器(MA40EI型)。它的特點是具有防水作用(但不能放入水中),可以作料位及接近開關用,它的性能較好。超聲波應用有三種基本類型,透射型用于遙控器,防盜報警器、自動門、接近開關等;分離式反射型用于測距、液位或料位;反射型用于材料探傷、測厚等。

由發送傳感器(或稱波發送器)、接收傳感器(或稱波接收器)、控制部分與電源部分組成。發送器傳感器由發送器與使用直徑為15mm左右的陶瓷振子換能器組成,換能器作用是將陶瓷振子的電振動能量轉換成超能量并向空中輻射;而接收傳感器由陶瓷振子換能器與放大電路組成,換能器接收波產生機械振動,將其變換成電能量,作為傳感器接收器的輸出,從而對發送的超進行檢測.而實際使用中,用發送傳感器的陶瓷振子的也可以用做接收器傳感器社的陶瓷振子。控制部分主要對發送器發出的脈沖鏈頻率、占空比及稀疏調制和計數及探測距離等進行控制

5.3 超聲波發射電路

HC-SR04模塊內部超聲波發射電路如圖5-6所示,主要由Em78p153單片機、MAX232及超聲波發射換能器T40組成。

圖5-9 超聲波發射電路

5.4 超聲波接收電路
HC-SR04模塊內部超聲波接收電路如圖5-3所示,主要由TL074運算放大器及超聲波接換能器R40組成。
圖5-10 超聲波接收電路


5.5 超聲波接收過程

    單片機初始化,HC-SR04內部ECHO接口與單片機P1.1的引腳相連,發射接口TRIG與單片機的P1.2引腳相接。

單片機開啟中斷,單片機P1.1給“Trig”接口一個約為20us的高電平,經過HC-SR04模塊內EM78P153發送8個連續的40KHz脈沖的信號,經過MAX232電平轉換,提高發射功率。換能器將電脈沖信號轉換為超聲波發射。

    當單片機的給一個20us的觸發信號時,TRIG由低電平轉換為高電平,TRIG=1,

單片機開時計時,開啟中斷,并記錄時間為T1,接收換能器等待接收回波,ECHO持續為高電平的時間為發射時間。換能器接收回波將超聲波轉換為電信號,送至單片機,記錄時間為T2。超聲波發射的時間為:T2-T1,

計算發射距離為:

L = (T2-T1)xC/2

如果等待回波時間超過65ms時,則無法接收到回波,單片機初始化,重新發射接收下一次回波。

5.6 接收數據處理

單片機初始化函數
5-11程序流程圖

接收過程:上電后先進行初始化,主要是對各變量即定時器0進行初始化,然后單片機給‘Trig’端一個約為20us的高電平,此后在‘Echo’端等待一個高電平,一旦檢測到高電平,則立即打開定時器,開始計時。此后只要定時器0中的值不超過約為65ms(65.5536ms)的計時上限,則認為仍處在有效測量范圍內,并未進入盲區,則在‘Echo’等待低電平的產生,一旦檢測到低電平,立即讀出此時的TH0和TL0,并關閉定時器0。則超聲波從發射到返回總共所用時間為:time=TH0*256+TL0(us),再根據超聲波常溫下(27℃)在空氣中的傳播速度,(約為344m/s)計算出障礙物的距離,在數碼管上進行動態的實時顯示即可。

接收數據處理子程序如下:

              c_send = 1;                                       //10us的高電平觸發
              delay();
              c_send = 0;            
              TH0 = 0;                                      //給定時器0清零
              TL0 = 0;
              TR0 = 0;                                                          //關定時器0定時
              flag_hc_value = 0;
              while(!c_recive);                              //當c_recive為零時等待
              TR0=1;
              while(c_recive)                                  //當c_recive為1計數并等待
              {
                            flag_time0 = TH0 * 256 + TL0;
                            if((flag_hc_value > 1) || (flag_time0 > 65000))     //當超聲波超過測量范圍時,顯示3個888
                            {
                                          TR0 = 0;
                                          flag_csb_juli = 2;
                                          distance = 888;
                                          flag_hc_value = 0;
                                          break ;                           
                            }
                            else
                            {
                                          flag_csb_juli = 1;            
                            }
              }
              if(flag_csb_juli == 1)
              {            
                            TR0=0;                                                                                                 //關定時器0定時
                            distance = TH0;                                                             //讀出定時器0的時間
                            distance = distance * 256 + TL0;
                            distance +=( flag_hc_value * 65536);//算出超聲波測距的時間              得到單位是ms
                            distance *= 0.017;               // 0.017 = 340M / 2 = 170M = 0.017M 算出來是米
                            if(distance > 350)                                                        //距離 = 速度 * 時間
                            {            
                                          distance = 888;                                                        //如果大于3.8m就超出超聲波的量程
                            }
              }  
第六章總結

本次設計介紹了一種基于單片機的超聲波測距系統的設計,給出了相應的軟件和硬件的設計方案。

超聲波測距的原理與雷達測距原理相似,通過超聲波發射裝置發出超聲波,根據接收器接到超聲波時的時間差就可以知道距離,也就是說超聲波發射器向某一方向發射超聲波,在發射時刻的同時單片機開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波單片機就立即停止計時,再利用對應的計算公式就可以求出物體間的間距,這是根據反射原理利用了超聲波指向性強,在介質中傳播距離較遠的特性。

超聲波測距儀硬件電路的設計主要包括單片機的基本電路、超聲波發射接收模塊控制電路、顯示電路、語音模塊,溫度補償五部分部分組成。單片機采用了STC89C52,晶振為12MHz,單片機P1.3端口輸出10us的觸發信號,由定時器T0計得時間間隔,顯示電路采用1602,語音芯片WTD588D。

本次設計的超聲波測距系統滿足倒車測距等所需的測量精度,而且反映速度快、控制簡單、成本低廉等,測距范圍為2cm到350cm。但由于經驗不足還有些地方有待完善。在要求精度較高的地方時,由于超聲波在空氣中的傳播速度受溫度影響有點大,則需考慮到不同溫度時超聲波的傳播速度變換。

總體來說,經過本次設計讓我學到了很多,從中受益匪淺。了解了超聲波測距的原理,并對單片機的開發和電路設計有了更進一步的了解。






附錄1原理圖



單片機源程序如下:
  1. #include <reg52.h>                       //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義              變量范圍0~255
  3. #define uint  unsigned int              //無符號整型 宏定義              變量范圍0~65535
  4. #include <intrins.h>

  5. //數碼管段選定義      0     1    2    3    4    5              6              7                8                 9            
  6. uchar code smg_du[]={0x25,0xee,0x37,0xa2,0xe2,0xa1,0x21,0xea,0x20,0xa0,
  7.                                                                         0x60,0x25,0x39,0x26,0x31,0x71,0xff};              //斷碼
  8. //數碼管位選定義
  9. uchar code smg_we[]={0xe0,0xb0,0xd0,0x70};
  10. uchar dis_smg[4]   ={0};

  11. sbit smg_we1 = P3^4;                  //數碼管位選定義
  12. sbit smg_we2 = P3^5;
  13. sbit smg_we3 = P3^6;
  14. sbit smg_we4 = P3^7;

  15. sbit c_send   = P3^2;                            //超聲波發射
  16. sbit c_recive = P3^3;                            //超聲波接收

  17. sbit beep = P3^1;   //蜂鳴器IO口定義

  18. uchar smg_i = 3;    //顯示數碼管的個位數
  19. bit flag_300ms ;

  20. long distance;                      //距離
  21. uint set_d;                          //距離
  22. uchar flag_csb_juli;    //超聲波超出量程
  23. uint  flag_time0;       //用來保存定時器0的時候的
  24. uchar menu_1;           //菜單設計的變量



  25. /***********************語音模塊控制IO口的定義************************/
  26. sbit  VRST = P2^3;
  27. sbit  VBUSY= P2^7;            
  28. sbit  VSDA = P2^6;
  29. sbit  VCS  = P2^5;
  30. sbit  VSCL = P2^4;
  31. uchar yujing[3];

  32. /***************************
  33.                  語音地址的安排
  34. 0 - 9 :  對應數字0到9
  35. 0b    : 點
  36. 0c    : 米
  37. 0d    : 已超出量程
  38.                                                                                                                               
  39. **************************/

  40. /***********************1ms延時函數*****************************/
  41. void delay_1ms(uint q)
  42. {
  43.               uint i,j;
  44.               for(i=0;i<q;i++)
  45.                             for(j=0;j<120;j++);
  46. }


  47. /********************獨立按鍵程序*****************/
  48. uchar key_can;              //按鍵值

  49. void key()              //獨立按鍵程序
  50. {
  51.               static uchar key_new;
  52.               key_can = 20;                   //按鍵值還原
  53.               P2 |= 0x07;
  54.               if((P2 & 0x07) != 0x06)                            //按鍵按下
  55.               {
  56.                             delay_1ms(1);                                 //按鍵消抖動
  57.                             if(((P2 & 0x07) != 0x07) && (key_new == 1))
  58.                             {                                                                                    //確認是按鍵按下
  59.                                           key_new = 0;
  60.                                           switch(P2 & 0x07)
  61.                                           {
  62.                                                         case 0x05: key_can = 1; break;                 //得到k2鍵值
  63.                                                         case 0x04: key_can = 2; break;                 //得到k3鍵值
  64.                                                         case 0x02: key_can = 3; break;                 //得到k4鍵值
  65.                                           }
  66.                             }                                         
  67.               }
  68.               else
  69.                             key_new = 1;            
  70. }

  71. /****************按鍵處理顯示函數***************/
  72. void key_with()
  73. {
  74.               if(key_can == 1)                            //設置鍵
  75.               {
  76.                             menu_1 ++;
  77.                             if(menu_1 >= 2)
  78.                             {
  79.                                           menu_1 = 0;
  80.                                           smg_i = 3;                            //只顯示3位數碼管
  81.                             }
  82.                             if(menu_1 == 1)
  83.                             {
  84.                                           smg_i = 4;                  //只顯示4位數碼管
  85.                             }
  86.               }
  87.               if(menu_1 == 1)                                          //設置報警
  88.               {
  89.                             if(key_can == 2)
  90.                             {
  91.                                           set_d ++ ;                            //加1
  92.                                           if(set_d > 400)
  93.                                                         set_d = 400;
  94.                             }
  95.                             if(key_can == 3)
  96.                             {
  97.                                           set_d -- ;                            //減1
  98.                                           if(set_d <= 1)
  99.                                                         set_d = 1;
  100.                             }
  101.                             dis_smg[0] = smg_du[set_d % 10];                         //取小數顯示
  102.                             dis_smg[1] = smg_du[set_d / 10 % 10] ;         //取個位顯示
  103.                             dis_smg[2] = smg_du[set_d / 100 % 10] & 0xdf ; //取十位顯示
  104.                             dis_smg[3] = smg_du[10];                      //a
  105.               }            
  106. }

  107. /***********************語音子程序************************/
  108. void Send_threelines(unsigned char addr)
  109. {
  110.    unsigned char i;
  111.               VRST=0;
  112.               delay_1ms(5);
  113.               VRST=1;
  114.               delay_1ms(10); /* 復位拉高10ms*/
  115.               VCS=0;
  116.               delay_1ms(5);  /* 片選拉低5ms */
  117.     for(i=0;i<8;i++)
  118.               {
  119.                             VSCL=1;
  120.                             if(addr&0x01 == 0x01)
  121.                             {
  122.                                           VSDA=1;
  123.                             }
  124.                             else
  125.                                           VSDA=0;
  126.                             addr<<=1;
  127.                             VSCL=0;
  128.               }
  129.               VCS=1;
  130.               while(VBUSY == 0);                //忙等待
  131. }


  132. /***********************數碼位選函數*****************************/
  133. void smg_we_switch(uchar i)
  134. {
  135.               switch(i)
  136.               {
  137.                             case 0: smg_we1 = 0;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 1; break;
  138.                             case 1: smg_we1 = 1;  smg_we2 = 0; smg_we3 = 1;  smg_we4 = 1; break;
  139.                             case 2: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 0;  smg_we4 = 1; break;
  140.                             case 3: smg_we1 = 1;  smg_we2 = 1; smg_we3 = 1;  smg_we4 = 0; break;
  141.               }            
  142. }


  143. /****************報警函數***************/
  144. void clock_h_l()
  145. {
  146.               static uchar value;
  147.               if(distance <= set_d)
  148.               {
  149.                             value ++;  //消除實際距離在設定距離左右變化時的干擾
  150.                             if(value >= 2)
  151.                             {
  152.                                           beep = ~beep;                 //蜂鳴器報警            
  153.                             }
  154.               }
  155.               else
  156.               {
  157.                             value = 0;
  158.                             beep = 1;                            //取消報警
  159.               }            
  160. }

  161. /***********************數碼顯示函數*****************************/
  162. void display()
  163. {
  164.               static uchar i;  
  165.               i++;
  166.               if(i >= smg_i)
  167.                             i = 0;            
  168.               smg_we_switch(i);                            //位選
  169.               P1 = dis_smg[i];                            //段選                     
  170. }

  171. /******************小延時函數*****************/
  172. void delay()
  173. {
  174.               _nop_();                                        //執行一條_nop_()指令就是1us
  175.               _nop_();
  176.               _nop_();
  177.               _nop_();
  178.               _nop_();
  179.               _nop_();
  180.               _nop_();
  181.               _nop_();
  182.               _nop_();
  183.               _nop_();
  184. }


  185. /*********************超聲波測距程序*****************************/
  186. void send_wave()
  187. {
  188.               c_send = 1;                                       //10us的高電平觸發
  189.               delay();
  190.               c_send = 0;            
  191.               TH0 = 0;                                      //給定時器0清零
  192.               TL0 = 0;
  193.               TR0 = 0;                                                          //關定時器0定時
  194.               while(!c_recive);                              //當c_recive為零時等待
  195.               TR0=1;
  196.               while(c_recive)                                  //當c_recive為1計數并等待
  197.               {
  198.                             flag_time0 = TH0 * 256 + TL0;
  199.                             if((flag_time0 > 40000))      //當超聲波超過測量范圍時,顯示3個888
  200.                             {
  201.                                           TR0 = 0;
  202.                                           flag_csb_juli = 2;
  203.                                           distance = 888;
  204.                                           break ;                           
  205.                             }
  206.                             else
  207.                             {
  208.                                           flag_csb_juli = 1;            
  209.                             }
  210.               }
  211.               if(flag_csb_juli == 1)
  212.               {            
  213.                             TR0=0;                                                                                                  //關定時器0定時
  214.                             distance =flag_time0;                                          //讀出定時器0的時間
  215.                             distance *= 0.017;               // 0.017 = 340M / 2 = 170M = 0.017M 算出來是米
  216.                             if((distance > 500))                                                        //距離 = 速度 * 時間
  217.                             {            
  218.                                           distance = 888;                                                        //如果大于3.8m就超出超聲波的量程
  219.                             }
  220.               }
  221. }

  222. /***********************處理距離函數****************************/
  223. void smg_display()
  224. {
  225.               dis_smg[0] = smg_du[distance % 10];                            //距離取出來放在緩沖區了
  226.               dis_smg[1] = smg_du[distance / 10 % 10];
  227.               dis_smg[2] = smg_du[distance / 100 % 10] & 0xdf;
  228.               yujing[0] = distance % 10;                                            //距離放到語音的變量里
  229.               yujing[1] = distance / 10 % 10;            
  230.               yujing[2] = distance / 100 % 10;            
  231. }


  232. /*********************定時器0、定時器1初始化******************/
  233. void time_init()               
  234. {
  235.               EA  = 1;                              //開總中斷
  236.               TMOD = 0X11;                //定時器0、定時器1工作方式1
  237.               ET0 = 0;                              //關定時器0中斷
  238.               TR0 = 1;                              //允許定時器0定時
  239.               ET1 = 1;                              //開定時器1中斷
  240.               TR1 = 1;                              //允許定時器1定時            
  241. }



  242. /***************主函數*****************/
  243. void main()
  244. {
  245.               static uchar value = 5;
  246.               send_wave();              //測距離函數
  247.               smg_display();              //處理距離顯示函數
  248.               time_init();              //定時器初始化程序
  249.               while(1)
  250.               {                             
  251.                             key();                                                                      //按鍵函數
  252.                             if(key_can < 10)
  253.                             {
  254.                                           key_with();                                          //按鍵處理函數
  255.                             }
  256.                             if(flag_300ms == 1)
  257.                             {                           
  258.                                           flag_300ms = 0;
  259.                                           send_wave();              //測距離函數
  260.                                           if(menu_1 == 0)
  261.                                           {            
  262.                                                         smg_display();              //處理距離顯示函數
  263.                                                         value ++;
  264.                                                         if(value > 10)                            //3秒鐘自動播放一次
  265.                                                         {
  266.                                                                       value = 0;
  267.                                                                       if(distance == 888)
  268.                                                                       {
  269.                                                                                     Send_threelines(0x0d);                //可安全倒車
  270.                                                                       }
  271.                                                                       else
  272.                                                                       {
  273.                                                                                     Send_threelines(yujing[2]);                 //語音播放
  274.                                                                                     Send_threelines(0x0b);
  275.                                                                                     Send_threelines(yujing[1]);
  276.                                                                                     Send_threelines(yujing[0]);
  277.                                                                                     Send_threelines(0x0c);
  278.                                                                       }
  279.                                                         }
  280.                                           }            
  281.                             }
  282.               }
  283. }

  284. /*********************定時器1中斷服務程序************************/
  285. void time1_int() interrupt 3
  286. {            
  287.               static uchar value;                                          //定時2ms中斷一次
  288.               TH1 = 0xf8;
  289.               TL1 = 0x30;     //2ms
  290.               display();                            //數碼管顯示函數
  291.               value++;

  292.               if(value >= 150)
  293.               {
  294.                             value = 0;
  295.                             flag_300ms = 1;
  296.                             clock_h_l();    //報警函數
  297.               }
  298. }
復制代碼
完整的Word格式文檔51黑下載地址:
超聲波測距語音播報論文.doc (3.05 MB, 下載次數: 105)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:560630 發表于 2019-6-18 16:40 | 只看該作者
為啥我在平板上下載了不顯示了
回復

使用道具 舉報

板凳
ID:1112880 發表于 2024-3-13 16:07 | 只看該作者
meimeizhuanyong 發表于 2019-6-18 16:40
為啥我在平板上下載了不顯示了

可以試試電腦
回復

使用道具 舉報

地板
ID:433219 發表于 2024-3-14 08:49 | 只看該作者
超聲波模塊,都是標準件了。上面的芯片是 78p163 單片機???
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲成人一区 | 国产精品一区2区 | 在线国产一区二区三区 | 亚洲天堂一区 | 欧美九九九 | 成人午夜视频在线观看 | 亚洲人va欧美va人人爽 | 日本精品一区二区三区视频 | 亚欧精品 | 欧美中文字幕在线 | 亚洲一区二区在线免费观看 | 成人av电影网 | 日韩三级| 一区二区三区免费 | 久久69精品久久久久久久电影好 | 国产福利在线免费观看 | 亚洲一区二区在线视频 | www国产成人免费观看视频,深夜成人网 | 成人福利在线 | 欧美精品二区 | 91精品国产乱码久久蜜臀 | 日韩www | 在线观看中文字幕亚洲 | 一级在线视频 | 亚洲风情在线观看 | 精品在线一区 | 伊人伊人 | 欧美videosex性极品hd | 国产日产精品一区二区三区四区 | 亚洲精选久久 | 欧美成人一区二区三区 | 特级丰满少妇一级aaaa爱毛片 | 日韩精品 电影一区 亚洲 | 一区二区三区精品在线 | 国产高清一区二区三区 | 免费黄色特级片 | 国产精品久久久久久一级毛片 | 狠狠的操 | 国产黄色精品在线观看 | 国产福利91精品 | 国产精品久久久久久久久久尿 |