標(biāo)題: 基于單片機(jī)的汽車后側(cè)防撞報警裝置 倒車?yán)走_(dá)設(shè)計論文下載 [打印本頁]

作者: POIU    時間: 2017-5-10 12:48
標(biāo)題: 基于單片機(jī)的汽車后側(cè)防撞報警裝置 倒車?yán)走_(dá)設(shè)計論文下載


隨著我國經(jīng)濟(jì)的飛速發(fā)展,汽車的需求量急劇增加,現(xiàn)在家家戶戶擁有汽車已經(jīng)成為現(xiàn)實。但是隨著汽車數(shù)量的增加,其引發(fā)的事故也不斷在增加。倒車引發(fā)的汽車事故也占不小的比重,而倒車時車尾存在的盲區(qū)是其主導(dǎo)因素,因此解決倒車盲區(qū)是安全駕駛必須要解決的問題。

本設(shè)計采用以 STC89C52 單片機(jī)為核心的低成本、高精度、微型化數(shù)字顯示超聲波測距儀的硬件電路和軟件設(shè)計方法。整個電路采用模塊化設(shè)計,由主程序、數(shù)據(jù)處理子程序、顯示子程序等模塊組成。各探頭的信號經(jīng)單片機(jī)綜合分析處理,實現(xiàn)超聲波測距儀的各種功能。在此基礎(chǔ)上設(shè)計了系統(tǒng)的總體方案,最后通過硬件和軟件實現(xiàn)了各個功能模塊。相關(guān)部分附有硬件電路圖、程序流程圖。

該設(shè)計通過模塊的組合和軟件的控制,實現(xiàn)了設(shè)計要求的功能。本設(shè)計在使用上面方便,成本較低。不但完成了這些功能,還達(dá)到了汽車倒車的安全指標(biāo)。



  

隨著我國經(jīng)濟(jì)的建設(shè)、社會的進(jìn)步、人們生活水平的提高,汽車已經(jīng)與老百姓的生活密不可分,而其作為重要的交通工具,在人們生活中的作用也越來越重要。但是伴隨著汽車數(shù)量的增加,同時也由于駕駛者本身技術(shù)的不熟練,或是道路及停車條件的影響,導(dǎo)致了交通事故頻發(fā)。在汽車事故中,由倒車引發(fā)的比重所占較大。因為在倒車時汽車后視鏡有死角,駕駛員目測距離的誤差、視線模糊等原因使汽車倒車存在極大的安全隱患,因此解決倒車盲區(qū)是關(guān)乎安全駕駛的首要問題。因此汽車產(chǎn)品家族中“倒車防撞系統(tǒng)”應(yīng)需而生。通過調(diào)查,我們發(fā)現(xiàn)很多汽車駕駛員都希望自己的車具有發(fā)現(xiàn)汽車尾部障礙物的設(shè)備,并能為自己提供駕車提示,以此來減少事故的發(fā)生,保證行駛安全。倒車檢測及報警系統(tǒng)的產(chǎn)生不僅滿足了廣大駕駛員的需求,從一定程度上幫助人們解決了這一問題


1   緒論
背景與意義 1.1.1 研究背景

隨著社會的進(jìn)步,工業(yè)經(jīng)濟(jì)的發(fā)展,汽車作為一項重要的代步工具,已然成為了人們生活中不可或缺的必需品之一。然而,汽車除了在生活中能為人們帶來便利之外,也同時帶來了巨大的問題[1]。一方面,隨著人們經(jīng)濟(jì)實力的增強(qiáng),汽車數(shù)量激增,不僅使道路交通承受巨大壓力,也使得停車場等公共交通場所變得擁擠不堪,給人們開車、停車增加了難度;另一方面,隨著汽車的普及,學(xué)習(xí)駕駛技術(shù)的人員也大幅增加,這就使得道路上增加了許多新手司機(jī),因車輛碰撞而產(chǎn)生的糾紛變得越來越多。而在這其中,倒車問題就是一個典型的問題。

倒車在汽車駕駛過程中有著重要的作用,我們知道,在停車的時候需要用到倒車,在移位時也需要用到倒車,讓行時或者掉頭而寬度不足時,都需要用到倒車,如果倒車技術(shù)不過關(guān),會給人們的開車生活帶來困擾。一方面,倒車需要回轉(zhuǎn)面積,如果技術(shù)不過關(guān),需要的回轉(zhuǎn)面積就會增大,這樣一是會增加停車時所需面積,減少實際停車數(shù)量,同時會增加停車時間,造成停車場擁堵;另一方面,新司機(jī)通常不善于掌握停車時的方面角度,也不善于判斷障礙物離車身距離,因此會在停車倒庫時帶來麻煩,不僅浪費(fèi)時間,也容易發(fā)生車輛碰撞事件[2]。為了解決倒車難的問題,人們經(jīng)過不懈的努力,研制出一些倒車輔助裝置在人們倒車的時候提供幫助,例如:雷達(dá)警報系統(tǒng)、后視輔助倒車系統(tǒng)等。這些輔助裝置雖然能夠在一定程度上幫助駕駛?cè)藛T完成倒車過程,但是也存在一些缺點,因此,能夠研制出一個好的倒車防撞系統(tǒng)就顯得十分重要了。

1.1.2 研究意義1.2 倒車防撞系統(tǒng)的發(fā)展

倒車測距儀也就是倒車?yán)走_(dá),在國際和國內(nèi)上都有很多,超聲波倒車測距系統(tǒng)是其中的一種比較簡單實惠的倒車測距儀。 在短短的幾年時間里,就從第一代發(fā)展到了第五代,并在不斷的繼續(xù)發(fā)展之中。但無論是如何發(fā)展,其結(jié)構(gòu)通常包括幾部分,分別是控制器、超聲波傳感器(俗稱探頭)和顯示器(或蜂鳴器)等[3]。

第一代倒車?yán)走_(dá):倒車時通過喇叭提醒。在 90 年代的時候,人們經(jīng)常能夠聽到“倒車請注意”這種聲音,這就是第一代倒車輔助系統(tǒng)。在司機(jī)開始倒車的時候,蜂鳴器發(fā)出這種提醒語句,引起路人的注意。這代產(chǎn)品現(xiàn)在的使用范圍很小,只有少部分的汽車還在使用。這代產(chǎn)品并不能夠算作是真正的倒車輔助系統(tǒng),它只是引起了周圍人的注意,并沒有真正幫助到駕駛員操作汽車。這種產(chǎn)品價格低廉、技術(shù)落后,基本屬于淘汰了的產(chǎn)品。

第二代倒車?yán)走_(dá):蜂鳴器聲音提示。從倒車輔助系統(tǒng)的意義上來講,這才是真正的倒車輔助系統(tǒng)的開始。在倒車時,汽車在遇到障礙物時,蜂鳴器會發(fā)出聲音,這種聲音并不是一成不變的,越是急促的蜂鳴器聲音代表障礙物與汽車之間的距離越短。這代倒車輔助系統(tǒng)雖然能夠讓駕駛員知道有障礙物的存在,但由于沒有語音或者是數(shù)字的顯示,駕駛員并不能知道障礙物與汽車之間的準(zhǔn)確距離,在倒車時對駕駛員幫助的實際意義不大。

第三代倒車?yán)走_(dá):距離顯示在數(shù)碼波段上。這代產(chǎn)品比起第二代產(chǎn)品的主要優(yōu)點就是將具體的距離表示了出來。如果是物體,在 1.8 米開始顯示;如果是人,在 0.9 米左右的距離開始顯示。這一代產(chǎn)品主要有兩種顯示方式,一種是數(shù)碼顯示,這種顯示值顯示距離,另一種是波段顯示,通過三種不同顏色表示不同距離,綠色代表安全距離,黃色代表警告距離,而紅色則代表危險距離,此時應(yīng)該停止倒車[4]。

第四代倒車?yán)走_(dá):液晶熒屏動態(tài)顯示。這一代產(chǎn)品在屏幕顯示時出現(xiàn)了動態(tài)顯示系統(tǒng),與之前的產(chǎn)品相比較有了一個質(zhì)的飛躍。只要汽車掛在倒檔上時,液晶屏幕上就會顯示出汽車的圖案,還會將周圍的障礙物情況也形象的顯示出來。這代產(chǎn)品顯示的圖案清晰漂亮,產(chǎn)品外觀也很美觀,安裝時也很方便。這代產(chǎn)品的優(yōu)點就是安裝方便、精度較高,但是這代產(chǎn)品的抗干擾能力不強(qiáng),有時會發(fā)生誤報的情況。

第五代倒車?yán)走_(dá):智能軌跡倒車系統(tǒng)。這代產(chǎn)品能夠彌補(bǔ)第四代產(chǎn)品的諸如抗干擾能力不強(qiáng)等缺陷和不足,在外觀上也做到了更加的小巧精致,不僅幫助駕駛員更加方便的操作汽車,也對汽車起到了裝飾的作用。


1.3  研究目的及可行性分析
1.3.1研究目的

本次設(shè)計的研究內(nèi)容是根據(jù)超聲波測距原理,設(shè)計出合適的電路,并由單片機(jī)協(xié)調(diào)控制整個系統(tǒng)的模塊,來完成超聲波脈沖測距的倒車?yán)走_(dá)。在汽車以較低的速度進(jìn)行倒車時,它可以識別出汽車后面的障礙物,測量出車尾與障礙物之間的距離進(jìn)行實時顯示,發(fā)出聲音報警來提醒駕駛員倒車。本設(shè)計有望成為汽車駕駛員,尤其是公共汽車以及貨車駕駛員的好幫手,可以有效的減少甚至避免那些視野不良的公共汽車、集裝箱車、食品車、冷藏車等大型汽車的倒車交通事故,尤其適用于夜間輔助倒車、倒車入庫和進(jìn)入停車場停車到位。本設(shè)計對提高汽車行駛安全性具有較大的意義。

1.3.2可行性分析

倒車?yán)走_(dá)一般都是近距離測量,而激光測距和紅外測距主要用于遠(yuǎn)程,比如測月球到地球距離,或者遠(yuǎn)距離無障礙測距,且成本要比用超聲波大,因為光速為

3×108m/s,而市場上的一般單片機(jī)的最高頻率在十幾至幾十兆,假如測量的距離在十米左右,即使單片機(jī)別的都不做只用來計數(shù),出射光大約在 0.033µs后返回,要求單片機(jī) CLK 為 1/0.033MHz,也就是說時鐘頻率為 30M 的單片機(jī)剛剛發(fā)出出射激光的命令,反射光就已經(jīng)在它的下個 CLK 脈沖來到了,更別提計數(shù)了,即使用頻率很高的單片機(jī)或者其他器件如 FPGA 等都并不能滿足實際所需要的精度。通常精度與收發(fā)間隔中得到的計數(shù)脈沖個數(shù)成正比,超聲波的速度要比光速小的多,傳播時間就比較容易檢測,能夠滿足倒車?yán)走_(dá)在精度上的要求,并且超聲波強(qiáng)度容易控制,方向性好,容易實現(xiàn)定向發(fā)射雖然超聲波在空氣中傳播時,能量會緩慢衰減,有個最遠(yuǎn)測距范圍,但仍能滿足倒車?yán)走_(dá)等近距離測量?傊,基于超聲波測距汽車倒車?yán)走_(dá)用起來會更加方便,更加令人放心。


1.4  研究內(nèi)容與文章結(jié)構(gòu)

1.4.1研究的主要內(nèi)容

設(shè)計一個擁有微控制系統(tǒng)的倒車測距儀,該測距儀在汽車尾部一定距離范圍內(nèi)能夠?qū)ζ囄膊烤嚯x尾部障礙物的距離做出顯示和提醒。本設(shè)計是使用數(shù)碼管顯示距離,蜂鳴器和二極管進(jìn)行報警。因此研究的基本內(nèi)容如下:

1.4.2需要解決的問題

為了達(dá)到課題的要求,在設(shè)計中需要解決的問題如下所列:

1.4.3文章結(jié)構(gòu)

該論文的組織構(gòu)造主要由以下部分組成:

第一章緒論。在這一章中講述了該課題研究的背景、發(fā)展、意義、目的和可行性分析以及研究內(nèi)容。第二章為系統(tǒng)方案設(shè)計。這一章中對整個倒車系統(tǒng)進(jìn)行設(shè)計,其中包括單片機(jī)、超聲波測距模塊、聲音報告模塊、蜂鳴器報警模塊等。

第三章為整個系統(tǒng)的硬件設(shè)計。這一章中介紹了本設(shè)計的整體電路,所選用的最小系統(tǒng)、顯示模塊、超聲波收發(fā)模塊等各個模塊的電路以及各個模塊在使用中需要注意的事項和選擇要求。

第四章為整個系統(tǒng)的軟件設(shè)計。這一章包括了軟件系統(tǒng)的整體設(shè)計和介紹,同時也包括了各個模塊的軟件設(shè)計。

第五章為整個系統(tǒng)的調(diào)試部分。在這一章中介紹了各個模塊的調(diào)試,在調(diào)試的時候應(yīng)該注意的問題,比如調(diào)試的順序,如何對調(diào)試結(jié)果進(jìn)行分析總結(jié)最后再做出修改。

1.5  本章小結(jié)

本章是在查閱了相關(guān)文獻(xiàn)資料后,對該課題研究的背景和意義、倒車?yán)走_(dá)的發(fā)展、此次設(shè)計的目的和可行性作了分析,并詳細(xì)敘述了研究的內(nèi)容。為本次設(shè)計作了充分的前期準(zhǔn)備工作,同時為設(shè)計的順利進(jìn)行打下了基礎(chǔ)。

2  系統(tǒng)方案設(shè)計

本設(shè)計是由控制系統(tǒng)(STC89C52 單片機(jī))作為數(shù)據(jù)的處理中心和整個系統(tǒng)的控制中心,再由顯示報警系統(tǒng)(數(shù)碼管以及揚(yáng)聲器和蜂鳴器報警模塊)、測距系統(tǒng)(超聲波收發(fā)模塊)等來組成整個系統(tǒng),最后達(dá)到設(shè)計的目的。單片機(jī)是整個系統(tǒng)的核心部件,協(xié)調(diào)各部分的工作。在這一章中將對整體系統(tǒng)的結(jié)構(gòu)進(jìn)行介紹,并且對各個部分進(jìn)行詳細(xì)的介紹。

2.1  系統(tǒng)整體方案

倒車檢測及報警系統(tǒng)是由超聲波發(fā)射端發(fā)射信號、超聲波接收端接收信號,再通過端口送到控制中心及單片機(jī)內(nèi)部進(jìn)行數(shù)據(jù)的處理判斷以及最后進(jìn)行顯示報警等。具體是由單片機(jī)控制超聲波收發(fā)模塊的 Trig 口產(chǎn)生時間大于 10us 的高頻 TTL 信號來驅(qū)動超聲波模塊內(nèi)部連續(xù)發(fā)出 8 個 40kHz 的周期脈沖,超聲波收發(fā)模塊的 Echo 腳檢測回波信號的脈沖寬度。Echo 腳與單片機(jī)的 P11 口相連。當(dāng)出現(xiàn)回波信號時,計數(shù)器便開始計數(shù),在檢測到回波脈沖結(jié)束的瞬間,計數(shù)器停止計數(shù),得到從發(fā)射端到接收端的時間 t 后,利用測距公式 s=(t*340/2)(單位:米)可計算出距離量,同時由顯示器顯示。整個系統(tǒng)的方案框圖如圖 2.1 所示。

圖 1 系統(tǒng)總體結(jié)構(gòu)框圖

從圖 1 結(jié)構(gòu)框圖可以看出來整個系統(tǒng)的模塊比較少,因此在使用起來比較方便、容易操作,比較有使用價值。



2.2 控制系統(tǒng)介紹

在這一節(jié)中將對單片機(jī)的發(fā)展歷史和功能進(jìn)行總體介紹,并對本設(shè)計使用的

STC89C52 單片的內(nèi)部結(jié)構(gòu)和功能進(jìn)行了詳細(xì)的介紹。

2.2.1 單片機(jī)概要

單片機(jī)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器、只讀存儲器、隨機(jī)存儲器、多種端口和中斷系統(tǒng)、定時/計數(shù)器等功能一起集成到一塊硅片上,從而構(gòu)成一個小而完善的微型計算機(jī)系統(tǒng),在工業(yè)控制領(lǐng)域應(yīng)用廣泛。

2.2.2 單片機(jī)發(fā)展歷史

從 1971 年單片機(jī)的問世,發(fā)展至今經(jīng)歷了 SCM、MCU、SOC 三大階段,在早期的單片機(jī)及 SCM 都是 4 位或者 8 位的。8051 是其中最成功的單片機(jī)之一。但隨著工業(yè)的擴(kuò)展,16 位單片機(jī)也開始出現(xiàn),但早期因為價格昂貴使用較少。到了 90 年代的時候電子產(chǎn)品飛速發(fā)展,單片機(jī)技術(shù)迅速發(fā)展,32位的出現(xiàn)很快代替了 16 位。當(dāng)代單片機(jī)系統(tǒng)已經(jīng)不再只在裸機(jī)環(huán)境下開發(fā)和使用,大量專用的嵌入式操作系統(tǒng)被廣泛應(yīng)用在全系列的單片機(jī)上。而在作為掌上電腦和手機(jī)核心處理的高端單片機(jī)甚至可以直接使用專用的 Windows 和 Linux 操作系統(tǒng)。

2.2.3 STC89C52

STC89C52[5]是美國 ATMEL 公司生產(chǎn)的低功耗、高性能 CMOS8 位單片機(jī),片內(nèi)含 8k bytes 的可系統(tǒng)編程的 Flash 只讀程序存儲器。器件采用 ATMEL公司的高密度、非易失性存儲技術(shù)生產(chǎn),兼容標(biāo)準(zhǔn) 8051 指令系統(tǒng)及引腳。它集 Flash 程序存儲器既可在線編程(ISP)也可用傳統(tǒng)方法進(jìn)行編程及通用 8位微處理器于單片芯片中, ATMEL 公司的功能強(qiáng)大,低價位 STC89C52 單片機(jī)可為您提供許多高性價比的應(yīng)用場合,可靈活應(yīng)用于各種控制領(lǐng)域。STC89C52 單片機(jī)引腳定義圖如下圖 2所示。

主要管腳有:

XTAL1(19 腳)和 XTAL2(18 腳)為振蕩器輸入輸出端口,外接 12MHz 晶振。

RST/Vpd(9 腳)為復(fù)位輸入端口,外接電阻電容組成的復(fù)位電路。

VCC(40 腳)和 VSS(20 腳)為供電端口,分別接+5V 電源的正負(fù)端。

P0~P3 為可編程通用 I/O 腳,其功能用途由軟件定義。

圖 2 STC89C52 單片機(jī)引腳圖主要性能參數(shù):

除此以外 STC89C52 還提供一個 5 向量兩級中斷結(jié)構(gòu),片內(nèi)振蕩器及時鐘電路。同時,STC89C52 可降至 0Hz 的靜態(tài)邏輯操作,并支持兩種軟件可選的節(jié)電工作模式?臻e方式停止 CPU 的工作,但允許 RAM、定時/計數(shù)器、串行通信口及中斷系統(tǒng)繼續(xù)工作。掉電方式保存 RAM 中的內(nèi)容,但振蕩器停止工作并禁止其它所有部件工作直到下一個硬件復(fù)位。

2.3  測距系統(tǒng)介紹

目前汽車倒車?yán)走_(dá)預(yù)警系統(tǒng)測距技術(shù)主要有激光、毫米波雷達(dá)、攝像系統(tǒng)、紅外線、超聲波等,不同的目標(biāo)探測方式其工作過程和原理有不同之處,但它們的主要目的都是通過前方返回的探測信息判斷前方車輛和本車間的相對距離,并根據(jù)兩車間的危險性程度做出相應(yīng)的預(yù)防措施。下面對五種不同的測距技術(shù)方案進(jìn)行介紹和比較。

2.3.1不同方案介紹

激光測距

激光測距裝置[6]是一種光子雷達(dá)系統(tǒng)。目前在汽車上應(yīng)用較廣的激光測距系統(tǒng)可分為非成象式激光雷達(dá)和成象式激光雷達(dá)。

非成象式激光雷達(dá)根據(jù)激光束傳播時間確定距離。它的工作原理是:從高功率窄脈沖激光器發(fā)出的激光脈沖經(jīng)發(fā)射物鏡聚焦成一定形狀的光束后,用掃描鏡左右掃描,向空間發(fā)射,照射在前方車輛或其他目標(biāo)上,其反射光經(jīng)掃描鏡、接收物鏡及回輸光纖,被導(dǎo)入到信號處理裝置內(nèi)光電二極管,利用計數(shù)器計數(shù)激光二極管啟動脈沖與光電二極管的接收脈沖間的時間差,即可求得目標(biāo)距離;成象式激光雷達(dá)又可分為掃描成象激光雷達(dá)和非掃描成象激光雷達(dá)。掃描成象激光雷達(dá)把激光雷達(dá)同二維光學(xué)掃描鏡結(jié)合起來,利用掃描器控制激光的射出方向,通過對整個視場進(jìn)行逐點掃描測量,即可獲得視場內(nèi)目標(biāo)的三維信息。

毫米波雷達(dá)測距:

毫米波[7]是指波長介于 1~10mm 之間的電磁波,雷達(dá)是利用目標(biāo)對電磁波的反射來發(fā)現(xiàn)目標(biāo)并測定其位置的。

攝像系統(tǒng)測距:

CCD 攝像機(jī)是一種用來模擬人眼的光電探測器。利用面陣 CCD 可獲得被測視野的二維圖像,但無法確定與被測物體之間的距離,只使用一個 CCD 攝像機(jī)的系統(tǒng)稱為單目攝像系統(tǒng);為獲得目標(biāo)三維信息,模擬人的雙目視覺原理,利用間隔固定的兩臺攝像機(jī)同時對同一景物成象,通過對這兩幅圖像進(jìn)行計算機(jī)分析處理,即可確定視野中每個物體的三維坐標(biāo),這一系統(tǒng)稱為雙目攝像系統(tǒng)[8]。

紅外線測距

紅外線測距[9]和激光、超聲波測距在原理上基本相同,均是根據(jù)發(fā)射波和反射波的時間間隔來判斷目標(biāo)距離的,車載儀器通過發(fā)射并接收前方物體反射回的紅外線,依據(jù)信號的強(qiáng)弱及波長的不同,同時分析時間差,可分析出前方物體的性質(zhì)及與汽車的距離。

超聲波測距

超聲波[10]簡單的說就是音頻超過了人類耳朵所能夠聽到的范圍。在彈性媒質(zhì)中,如果波源所激起的縱波的頻率在 20Hz 到 20kHz 之間,就能引起人的聽覺。在這一頻率范圍內(nèi)的振動稱為聲振動,聲振動所激起的縱波稱為聲波;頻率高于 20kHz 的機(jī)械波稱為超聲波;頻率低于 20Hz 的機(jī)械波稱為次聲波。與光波不同,超聲波是一種彈性機(jī)械波,它可以在氣體、液體和固體中傳播。電磁波的傳播速度為 3x108m/s,超聲波在空氣中的傳播速度約為340m/s(常溫下),其速度與電磁波相差 5 個等級,其速度相對電磁波是非常慢的。

2.3.2優(yōu)缺點對比

超聲波技術(shù)主要用于短距離探測,成本低,制作安裝簡便,適應(yīng)惡劣環(huán)境;紅外線技術(shù)一般用于夜間環(huán)境,對環(huán)境適應(yīng)性差:微波雷達(dá)測距和激光測距相對于超聲波測距來講精度更高,定位更準(zhǔn)確"攝像系統(tǒng)技術(shù)價格較貴;毫米波雷達(dá)技術(shù)和激光技術(shù)的成本很高,所以運(yùn)用其原理進(jìn)行測量的設(shè)備價格也是相當(dāng)高的,因而現(xiàn)在只是在比較高級的轎車中才有所應(yīng)用。綜合以上考慮和實際應(yīng)用條件,本系統(tǒng)的測距模塊采用的是第五種方案——超聲波測距,并在超聲波測距技術(shù)方案的設(shè)計上進(jìn)行了簡化和改進(jìn)。

2.4 超聲波測距2.4.1 超聲波測距原理

超聲波測距的方法有多種,如相位檢測法[11]、聲波幅值檢測法和渡越時間檢測法

等。相位檢測法通過測量接收波和發(fā)射波的相位差來判斷距離的,其測量精度高,但檢測范圍有限,只適合短距離測量;聲波幅值檢測法是根據(jù)反射波的幅值大小 來判斷距離的,優(yōu)點是電路簡單且成本低,缺點是測量精度不高,抗干擾能力差;渡越時間檢測法是通過接收從超聲波發(fā)射到接收到超聲波之間的時間差,來判斷距離的,此檢測法介于兩者之間,電路也比較簡單,且有較遠(yuǎn)的測量距離和較高的測量精度,所以得到了較為廣泛的應(yīng)用?紤]到倒車?yán)走_(dá)對測量距離和測量精度的要求,本論文采用渡越時間檢測法來檢測車尾要和障礙物之間的距離,其測距原理如圖 3 所示。

測距時由安裝在相同位置的超聲波發(fā)射器和超聲波接收器完成超聲波的發(fā)射和接收,由定時器計時。定時器記錄下超聲波往返傳播經(jīng)歷的時間t(s)。常溫下,超聲波在傳播速度約為 340m/s,所以發(fā)射點距障礙物之間的距離為:

L =3 4 0t/2

公式(1)

L 為車尾與障礙物的距離,單位為米;t 為計時器記錄的時間,單位為秒。


圖3 超聲波測距原理圖

單片機(jī)內(nèi)部定時器的計時,實際上是機(jī)器周期 T 的計數(shù),設(shè)時鐘頻率 Fosc 取

12MHz,而定時器 TIMB 的計數(shù)頻率為系統(tǒng)時鐘頻率的 1 個機(jī)器周期,設(shè)計數(shù)值為 N,則

,

或                           

                  

公式(2)

2.4.2超聲波模塊——HY-SRF05 超聲波模塊

HY-SRF05 超聲波測距模塊可提供 2cm 到 450cm 的非接觸式距離感測功能,測距精度可高達(dá) 2mm。模塊包括:超聲波發(fā)射器、接收器和控制電路。

基本工作原理:

實物圖

實物圖如圖 4 所示,VCC 接 5V 電源,GND 為地線,TRIG 觸發(fā)控制信號輸入,

ECHO 回響信號輸出。

圖 4 實物圖

超聲波時序圖

超聲波時序圖反映了整個超聲波測距模塊的測距是如何進(jìn)行的,當(dāng)然也顯示了測距的原理。超聲波時序圖如下圖 5 所示。

圖 5 超聲波時序圖

對圖 2.5 的解說:當(dāng) Trig 腳發(fā)出持續(xù)時間為 10us 以上的 TTL 觸發(fā)信號,模塊內(nèi)部便連續(xù)發(fā)出 8 個 40kHz 的周期電平并檢測回波,一旦檢測到回波信號就通過 Echo 輸出回響信號。回響信號的脈沖寬度與所測的距離成正比。由此通過發(fā)射信號到收到的回響信號時間間隔可以計算得到距離。


2.5 顯示報警系統(tǒng)

在這一節(jié)中,將介紹該倒車測距儀的提示方式與報警模式。用數(shù)碼管顯示距離障礙物的具體距離的同時加入語言報告來警示駕駛?cè)藛T,同時由蜂鳴器響叫頻率的不同以此來提醒駕駛?cè)藛T使其在心里有一定的判斷。

圖6 顯示模塊圖

語音播報芯片相關(guān)說明:

  

圖7芯片引腳圖

圖8   語音播報模塊原理圖

2.6  本章小結(jié)

在這一章中對整個系統(tǒng)的設(shè)計方案和所用器件類型分別進(jìn)行了介紹。其中超聲波測距模塊是關(guān)鍵模塊之一,它關(guān)系到測距方法的確定以及最終測距誤差等的產(chǎn)生原因提供了分析切入點。最終確定使用超聲波測距模塊進(jìn)行距離測量,使用數(shù)碼管作為顯示模塊,使用蜂鳴器進(jìn)行提示報警。

3  系統(tǒng)硬件設(shè)計

倒車測距儀由超聲波傳感器(俗稱探頭)、控制器、顯示器等組成,采用超聲波測距方法,在控制器的控制下由傳感器發(fā)射超聲波信號,當(dāng)遇到障礙時,產(chǎn)生回波信號,傳感器接收到回波信號后,經(jīng)控制器進(jìn)行數(shù)據(jù)處理,判斷出障礙物的位置,由顯

示器顯示距離并根據(jù)距離發(fā)出警報信號,從而達(dá)到安全倒車的目的。

3.1   系統(tǒng)總電路圖

根據(jù)系統(tǒng)的方案設(shè)計,設(shè)計出系統(tǒng)的電路框圖如 3.1 所示。以及各個模塊器件的接口性質(zhì),運(yùn)用 protel 軟件[14]畫出系統(tǒng)電路圖如圖 3.2 所示。

              

            

3.1.1 系統(tǒng)工作原理

當(dāng)電池安裝好且位于 PCB 板子上的電源開關(guān)已經(jīng)被按下,系統(tǒng)供電。整個系統(tǒng)的運(yùn)作為:超聲波在標(biāo)準(zhǔn)空氣中的傳播速度為 331.45 米/秒,約為340 米/秒。單片機(jī)通過 P10 口控制超聲波收發(fā)模塊的 Trig 腳發(fā)出超聲波,模塊內(nèi)部發(fā)射脈沖信號并檢測回波,當(dāng)接收端一檢測到回波信號計數(shù)器就開始計數(shù),回波信號結(jié)束則計數(shù)完成。數(shù)據(jù)被送入 STC89C52 中進(jìn)行處理計算,并將計算結(jié)果顯示到數(shù)碼管上,同時控制蜂鳴器的鳴叫。

3.1.2 最小系統(tǒng)電路

單片機(jī)最小系統(tǒng)包括了單片機(jī)、晶振電路、復(fù)位電路以及電源電路。下面將會介紹部分電路的設(shè)計。

晶振電路:

STC89C52 內(nèi)部有一個用于構(gòu)成振蕩器的高增益反相放大器,引腳 X1 和 X2 分別是此放大器的輸入端和輸出端。時鐘可以由內(nèi)部方式產(chǎn)生或外部方式產(chǎn)生。內(nèi)部方式的時鐘電路所示,在 X1 和 X2 引腳上外接定時元件,內(nèi)部振蕩器就產(chǎn)生自激振蕩。

定時元件通常采用石英晶體和電容組成的并聯(lián)諧振回路。電容值 30pF,電容值的大

小可對頻率起微調(diào)的作用,晶體振蕩頻率為 11.0592MHz。晶振電路如圖 10所示。


                               圖 10 晶振電路圖

復(fù)位電路

復(fù)位是單片機(jī)的初始化操作。其主要功能是把 PC 初始化為 0000H,使單片機(jī)從 0000H 單元開始執(zhí)行程序。除了進(jìn)入系統(tǒng)的正常初始化之外,當(dāng)由于程序運(yùn)行出錯或操作錯誤使系統(tǒng)處于死鎖狀態(tài)時,為擺脫困境,也需按復(fù)位鍵重新啟動。RESET 引腳是復(fù)位信號的輸入端。復(fù)位信號是高電平有效,其有效時間應(yīng)持續(xù)24個振蕩周期(即二個機(jī)器周期)以上。整個復(fù)位電路包括芯片內(nèi)、外兩部分。外部電路產(chǎn)生的復(fù)位信號(RESET)送至施密特觸發(fā)器,再由片內(nèi)復(fù)位電路在每個機(jī)器周期的 S5P2 時刻對施密特觸發(fā)器的輸出進(jìn)行采樣,然后才得到內(nèi)部復(fù)位操作所需要的信號。復(fù)位電路的電路圖也如上圖 10所示。


3.2 超聲波測距模塊設(shè)計

由 STC89C52 的 P10、P11、P12 接口出來,分別接超聲波收發(fā)模塊 HY-SRF05 的 Trig、Echo、Out 腳,以此來達(dá)到脈沖觸發(fā)以及數(shù)據(jù)傳輸處理的目的。圖 11 是超聲波模塊與單片機(jī)連接的電路圖。

圖 11 超聲波收發(fā)模塊電路圖

3.3 蜂鳴器的硬件設(shè)計

在這一節(jié)中,介紹的是整個系統(tǒng)中的另外一個具有提示功能的器件——有源蜂鳴器。蜂鳴器的具體電路圖如 3.7 所示。由于此次設(shè)計使用的是有源蜂鳴器,我們可以知道蜂鳴器需要一個驅(qū)動電路,這里用三極管進(jìn)行驅(qū)動。同時在電阻左側(cè)接一個上拉電阻到單片機(jī)電源端。

圖 12 蜂鳴器電路圖  

3.4  本章小結(jié)

在這一章中我們介紹了 STC89C52 單片機(jī)最小系統(tǒng)及其周圍電路的電路設(shè)計,其中包括了復(fù)位電路、晶振電路、電源電路、顯示器電路和蜂鳴器電路。通過本章節(jié)的詳細(xì)介紹不僅對硬件設(shè)計有了直觀的了解,還對設(shè)計中需要注意的地方都一一考慮到了,做到了硬件功能的實現(xiàn)。


4  系統(tǒng)軟件設(shè)計

本次設(shè)計的軟件設(shè)計部分采用 C51 語言進(jìn)行編程,運(yùn)用模塊化的程序設(shè)計思想,對具有不同功能的模塊程序進(jìn)行分別編程,其他模塊程序包括:數(shù)據(jù)處理的程序、顯示程序和蜂鳴器報警程序等,以便移植或調(diào)用。這樣使軟件層次結(jié)構(gòu)清晰,有利于軟件的調(diào)試和修改,在完全正確之后再進(jìn)行組裝、調(diào)試和燒錄。

4.1  主程序設(shè)計
4.1.1 系統(tǒng)軟件實現(xiàn)原理

整個設(shè)計的關(guān)鍵即是對距離的測量,再通過單片機(jī)處理測量得到的數(shù)據(jù),就能精確的實現(xiàn)測距。在測距中,各種信號對聲速的影響都將干擾到測距的準(zhǔn)確性,其中超聲波的余波信號對整個設(shè)計中測距的干擾的影響比較大。超聲波接收回路中的超聲波信號一共有兩種:第一種波信號為余波信號,就是當(dāng)發(fā)射探頭發(fā)射出信號之后,超聲波接收探頭馬上就接收到的超聲波信號,實際就是超聲波的發(fā)射信號;另一種波信號就是有效信號,即經(jīng)過障礙物表面反射回來的超聲波回波信號,也是所需要測量的距離數(shù)值。

在進(jìn)行超聲波測距時,由于使用的是超聲波測距模塊 HY-SRF05,按照本系統(tǒng)的

測距需要,需要得到超聲波的傳輸時間 T,進(jìn)行運(yùn)算以得到車子與障礙物的距離 S。

如何得到超聲波的傳輸時間 T 呢?

采用單片機(jī)的 P10 口與 Trig 連接,控制發(fā)射端產(chǎn)生 10us 以上的 TTL 觸發(fā)電平;模塊內(nèi)部自動產(chǎn)生 8 個 40kHz 的脈沖串并檢測回波; P11 口與Echo 口連接,當(dāng)接收端檢測到回波單片機(jī)內(nèi)部的計數(shù)器 T0 就開始計數(shù),回波的寬度就決定了計數(shù)值大小,由此便得出超聲波的的傳輸時間 T。

4.1.2系統(tǒng)程序構(gòu)建

系統(tǒng)設(shè)計框圖

超聲波測距系統(tǒng)軟件部分采用模塊化設(shè)計思想,將系統(tǒng)分為主程序、初始化處理模塊、中斷檢測模塊、延時處理模塊、數(shù)據(jù)處理模塊和顯示模塊,其軟件程序系統(tǒng)結(jié)構(gòu)圖如下圖13 所示。

圖 13系統(tǒng)軟件設(shè)計框圖

主程序流程圖:

整個系統(tǒng)的組成在進(jìn)入主函數(shù)后將進(jìn)行初始化,打開顯示刷新中斷利用中斷進(jìn)行刷新。再進(jìn)入測距函數(shù)后,每一次測距都是單片機(jī)進(jìn)行掃描實現(xiàn),同時定時器也在這里開啟。在處理接收到的數(shù)據(jù)信號后就關(guān)閉發(fā)射中斷處理完后再開啟中斷,最后記錄下來計數(shù)器的時間再由處理數(shù)據(jù)程序進(jìn)行計算。最后由操作程序進(jìn)行相應(yīng)的操作。根據(jù)該軟件系統(tǒng)結(jié)構(gòu)框圖,得到系統(tǒng)的主程序?qū)崿F(xiàn)流程圖。整個程序的編程環(huán)境是在 keil 環(huán)境下用 c 語言進(jìn)行編程。而用 c語言作為編程的主要原因是其編程比較簡單,對編程者要求不是很高;c 語言編出來的程序可讀性很高;編出的程序可以廣泛的進(jìn)行移植和借用等。圖 14為系統(tǒng)的主程序流程圖。

圖14主程序流程圖

系統(tǒng)主程序

系統(tǒng)的主程序首先是顯示屏初始化,設(shè)置定時器 T0 的工作模式為 MODE1,并且 STC89C52 的定時器計數(shù)器為 16 位。延遲一段時間之后,開啟中斷,開啟定時器,位總中斷 EA 置到允許位。在超聲波接收端一接收到回波信號時,計數(shù)器就開始計數(shù),直到回波高電平結(jié)束;夭ㄐ盘柕膶挾扰c計數(shù)值成正比。然后利用計數(shù)器得到的值計算超聲波發(fā)射和接收之間所用的時間,并調(diào)用測距公式對距離進(jìn)行計算。經(jīng)過單片機(jī)的處理得到的距離 S,送至顯示器,并將距離顯示出來;同時判斷 S 的大小,看蜂鳴器是否鳴叫。之后進(jìn)行下一次的測距工作。

程序如下:

void main(void)

{

              TMOD=0x11;                               //設(shè)T0為方式1,GATE=1;

              TH0=0;

              TL0=0;         

              TH1=0xf8;                               //2MS定時

              TL1=0x30;

              ET0=1;                                                        //允許T0中斷

              ET1=1;                                             //允許T1中斷

              TR1=1;                                             //開啟定時器

              EA=1;                                                                      //開啟總中斷            

              while(1)

              {

                            while(!RX);                            //當(dāng)RX為零時等待

                            TR0=1;                                          //開啟計數(shù)

                            while(RX);                            //當(dāng)RX為1計數(shù)并等待

                            {

                            TR0=0;                                          //關(guān)閉計數(shù)

                            flag_bofang=1;

                            }

                            Conut();                                          //計算

                            if(Mode==0)

                            {

                            if(abs(S-current_S)>=2)

                            {

                            current_S=S;

                            bofang(Feng,disbuff);

                            }

                            }

              }

}

            

4.2   測距模塊的設(shè)計

4.2.1 測距模塊的設(shè)計思想

根據(jù)回波信號的脈沖寬度得知計時器的數(shù)據(jù)以及距離公式:距離=(340*時間/2)

(m),可以計算得到小車距離障礙物的距離。

4.2.2測距模塊的程序

void Conut(void)

{

              time=TH0*256+TL0;                //讀出T0的計時數(shù)值

              TH0=0;

              TL0=0;                                                          //清空計時器

              S=(time*1.7)/100;     //算出來是CM

              if(Mode==0)                                            //非設(shè)置狀態(tài)時

              {

                            if((S>=700)||flag==1) //超出測量范圍顯示“-”

                            {            

                                          Feng=0;                                //蜂鳴器報警

                                          flag=0;

                                          disbuff[0]=10;                 //“-”

                                          disbuff[1]=10;                 //“-”

                                          disbuff[2]=10;                 //“-”

                            }

                            else

                            {

                                          //距離小于報警距

                                          if(S<=BJS)

                                          {

                                                        Feng=0;              //報警

                                          }

                                          else  //大于

                                          {

                                                        Feng=1;                            //關(guān)閉報警            

                                          }

                                          disbuff[0]=S%1000/100;                            //將距離數(shù)據(jù)拆成單個位賦值

                                          disbuff[1]=S%1000%100/10;

                                          disbuff[2]=S%1000%10 %10;

                            }

              }

              else

              {

                                          Feng=1;

                                          disbuff_BJ[0]=BJS%1000/100;

                                          disbuff_BJ[1]=BJS%1000%100/10;

                                          disbuff_BJ[2]=BJS%1000%10 %10;

              }

}



4.3  蜂鳴器報警程序
4.3.1報警模塊思想

主程序得到的結(jié)果是通過顯示屏顯示,并且還要控制蜂鳴器通過不同頻率的鳴叫來提醒,以及 LED 燈的閃爍。在該設(shè)計中,利用的是單片機(jī) I/O 端口引腳來控制。并且通過計數(shù)的方式來控制兩個引腳進(jìn)行高低互換產(chǎn)生控制信號。蜂鳴器報警程序的程序流程圖如圖15 所示。

圖 15蜂鳴器程序流程圖

4.3.2 蜂鳴器程序

if(S<50)

{buzz=1;

DelayMs(S*50);   buzz=0;

DelayMs(S*5);

}  if(S>50) buzz=1;}

判斷蜂鳴器報警距離是否小于 50cm,若超過 50cm 則蜂鳴器不報警,若小于 50cm 則報警。

4.4 本章小結(jié)

本章在上一章硬件電路設(shè)計的基礎(chǔ)上進(jìn)行了系統(tǒng)軟件的設(shè)計。首先進(jìn)行的是整個系統(tǒng)的設(shè)計,在設(shè)計之前需要明確要達(dá)到什么樣的功能怎樣實現(xiàn)這些功能,才能分模塊分別進(jìn)行設(shè)計。因此本章里面包括了系統(tǒng)的總體邏輯關(guān)系及軟件控制流程圖;其次,就是需要對各子程序進(jìn)行設(shè)計,設(shè)計依據(jù)便是硬件電路。因此整個系統(tǒng)的軟件程序劃分為中斷處理程序、測距程序、蜂鳴器程序、等。

5  系統(tǒng)調(diào)試及誤差分析

在調(diào)試的過程中分硬件調(diào)試和軟件調(diào)試。其中第一階段為硬件的調(diào)試,一般會遇到的情形有:邏輯錯誤、原器件損壞、可靠性差、電源故障等。本設(shè)計中使用的是萬用表進(jìn)行硬件檢測;第二階段為軟件的調(diào)試,最初的軟件調(diào)試為錯誤檢測,比如編程的錯誤,第二步為進(jìn)行邏輯錯誤檢查,最后進(jìn)行整個程序各個部分運(yùn)行時間的調(diào)試。第三節(jié)為誤差分析,針對本次設(shè)計中出現(xiàn)的誤差分析可能產(chǎn)生的原因,提出改進(jìn)的方法。

5.1   硬件的調(diào)試

硬件調(diào)試是一項細(xì)心的工作,一定要有耐心。硬件調(diào)試工具需要示波器、萬用表等,同時需要主芯片調(diào)試開發(fā)軟件及相應(yīng)的仿真器。硬件調(diào)試首先要熟悉原理圖原理

和PCB布局,然后根據(jù)功能模塊進(jìn)行相關(guān)調(diào)試。

5.1.1硬件調(diào)試流程

其中硬件調(diào)試部分為:


5.2   軟件的調(diào)試5.2.1 軟件調(diào)試的方法

將編制的程序投入實際運(yùn)行前,用手工或編譯程序等方法進(jìn)行測試,修正語法錯誤和邏輯錯誤的過程。這是保證計算機(jī)信息系統(tǒng)正確性的必不可少的步驟。編完計算機(jī)程序,必須送入計算機(jī)中測試。軟件調(diào)試一般分為以下四個階段:編寫程序并查錯;在C語言的編譯系統(tǒng)中編譯源程序;對程序進(jìn)行編譯連接,并及時發(fā)現(xiàn)程序中存在的錯誤;改正錯誤。

在軟件中調(diào)試程序時出現(xiàn)的問題有:

在軟件調(diào)試過程中,對出現(xiàn)的錯誤進(jìn)行了認(rèn)真的分析和修改,多次調(diào)試成功后,能夠很好的達(dá)到預(yù)定的設(shè)計效果。  



5.2.2  軟件調(diào)試后的結(jié)果

編好的程序進(jìn)行細(xì)心的檢查后,再通過 keil 軟件把程序燒進(jìn)單片機(jī),進(jìn)行實物演示。把電池安裝好,打開電源開關(guān),同時按下板子上的電源按鈕,顯示屏幕點亮,在系統(tǒng)前方移動障礙物,可以明顯聽見蜂鳴器的鳴叫的頻率發(fā)生了變化。但需要注意的是蜂鳴器由于程序設(shè)定的限制,只能在 50cm 內(nèi)的距離進(jìn)行響叫。屏幕實時顯示了距離障礙物的距離?梢钥吹剑航Y(jié)果達(dá)到了預(yù)期,較為滿意。如圖 5.2 所示。

5.3  誤差分析

5.3.1性能分析

雖然結(jié)果和預(yù)想的有很大的差距,但總體來說已經(jīng)基本上達(dá)到了要求,理想上超聲波測距能達(dá)到5米左右,而我們所能實現(xiàn)的最大距離只有3米,造成這種原因我想有:我采用的是11.0592MHZ的晶振,理論上是按照12MHZ的晶振計算的,所以對系統(tǒng)造成了一定的誤差;沒有考慮環(huán)境因素對本次設(shè)計的影響,造成測量結(jié)果有不小的誤差。

5.3.2 超聲波測距注意問題
5.3.3  超聲波測距改善方法

5.4  本章小結(jié)

在這一章中,對整個設(shè)計的硬件和軟件出現(xiàn)的錯誤和問題進(jìn)行了分析和解決,并對設(shè)計出的實物出現(xiàn)誤差的可能原因進(jìn)行了分析總結(jié),且提出了可能的解決方法。先是對硬件方面的檢驗,隨后是對軟件程序的編寫和調(diào)試。其中顯示模塊的調(diào)試程序、測距的調(diào)試程序、蜂鳴器的調(diào)試程序以及對整個程序進(jìn)行調(diào)試。最后完成對整個倒車系統(tǒng)的軟件部分進(jìn)行調(diào)節(jié),調(diào)試也是十分重要的一個環(huán)節(jié),調(diào)試通過才能實現(xiàn)最后的功能。

結(jié)  

本設(shè)計主要介紹了基于 STC89C52 單片機(jī)而設(shè)計出的一款倒車檢測及報警系統(tǒng)。                    

整個設(shè)計中超聲波測距是實現(xiàn)功能的關(guān)鍵,把來自超聲波測距模塊的信號傳輸?shù)絾纹瑱C(jī)端口并由單片機(jī)內(nèi)部 CPU 執(zhí)行相應(yīng)的處理程序。設(shè)計中采用數(shù)碼管模塊進(jìn)行顯示和用蜂鳴器進(jìn)行報警,其特點是根據(jù)距離障礙物的遠(yuǎn)近不同,蜂鳴器的變頻鳴叫。整個設(shè)計的編程是用 keil 編程軟件來完成的,程序語言采用的是 C 語言,程序內(nèi)容包括主程序、中斷程序控制觸發(fā)高電平的產(chǎn)生、檢測回波并計數(shù)、計算距離、蜂鳴器報警、數(shù)碼管模塊顯示。本設(shè)計完成的汽車倒車檢測及防撞系統(tǒng)操作方便,測距的范圍可以在 2cm-700cm 之間,基本能夠達(dá)到設(shè)計要求。

另一方面本設(shè)計雖然實現(xiàn)了功能,但是還存在一些缺點,如測量精度不高,測量過程會遭受多種因素的影響。因為實際使用的倒車測距儀工作環(huán)境多變,尤其是溫度變化對測距的影響,如果將溫度補(bǔ)償加到設(shè)計中,系統(tǒng)將更加完善。本系統(tǒng)在程序上比較繁瑣,測距移動的過程中可能反應(yīng)時間不夠快,因此需要優(yōu)化其靈敏度。

  

通過本次畢業(yè)設(shè)計的完成,檢驗了自己大學(xué)所學(xué)的知識和自己的綜合實踐能力,同時也對自己也有不少提高。更重要的是將自己獨(dú)立解決事情的能力提高了,為自己以后的工作積累下了又一筆不菲的寶貴財富。

在這次設(shè)計中,首先應(yīng)該感謝的是我本次設(shè)計的導(dǎo)師李向明老師。感謝他給予我的大力幫助和對我畢業(yè)設(shè)計的精心指導(dǎo)。在整個設(shè)計階段,從開始的題目分析到硬件的設(shè)計以及后面軟件的設(shè)計,李老師都給予了我很大的幫助;在硬件的搭建和調(diào)試過程中李老師也幫我進(jìn)行了問題的分析,并給我提了很多寶貴的意見和建議。在這里我十分感謝我的導(dǎo)師,感謝他對我們盡職盡責(zé)。

其次我要感謝實驗室的老師們,感謝他們?yōu)槲姨峁┝艘恍┯布蛯嶒炂鞑牡氖褂。衷心的謝謝你們!當(dāng)然我更得感謝我父母對我的辛勤付出,是他們讓我有這個機(jī)會進(jìn)入武漢華夏理工學(xué)院這所學(xué)習(xí)氛圍濃厚的理工科大學(xué),使我能用四年的時間安心學(xué)習(xí),學(xué)習(xí)知識,學(xué)習(xí)做人,學(xué)習(xí)如何學(xué)習(xí)。

最后要感謝的是我偉大的母校——武漢華夏理工學(xué)院,它為我提供了一個良好的學(xué)習(xí)環(huán)境和優(yōu)良的教學(xué)資源。更要感謝這四年來所有傳授我知識的老師們,感謝他們的無私奉獻(xiàn),將他們所知道的無私地教導(dǎo)了我們。同時也感謝我身邊的所有朋友在生活和學(xué)習(xí)上給我的幫助。


原理圖:





程序:
  1. #include //器件配置文件

  2. #include

  3. #include

  4. #include               

  5. //傳感器接口

  6. sbit RX  = P2^3;

  7. sbit TX  = P2^2;

  8. //按鍵聲明

  9. sbit S1  = P3^1;

  10. sbit S2  = P3^2;

  11. sbit S3  = P3^6;



  12. sbit DIAN=P0^5;

  13. //蜂鳴器

  14. sbit Feng= P2^0;



  15. //變量聲明

  16. unsigned int  time=0;

  17. unsigned int  timer=0;

  18. unsigned char posit=0;

  19. unsigned long S=0;

  20. unsigned long BJS=50;//報警距離80CM



  21. unsigned long current_S=0;

  22. char num=0;

  23. //模式 0正常模式 1調(diào)整

  24. char Mode=0;

  25. bit  flag=0;



  26. unsigned char const discode[] ={0x5F,0x44,0x9D,0xD5,0xC6,0xD3,0xDB,0x47,0xDF,0xD7,0x80};              //數(shù)碼管顯示碼0123456789-和不顯示



  27. unsigned char disbuff[4]                 ={0,0,0,0};                            //數(shù)組用于存放距離信息

  28. unsigned char disbuff_BJ[4]              ={0,0,0,0};//報警信息

  29. sbit W0=P2^4;

  30. sbit W1=P2^5;

  31. sbit W2=P2^6;

  32. sbit W3=P2^7;

  33. //延時100ms(不精確)

  34. void delay(void)

  35. {

  36.     unsigned char a,b,c;

  37.     for(c=10;c>0;c--)

  38.         for(b=38;b>0;b--)

  39.             for(a=130;a>0;a--);

  40. }



  41. //按鍵掃描

  42. void Key_()

  43. {

  44.               //+

  45.               if(S1==0)

  46.               {

  47.                             delay();                 //延時去抖

  48.                             delay();                 //延時去抖

  49.                             flag_bofang=0;

  50.                             while(S1==0)

  51.                             {

  52.                                           P1=P1|0x0f;

  53.                             }

  54.                                           BJS++;              //報警值加

  55.                             if(BJS>=151) //最大151

  56.                             {

  57.                                           BJS=0;

  58.                             }

  59.               }

  60.               //-

  61.               else if(S2==0)

  62.               {

  63.                             delay();

  64.                             delay();                 //延時去抖

  65.                             flag_bofang=0;

  66.                             while(S2==0)

  67.                             {

  68.                                           P1=P1|0x0f;

  69.                             }

  70.                                           BJS--;              //報警值減

  71.                             if(BJS<=1)              //最小1

  72.                             {

  73.                                           BJS=150;

  74.                             }

  75.               }

  76.               //功能

  77.               else if(S3==0)                            //設(shè)置鍵

  78.               {

  79.                             delay();

  80.                             delay();                 //延時去抖

  81.                             flag_bofang=0;

  82.                             while(S3==0)

  83.                             {

  84.                                           P1=P1|0x0f;

  85.                             }

  86.                                           Mode++;                            //模式加

  87.                                           num=0;

  88.                             if(Mode>=2)                            //加到2時清零

  89.                             {

  90.                                           Mode=0;

  91.                             }            

  92.               }

  93. }

  94. /**********************************************************************************************************/

  95. //掃描數(shù)碼管

  96. void Display(void)                                                      

  97. {

  98.               //正常顯示

  99.               if(Mode==0)

  100.               {

  101.                             num++;

  102.                             if(num==1)

  103.                             {

  104.                                           W3=1;

  105.                                           W0=1;

  106.                                           P0=~discode[disbuff[0]];

  107.                                           DIAN=0;

  108.                                           W1=0;            

  109.                             }

  110.                             else if(num==2)

  111.                             {

  112.                                           W1=1;

  113.                                           P0=~discode[disbuff[1]];

  114.                                           W2=0;

  115.                             }

  116.                             else if(num>=3)

  117.                             {

  118.                                           W2=1;

  119.                                           P0=~discode[disbuff[2]];

  120.                                           W3=0;

  121.                                           num=0;

  122.                             }

  123.               }

  124.               //報警顯示

  125.               else

  126.               {

  127.                             num++;

  128.                             if(num==1)

  129.                             {

  130.                                           W3=1;

  131.                                           P0=~0xCE;                              //11001110

  132.                                           W0=0;

  133.                             }

  134.                             else if(num==2)

  135.                             {

  136.                                           W0=1;

  137.                                           P0=~discode[disbuff_BJ[0]];

  138.                                           DIAN=0;

  139.                                           W1=0;            

  140.                             }

  141.                             else if(num==3)

  142.                             {

  143.                                           W1=1;

  144.                                           P0=~discode[disbuff_BJ[1]];

  145.                                           W2=0;

  146.                             }

  147.                             else if(num>=4)

  148.                             {

  149.                                           W2=1;

  150.                                           P0=~discode[disbuff_BJ[2]];

  151.                                           W3=0;

  152.                                           num=0;

  153.                             }

  154.               }

  155. }

  156. /**********************************************************************************************************/

  157. //計算

  158. void Conut(void)

  159. {

  160.               time=TH0*256+TL0;                //讀出T0的計時數(shù)值

  161.               TH0=0;

  162.               TL0=0;                                                          //清空計時器

  163.               S=(time*1.7)/100;     //算出來是CM



  164.               if(Mode==0)                                            //非設(shè)置狀態(tài)時

  165.               {

  166.                             if((S>=700)||flag==1) //超出測量范圍顯示“-”

  167.                             {            

  168.                                           Feng=0;                                //蜂鳴器報警

  169.                                           flag=0;

  170.                                           disbuff[0]=10;                 //“-”

  171.                                           disbuff[1]=10;                 //“-”

  172.                                           disbuff[2]=10;                 //“-”

  173.                             }

  174.                             else

  175.                             {

  176.                                           //距離小于報警距

  177.                                           if(S<=BJS)

  178.                                           {

  179.                                                         Feng=0;              //報警

  180.                                           }

  181.                                           else  //大于

  182.                                           {

  183.                                                         Feng=1;                            //關(guān)閉報警            

  184.                                           }

  185.                                           disbuff[0]=S%1000/100;                            //將距離數(shù)據(jù)拆成單個位賦值

  186.                                           disbuff[1]=S%1000%100/10;

  187.                                           disbuff[2]=S%1000%10 %10;

  188.                             }

  189.               }

  190.               else

  191.               {

  192.                                           Feng=1;

  193.                                           disbuff_BJ[0]=BJS%1000/100;

  194.                                           disbuff_BJ[1]=BJS%1000%100/10;

  195.                                           disbuff_BJ[2]=BJS%1000%10 %10;

  196.               }

  197. }

  198. /**********************************************************************************************************/

  199. //定時器0

  200. void zd0() interrupt 1                             //T0中斷用來計數(shù)器溢出,超過測距范圍

  201. {

  202.               flag=1;                                                                                    //中斷溢出標(biāo)志

  203. }

  204. /**********************************************************************************************************/

  205. //定時器1

  206. void zd3() interrupt 3                             //T1中斷用來掃描數(shù)碼管和計800MS啟動模塊

  207. {

  208.               TH1=0xf8;

  209.               TL1=0x30;                                                        //定時2ms

  210.               Key_();                                                                      //掃描按鍵

  211.               Display();                                                        //掃描顯示

  212.               timer++;                                                        //變量加

  213.               if(timer>=400)                                          //400次就是800ms

  214.               {

  215.                             timer=0;

  216.                             TX=1;                                                    //800MS  啟動一次模塊

  217.                             _nop_();


  218. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

完整論文下載(word格式,可編輯,帶完整程序):
基于單片機(jī)的倒車檢測及報警系統(tǒng)設(shè)計.docx (924.96 KB, 下載次數(shù): 93)



作者: POIU    時間: 2017-5-10 12:52
謝謝


作者: 遷就    時間: 2020-6-9 19:32
謝謝分享




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1