北郵小學(xué)期pic單片機-超聲波測距儀實驗報告(附代碼)_第1頁
北郵小學(xué)期pic單片機-超聲波測距儀實驗報告(附代碼)_第2頁
北郵小學(xué)期pic單片機-超聲波測距儀實驗報告(附代碼)_第3頁
北郵小學(xué)期pic單片機-超聲波測距儀實驗報告(附代碼)_第4頁
北郵小學(xué)期pic單片機-超聲波測距儀實驗報告(附代碼)_第5頁
已閱讀5頁,還剩43頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、北京郵電大學(xué)信息與通信工程學(xué)院23班2014年小學(xué)期單片機設(shè)計實驗報告題目:超聲波測距儀目錄實驗摘要1一實驗論證與比較21.超聲波發(fā)射電路22.超聲波接收電路33.單片機最小系統(tǒng)與顯示電路5二系統(tǒng)總體設(shè)計51.硬件總體框圖52.軟件流程圖6三硬件連接81.接收電路部分82.總電路83.焊接后的發(fā)射和接收電路9四調(diào)試過程9電路部分91.超聲波發(fā)射電路:92.超聲波接收電路:10程序部分:111.計算路程的優(yōu)化算法112.單片機的中斷123.定時器134.在線調(diào)試時發(fā)現(xiàn)計數(shù)器的值與理論指令執(zhí)行時間不一致135.最小量程146.實驗誤差147.接收到的信號較弱14五實驗心得和體會14六參考文獻(xiàn)16北

2、京郵電大學(xué)信息與通信工程學(xué)院23班實驗摘要目前常用測量距離都采用波在介質(zhì)中的傳播速度和時間關(guān)系進(jìn)行測量。常用的技術(shù)有激光測距、微博測距和超聲波測距三種。前兩種測量精度很高,電路復(fù)雜,價格昂貴。而超聲波具有指向性強、能量消耗緩慢且在介質(zhì)中傳播的距離較遠(yuǎn)的優(yōu)點,經(jīng)常用于距離的測量。超聲波測距主要應(yīng)用于建筑工地,以及一些工業(yè)現(xiàn)場和移動機器人的研制上,可在超市高溫,多塵等惡劣環(huán)境下工作。可用于測量液位、厚度、管道長度等場合。相比于其他定位技術(shù)而言,超聲波定位技術(shù)成本低、精度高、操作簡單、工作穩(wěn)定可靠,非常適合于短距離測量定位。PIC單片機為許多控制提供了高度靈活和低成本的解決方案,充分利用PIC單片機

3、的片內(nèi)資源,加上極少量的外圍電路就可以組成一個完整的超聲波測距系統(tǒng)。我們設(shè)計了以PIC16F877單片機為核心的低成本的超聲波測距系統(tǒng)。使用74HC04設(shè)計超聲波發(fā)射驅(qū)動電路,提高輸出功率;使用運算放大器和比較器構(gòu)成超聲波接受電路,使得超聲波能夠正確地被識別出來;使用LCD1602液晶顯示屏顯示測出的距離。而單片機負(fù)責(zé)產(chǎn)生超聲波信號、記錄超聲波傳播的時間并計算距離。AbstractNow commonly used to measure distance using wave propagation velocity in the medium and the relationship bet

4、ween time measurement. Commonly used technology of laser ranging, microwave ranging and ultrasonic ranging. The first two measurement precision is high, circuit is complex, expensive. And ultrasound has strong directivity, energy consumption slow and the advantages of distance in the medium to sprea

5、d, often used for distance measurement. Ultrasonic ranging is mainly used in construction sites, as well as some industrial field and the development of the mobile robot can heat in the supermarket, dusty work under the bad environment, etc. Can be used to measure the liquid level, thickness, pipe l

6、ength, etc. Compared to other positioning technology, ultrasonic positioning technology of low cost, high precision, simple operation, stable and reliable work, is very suitable for short distance measurement.PIC microcontroller for many control provides a highly flexible and low cost solution, make

7、 full use of the PIC microcontroller chip resources, plus a small amount of peripheral circuit could form a complete ultrasonic ranging system.We have designed with PIC16F877 single-chip microcomputer as the core of low-cost ultrasonic ranging system. Using 74hc04 ultrasonic launch driver circuit de

8、sign, improve the output power; Using operational amplifier and a comparator ultrasonic receiving circuit, makes the ultrasonic were correctly identified; Use LCD1602 LCD display to measure the distance. And ultrasonic signal, generated by the microcontroller is responsible for the records of ultras

9、onic transmission time and calculate the distance.關(guān)鍵字單片機microcontroller芯片CMOS chip 超聲波探測infrared detector一 實驗論證與比較1. 超聲波發(fā)射電路 超聲波發(fā)射電路主要由超聲波發(fā)射傳感器和超聲波功率放大驅(qū)動電路構(gòu)成,電路如下圖。在圖中,由單片機輸出的方波信號分成兩路,一路經(jīng)過U2D和U2E并聯(lián)后的一級反向后加到超聲波傳感器的一個電極上;另一路先經(jīng)過U2A一級反向送到U2B和U2C并聯(lián)后的反向加到超聲波傳感器的另一個電極上。采用U2B、U2C以及U2D、U2E的并聯(lián)電路以目增加輸出功率,提高測量距

10、離。電容C1和C2起信號的耦合作用,同時也起到隔離直流作用。電阻R1和R2在此處用于提高超聲波傳感器的阻尼效果,以縮短阻尼振蕩的時間,同時也提高輸出驅(qū)動能力。示波器中觀測到的輸出波形(輸入波形是峰峰值為5V的方波):2. 超聲波接收電路設(shè)計的超聲波接收電路如下圖所示。由超聲波傳感器RECV將接收到的返回波信號轉(zhuǎn)換成電信號由電容C1耦合到U1集成運算放大器的反向輸入端,并由U1A和U1B運算放大器構(gòu)成的兩級信號的同相放大,兩級總的放大倍數(shù)為440左右。放大后的返回波信號由U1B輸出,經(jīng)電壓比較器后輸出形成方波,當(dāng)檢測到第一個有效的返回波時,就觸發(fā)單片機中斷進(jìn)行處理。由于一般返回的超聲波信號比較弱

11、,特別是在測量距離比較遠(yuǎn)的時候,返回的超聲波就更弱,要能夠檢測到有效的返回超聲波信號,必須將返回波信號進(jìn)行足夠的放大,圖中采用了兩級放大。第一級放大倍數(shù)由R5和R3決定,放大倍數(shù)約為1+39/1=40。第二級放大倍數(shù)由R6和R4決定,放大倍數(shù)約為1+10/1=11。從而總的放大倍數(shù)約為440理論上來講,放大倍數(shù)越大,測量距離越遠(yuǎn),超聲波測距儀性能越好。但實際搭建電路后我們發(fā)現(xiàn),在放大倍數(shù)比較大時(如600),接收電路會產(chǎn)生自激現(xiàn)象,無法使單片機正確地進(jìn)入中斷,這一點在后面有詳細(xì)說明。由multisim仿真結(jié)果可知:輸出是峰峰值為5V的方波,從而可以使單片機產(chǎn)生中斷。實際波形和仿真結(jié)果相似,波形

12、更好,但當(dāng)時忘記拍圖。3. 單片機最小系統(tǒng)與顯示電路上圖為單片機的最小系統(tǒng)與顯示電路圖。二 系統(tǒng)總體設(shè)計1. 硬件總體框圖單片機LCD顯示信號調(diào)理電路超聲波接收溫度測量電路40kHz功率放大超聲波發(fā)射電路開始工作后,由單片機產(chǎn)生信號并開始計時,經(jīng)過功率放大電路后將超聲波發(fā)射出去,超聲波遇到障礙物后反彈回到超聲波接收器,經(jīng)過信號調(diào)理電路后觸發(fā)單片機中斷并停止計時。由單片機算出距離后送LCD顯示距離。2. 軟件流程圖 主程序流程圖如下圖。首先進(jìn)行變量的初始化,單片機每隔1s產(chǎn)生8個周期的信號。先判斷1s定時是否到了,如果到了則系統(tǒng)發(fā)射8個連續(xù)的超聲波脈沖,然后進(jìn)行約0.8ms的短延時并開啟INT中

13、斷;否則繼續(xù)等待。使用短延時是為了消除余波的影響。發(fā)送出超聲波之后判斷接收時間是否超過2s,如果超過兩秒,說明沒有接收到回波,此時返回1s定時;如果2s內(nèi)接收到回波,則關(guān)閉中斷并取時間,計算距離然后送顯,再回到1s定時處。YNN延時一段時間啟動語音播放距離送顯示緩沖器計算聲波傳輸時間計算聲波傳輸距離計算聲波速度測量當(dāng)前環(huán)境溫度接收超時短延時并開INTO中斷發(fā)8個連續(xù)超聲波脈沖1s定時結(jié)束系統(tǒng)初始化YN中斷服務(wù)程序流程圖如下圖Y中斷服務(wù)程序入口NINT中斷關(guān)閉INT0中斷并置標(biāo)志YN定時器0溢出LED數(shù)碼管動態(tài)掃描Y1s定時結(jié)束N置標(biāo)志并清秒計數(shù)秒計數(shù)變量加1Y接收超時N清標(biāo)志計數(shù)變量減1中斷返

14、回 進(jìn)入中斷程序后,首先判斷是否為INT產(chǎn)生的中斷,如果是說明接收到有效的回波,此時清楚INT終端標(biāo)志位;否則直接去判斷是否為TMR0產(chǎn)生的中斷。如果是TMR0溢出產(chǎn)生的中斷,則接下來要判斷1s定時是否結(jié)束,如果1s定時結(jié)束,則清楚計數(shù)標(biāo)志并繼續(xù)判斷2s超時計時是否到了,如果1s定時未結(jié)束,則只需將相應(yīng)計數(shù)變量加1。如果超時計時結(jié)束,則清除相應(yīng)標(biāo)志,否則只需將相應(yīng)計數(shù)變量加1。三 硬件連接1. 接收電路部分 2. 總電路3. 焊接后的發(fā)射和接收電路四 調(diào)試過程電路部分我主要負(fù)責(zé)的部分是電路的設(shè)計和調(diào)試,以及最終的焊接工作。電路的設(shè)計主要包括兩個模塊:超聲波發(fā)射電路、超聲波接收電路;設(shè)計原理以及

15、電路圖都在前文中有詳細(xì)描述,在此不再贅述。但是電路的搭建和調(diào)試過程卻遇到了很多問題:1. 超聲波發(fā)射電路:我們采用的是型號為74HC04N的芯片,此芯片的作用是用于放大單片機產(chǎn)生的超聲波信號的功率。一開始使用multisim做仿真,但是搭建好電路之后仿真出錯,始終找不到解決方法,所以直接進(jìn)行實測,幸運的是實測結(jié)果還比較滿意。2. 超聲波接收電路: 在用multisim仿真第一級放大電路的過程中,一開始將信號從放大芯片TL082CM的同相輸入端輸入,但是始終沒有波形輸出,多次查找資料后發(fā)現(xiàn)是電路設(shè)計的錯誤,信號需要從放大器的反向輸入端輸入,從而將問題解決。 設(shè)計放大倍數(shù)上,初始設(shè)定為101

16、15;11=1111倍,但是經(jīng)過仿真發(fā)現(xiàn)第一級放大倍數(shù)始終達(dá)不到101,于是我就去上網(wǎng)查找芯片的參數(shù),后來我從芯片的使用資料中發(fā)現(xiàn)單級放大倍數(shù)達(dá)不到101,但是為了滿足上千倍的放大倍數(shù)要求,經(jīng)過多次仿真及測試,我們將放大倍數(shù)定為40×31=1240倍。 在面包板上將電路搭建好之后,發(fā)現(xiàn)第二級放大電路不起作用,多番檢查電路也沒有找到原因,但是在multisim仿真中是有作用的;在老師的幫助下,發(fā)現(xiàn)沒有對第二個芯片進(jìn)行供電。因為芯片TL082CM內(nèi)部有兩個放大器,而我在電路中卻用了兩個TL082CM,每一個只用其中一個放大器,但是在multisim中仿真卻用了一個芯片中的兩個放大器,所以

17、在原理圖中可以發(fā)現(xiàn)第二級放大電路的芯片沒有進(jìn)行直流供電。我對著multisim中的電路直接在面包上進(jìn)行搭建,所以導(dǎo)致沒有對第二個芯片進(jìn)行供電。 進(jìn)行兩級放大之后需要將正弦波形整形成方波,我一開始的設(shè)想是用兩個二極管和一個三極管構(gòu)成對檢波電路,但是在實測中發(fā)現(xiàn)整形效果很差,不能認(rèn)定為方波,所以將其放棄了;并使用一個型號為LM393的芯片設(shè)計了一個電壓比較器電路(理論輸出高電平為5V,低電平為0V),實際輸出波形非常完美(比仿真結(jié)果要好很多),誤差為100mV 左右,在誤差允許范圍內(nèi)。 在我們編寫完程序并調(diào)試完成后,我們開始整機調(diào)試,發(fā)現(xiàn)輸出結(jié)果總是294mm !我們嘗試了很多方法都沒有檢測出原因

18、所在,后來在老師的幫助下,發(fā)現(xiàn)是接收電路出現(xiàn)了自激現(xiàn)象。出現(xiàn)的原因是放大倍數(shù)太大(一開始設(shè)計為1200倍左右,實測為900倍左右)。為了解決自激問題,我們嘗試了以下辦法:.將放大倍數(shù)縮小,從一開始的1200倍一直往下降,并不斷地測試是否產(chǎn)生自激,雖然降到100左右的時候自激現(xiàn)象消失了,但是如此小的放大倍數(shù)并不足以滿足電路的實際要求,經(jīng)過計算,我們認(rèn)為放大倍數(shù)需要400倍左右才能滿足電路的設(shè)計要求,于是我們將電路的放大倍數(shù)改為440倍左右。.設(shè)計了最簡單的電容濾波,將一個電容直接接地,發(fā)現(xiàn)所有信號都被過濾了;后來我們從示波器中發(fā)現(xiàn),自激信號的頻率為170kHz的倍頻信號,而超聲波信號為40kHz

19、,于是我就嘗試設(shè)計了一個二階低通濾波器并將截止頻率設(shè)為70kHz,理論上可行,在multisim上仿真時效果一般,但是實測效果更差,自激現(xiàn)象仍然存在,于是我們就放棄了這個方法。.我們又發(fā)現(xiàn),自激信號的最小值為2.5V 左右,所以我們就用了另一種辦法,將電壓比較器的比較電壓降低,從而使得自激信號經(jīng)過電壓比較器之后編程高電平,這樣就不會有上升沿使得單片機產(chǎn)生中斷。經(jīng)過計算,我將比較電壓設(shè)置為1.47V 左右(由原理圖可以計算),從而解決了自激的問題。程序部分:1. 計算路程的優(yōu)化算法我們選擇計算距離的方法是用乘除法進(jìn)行計算(距離×時間=路程),但是匯編語言中并不能直接調(diào)用乘除法,于是我們

20、不得不自己編寫乘除法的程序,由于涉及數(shù)值較大,所以我們需要實現(xiàn)16×16的乘法算法,即將每一個數(shù)分高8位低8位分別存在兩個寄存器中,然后進(jìn)行操作,具體實現(xiàn)過程不再贅述。除法也是類似的原理,只不過我們的除法是實現(xiàn)的整數(shù)除法,將余數(shù)直接舍棄了,雖然損失了最終結(jié)果的精度,但極大地簡化了程序設(shè)計過程,而且只要對最終結(jié)果修正,那么最終結(jié)果的誤差也是可以接受的。編寫好乘除法程序之后,我就對其進(jìn)行調(diào)試,乘法程序沒有問題,但是除法程序?qū)τ谝恍?shù)的計算總是出錯,在調(diào)試過程中發(fā)現(xiàn)是寄存器的溢出問題:由于程序?qū)崿F(xiàn)的是對有符號數(shù)進(jìn)行乘法運算,就意味著有寄存中的最高位成為符號位,但是從乘法運算的結(jié)果存在4個寄

21、存器中,符號位存在高16位寄存器的最高位,而我只需要低16位就足以滿足我們計算要求,所以沒有遇到問題。但是在除法中,除法運算的結(jié)果只保存在2個寄存器中,而對于有符號數(shù),就意味著最大數(shù)值只能為32767(65536的一半),為了滿足這個要求,同時為了減小精度的損失,我們經(jīng)過計算,決定對路程的計算過程進(jìn)行改動。首先將單片機TIMER1計算的時間進(jìn)行除以100,然后乘以聲速191ms(原因稍后解釋),然后除以10,得到的結(jié)果單位就為mm 了。經(jīng)我們計算發(fā)現(xiàn),這種辦法既可以避免在乘以191之后的數(shù)值超過32767,從而使得除以10調(diào)用除法程序的時候寄存器產(chǎn)生溢出的情況,也可以最大限度地減小計算誤差,經(jīng)

22、過計算,這種算法最大誤差為 2cm ,如果直接對時間T除以1000再乘以聲速191ms ,最大誤差可能打到19.1cm !這個誤差使我們不能接受的,而我們的方法極大地減小了誤差!將聲速定為191ms 的原因:室溫下聲速為346ms,我們將其折半為173ms,這樣就免去了對時間T進(jìn)行折半,減小了調(diào)用除法程序帶來的誤差,同時為了修正最終的結(jié)果(路程),我們將聲速定為173ms×1.1=191ms ,這樣最終的結(jié)果誤差就在可以接受范圍內(nèi)了。2. 單片機的中斷 由于之前一直學(xué)習(xí)的都是高級語言的程序設(shè)計,在學(xué)習(xí)單片機之前我并沒有接觸過中斷這個概念,所以第一次使用這個功能的時候還是出現(xiàn)了很多的問

23、題。我們的程序原本設(shè)定的時候是使用三個中斷,一是用TIMER1計時溢出時產(chǎn)生的中斷,我們將TIMER1用于超聲波發(fā)出到接收所花的時間;二是當(dāng)單片機接收到外來超聲波的上升沿時產(chǎn)生的外部中斷(INT0);三是用TIMER0產(chǎn)生的中斷。相對來說,外部中斷和TIMER0產(chǎn)生的中斷我們的處理方式都沒有問題,但是TIMER1產(chǎn)生的中斷著實讓我們無法理解。我們在調(diào)試程序過程中發(fā)現(xiàn),TIMER1中斷不受控制,總是在不該進(jìn)入中斷的時候卻進(jìn)入中斷請求程序,這就意味著我們無法準(zhǔn)確地進(jìn)行路程的計算。我們嘗試了多種解決辦法,并和老師進(jìn)行了長達(dá)一個多小時的探討,發(fā)現(xiàn)都無法解決這個問題。然后我們又一次通過計算解決了這個問題

24、!我們發(fā)現(xiàn),TIMER1計時溢出意味著用時達(dá)到65536s ,也就是路程達(dá)到了11245m ,但實際上,我們遠(yuǎn)遠(yuǎn)達(dá)不到這個距離,也就是說,我們需要的時間遠(yuǎn)遠(yuǎn)達(dá)不到65536s ,即TIMER1不會產(chǎn)生溢出中斷!于是我們決定將TIMER1的中斷服務(wù)程序去掉,以免造成不可控制的誤差。 進(jìn)入中斷恢復(fù)現(xiàn)場的問題:一開始的時候,我們調(diào)試發(fā)現(xiàn),程序進(jìn)入中斷之后再次跳出時我們的計時器便不能重新開始計時,有時候又可以。經(jīng)過單步調(diào)試發(fā)現(xiàn),由于個別中斷程序的出口沒有對計數(shù)器器進(jìn)行恢復(fù),導(dǎo)致計數(shù)器工作異常。在修改程序之后這個問題得到了解決。3. 定時器從流程圖中可以看出,我們的程序有兩個地方需要定時器,一是每次發(fā)超

25、聲波之前需要等待1s ;二是每次超聲波發(fā)出之后,程序會有一個2s 的等待時間,若超出這個時間則認(rèn)為此次超聲波接收超時,準(zhǔn)備下一次超聲波的發(fā)射。為了降低程序設(shè)計的難度,我們用TIMER0產(chǎn)生一個 8ms 的定時器,然后用兩個變量控制TIMER0產(chǎn)生 8ms 的次數(shù)。例如:當(dāng)一個變量的值打到128時,我們就認(rèn)為時間到了1s;同理,當(dāng)另一個變量達(dá)到256時,我們就認(rèn)為時間到了2s。雖然不太準(zhǔn)確,但這不影響程序的結(jié)果,但是降低了難度,因為判斷是否到了128或者256時,我們只需要判斷bit7或者進(jìn)位標(biāo)志位,避免了對兩個數(shù)進(jìn)行直接比較的情況,極大地減小了代碼的復(fù)雜程度。同時,這樣一種設(shè)計思路,也實現(xiàn)了計

26、數(shù)器的高效率使用,避免了使用兩個計數(shù)器實現(xiàn)兩個定時器的代碼重復(fù)現(xiàn)象,同時降低程序設(shè)計的難度,減小了程序出錯的可能性,便于調(diào)試。我們認(rèn)為這是一種很便捷的設(shè)計思路,值得大家去借鑒。4. 在線調(diào)試時發(fā)現(xiàn)計數(shù)器的值與理論指令執(zhí)行時間不一致在不接單片機進(jìn)行調(diào)試時,我們用STOPWATCH窗口查看程序運行的時間,觀察發(fā)現(xiàn)每條指令的執(zhí)行時間為1s 或 2s ,與老師提供的學(xué)習(xí)資料中的介紹一致。但接了單片機之后,我們在線單步調(diào)試時卻發(fā)現(xiàn)跳轉(zhuǎn)指令執(zhí)行后計數(shù)器(未分頻)的值有大幅跳變,與不接單片機調(diào)試時的情況不同!讓我們一度以為程序出了bug,經(jīng)過和老師的探討以及老師耐心地解釋,我們得知是編譯器本身的問題,與程序

27、本身無關(guān)。5. 最小量程正如前面所說,當(dāng)出現(xiàn)自激時液晶屏的顯示結(jié)果總是294mm ,我們一度以為是超聲波接收和發(fā)射探頭的最小反應(yīng)時間,但是我們經(jīng)過對代碼的仔細(xì)推敲之后發(fā)現(xiàn),這并不是硬件的限制,是我們的代碼決定了這個理論測量的最小值!原因如下:在我們的程序中,發(fā)射超聲波的程序結(jié)束之后設(shè)計了一個約 1.7ms 的延時,目的是減少回波造成的影響,但也正因這個延時,導(dǎo)致了我們所測量的距離有最小值。這個最小值應(yīng)該為173ms×1.7ms=294mm ,也正是我們一直出現(xiàn)的最小值294mm ?。ㄒ驗檎`差修正是在整個程序無誤之后才進(jìn)行的,所以在我們調(diào)試過程中我們的聲速都是設(shè)置為173ms)我們發(fā)現(xiàn)

28、問題之后,我的隊友就將延時降低到了1.1ms,從而減小了最小量程。6. 實驗誤差前面提到,我們將計算路程的算法優(yōu)化之后理論誤差最大為2cm,但實際測量發(fā)現(xiàn),誤差較大,這是由于不僅僅有計算誤差,還有單片機本身的計時誤差(振蕩頻率不是4MHz),以及聲速的誤差等等。經(jīng)過我們反復(fù)測量不同的距離,發(fā)現(xiàn)測量值與實際距離相差約0.113倍,我們將1.1乘以聲速173ms 得到191ms ,用該值作為修正值參與運算,結(jié)果卻是當(dāng)實際距離小于800mm 時誤差不超過2cm,這也說明我們的分析是沒錯的!7. 接收到的信號較弱前面提到,為了解決自激現(xiàn)象,我們降低了放大倍數(shù),導(dǎo)致接收到的信號難以有效放大,從而導(dǎo)致整套

29、裝置的反應(yīng)時間較長,經(jīng)常出現(xiàn)無法測量的情況。正當(dāng)我們愁眉苦展之時,我發(fā)現(xiàn)實驗室有一個金屬盒子(其實就是路由器),我嘗試將其當(dāng)作障礙物(之前都是拿書本當(dāng)障礙物),效果非常明顯!我們用這個裝置發(fā)現(xiàn)測距的最大距離達(dá)到1.3m !五 實驗心得和體會六 參考文獻(xiàn)PIC單片機實用教程基礎(chǔ)篇 (五號 宋體)李學(xué)海北京航空航天大學(xué)出版社PIC單片機實用教程提高篇李學(xué)海北京航空航天大學(xué)出版社1. 孫安青. PIC系列單片機開發(fā)實例精解M. 中國電力出版社:孫安青, 2011. 380-399附上代碼: LIST p=16f877 INCLUDE "p16f877.inc"VARIABLE D

30、EFINITION;TIMER1HIGHCOUNTER EQU 20HSECONDOKFLAGEQU21HSECONDCOUNTEREQU22HRECEIVEOKFLAGEQU23HTIMERINTERVALEQU24HTIMERENABLEEQU25HWTEMPEQU26HSTATUSTEMPEQU27HCOUNT1EQU28H ; 產(chǎn)生40KHZ時所用的計數(shù)器DINGSHI EQU 29H ;1MS延時程序定時器 ACCALOEQU30;存放乘數(shù)低8位ACCAHIEQU31;存放乘數(shù)高8位ACCBLOEQU33;存放被乘數(shù)低8位和乘積第16-23位ACCBHIEQU34;存放被乘數(shù)高8位和

31、乘積第24-31位ACCCLOEQU36;存放乘積低8位ACCCHIEQU37;存放乘積高8位ACCDLOEQU38;臨時寄存器ACCDHIEQU39;臨時寄存器TEMPEQU3A;臨時寄存器SIGNEQU3B;存放乘積符號;*BCCALOEQU40BCCAHIEQU41BCCBLOEQU42BCCBHIEQU43BCCCLOEQU44BCCCHIEQU45BCCDLOEQU46BCCDHIEQU47TEMP_BEQU48SIGN_BEQU49YCCBLOEQU50HYCCBHIEQU51HYCCCLOEQU52HYCCCHIEQU53HYCCDLOEQU54HYCCDHIEQU55HTEMP

32、1EQU56HSIGN1EQU57HCOUNT2EQU58HBCD_LEQU 59HBCD_HEQU 5AHASCII_HEQU 5BHASCII_LEQU 5CHTAB_TEMEQU5DHBCDEQU5EHFINAL1_HEQU5FHFINAL1_LEQU60HFINAL2_HEQU61HFINAL2_LEQU62HFINAL3_HEQU63HFINAL3_LEQU64HdelMequ65h;定義兩個延時變量寄存器delNequ66hdelKequ67h;定義一個內(nèi)層循環(huán)延時常數(shù)ORG0X0000STARTGOTOMAIN;INTERRUPT PROGRAM;ORG0X004ZHONGDUA

33、NNOP MOVWF WTEMP ;protect the original conditionMOVF STATUS,0MOVWF STATUSTEMP ;最外層3個if;CHECKTIMER1 ;檢查if(1=PIR1bits.TMR1IF);BTFSC PIR1,0 ;if(1=PIR1bits.TMR1IF);GOTO TIMER1IF ;1=PIR1bits.TMR1IF時進(jìn)入TIMER1IF,否則繼續(xù)檢查if(1=INTCONbits.INT0IF)CHECKINT0 ;檢查if(1=INTCONbits.INT0IF)BTFSC INTCON,1 ;if(1=INTCONbits

34、.INT0IF)GOTO INT0IF ;1=INTCONbits.INT0IF時進(jìn)入INT0IF,否則繼續(xù)檢查if(1=INTCONbits.TMR0IF)CHECKTIMER0 ;檢查if(1=INTCONbits.TMR0IF)BTFSC INTCON,2 ;if(1=INTCONbits.TMR0IF)GOTO TIMER0IF ;1=INTCONbits.TMR0IF時進(jìn)入TIMER0IF,否則if全部檢查完,恢復(fù)現(xiàn)場,結(jié)束中斷S1MOVF STATUSTEMP,0MOVWF STATUSMOVF WTEMP,0 ;恢復(fù)現(xiàn)場RETFIE ;結(jié)束中斷;TIMER1IF ;1=PIR1b

35、its.TMR1IF時進(jìn)入該語句塊;BCF PIR1,0 ;PIR1bits.TMR1IF=0;INCF TIMER1HIGHCOUNTER,1 ;TMR1HighCounter+;GOTO CHECKINT0 ;if(1=PIR1bits.TMR1IF)結(jié)束,繼續(xù)檢查if(1=INTCONbits.INT0IF)INT0IF ;1=INTCONbits.INT0IF時進(jìn)入該語句塊MOVLW 00H ;T1CON=0x00MOVWF T1CON BCF INTCON,INTF ;INTCONbits.INT0IF=0BCF INTCON,INTE ;INTCONbits.INT0IF=0MOV

36、LW 01H ;ReceiveOKFlag=1MOVWF RECEIVEOKFLAGGOTO CHECKTIMER0 ;if(1=INTCONbits.INT0IF)結(jié)束,繼續(xù)檢查if(1=INTCONbits.TMR0IF)TIMER0IF ;1=INTCONbits.TMR0IF時進(jìn)入該語句塊BCF INTCON,2 ;INTCONbits.TMR0IF=0BTFSS SECONDOKFLAG,0 ;if(0=SecondOKFlag)GOTO SECONDOK ;0=SecondOKFlag時進(jìn)入SECONDOKCHECKTIMERENABLE ;檢查if(1=TimerEnable)B

37、TFSC TIMERENABLE,0 ;if(1=TimerEnable)GOTO INTIMERENABLE ;1=TimerEnable時進(jìn)入INTIMERENABLES2MOVLW 009H ;賦初值,由于已經(jīng)存在一些語句,因此取TMR0=9略大于6MOVWF TMR0 BSF INTCON,T0IEGOTO S1 ;返回SECONDOK ;0=SecondOKFlag時進(jìn)入該語句塊INCF SECONDCOUNTER,1 ;SecondCounter+BTFSC SECONDCOUNTER,7 ;if(128=SecondCounter)GOTO INSECONDCOUNTER ;12

38、8=SecondCounter時進(jìn)入INSECONDCOUNTERGOTO CHECKTIMERENABLE ;否則直接去檢查if(1=TimerEnable)INSECONDCOUNTER ;128=SecondCounter時進(jìn)入該語句塊MOVLW 00H ;SecondCounter=0MOVWF SECONDCOUNTER MOVLW 01H ;SecondOKFlag=1MOVWF SECONDOKFLAGGOTO CHECKTIMERENABLE ;去檢查if(1=TimerEnable)INTIMERENABLE ;1=TimerEnable時進(jìn)入該語句塊DECF TIMERIN

39、TERVAL,1 ;TimerInterval-BTFSC STATUS,Z ;if(0=TimerInterval)GOTO INTIMERINTERVAL ;0=TimerInterval時進(jìn)入INTIMERINTERVALS3GOTO S2 ;返回INTIMERINTERVAL ;0=TimerInterval時進(jìn)入該語句塊MOVLW 00H ;TimerEnable=0MOVWF TIMERENABLEGOTO S3 ;40KHZ ULTROSOUND WAVE GENERATOR;ORG0X200GENERATOR BSF STATUS,RP0 ;選體1 MOVLW 00H ;設(shè)置C

40、口為輸出 MOVWF TRISC BCF STATUS,RP0 ;恢復(fù)體0 MOVLW 000H ;初始化計數(shù)器 MOVWF COUNT1 MOVLW b'00000010' ;負(fù)責(zé)改變輸出電平LOOP ;延時12us XORWF PORTC,1 NOP NOP NOP NOP NOP NOP NOP INCF COUNT1,1 BTFSS COUNT1,4 GOTO LOOPMOVLW 00HMOVWF COUNT1RETURN;1MS延時程序;ORG0X300GENERATOR1MSMOVLW 00HMOVWF DINGSHILOOP1MSNOPNOPNOPNOP;NOP;

41、NOP;NOP;NOPINCFSZ DINGSHIBTFSS DINGSHI,7GOTO LOOP1MSRETURN;MAIN FUNCTION;MAIN;INITIAL FUNCTION;BCFPIE1,TMR1IE;MOVLW001H;MOVWFPIE1;BSF STATUS,RP0MOVLW 00FHIORWF ADCON1,1MOVLW 00HMOVWF TRISDMOVWF TRISEMOVLW 0F9HMOVWF TRISCBCF OPTION_REG,7BCF STATUS,RP0 calllcdinitGENERATOR8MS BSF STATUS,RP0 ;選體1,配置OPT

42、ION_REG使分頻比為1:32 MOVLW 04H MOVWF OPTION_REGBCF OPTION_REG,T0CS BCF STATUS,RP0 ;恢復(fù)體0DELAYBCF INTCON,2 ;清除TMR0溢出標(biāo)志MOVLW 009H ;賦初值,由于已經(jīng)存在一些語句,因此取TMR0=9略大于6MOVWF TMR0BSF INTCON,T0IEBCF INTCON,T0IFBSF OPTION_REG,INTEDGBCF INTCON,INTFBCF INTCON,INTEMOVLW 0C0HIORWF INTCON,1;VARIABLE INITIALIZATION;MOVLW 00

43、HMOVWFSECONDOKFLAGMOVWFSECONDCOUNTERGOTO LOOP1SECONDFLAGIF ;if(1=SecondOKFlag)MOVLW000H ;TMR1HighCounter=0MOVWFTIMER1HIGHCOUNTERMOVWFTMR1H ;TMR1H=0MOVWFTMR1L ;TMR1L=0MOVLW001H ;T1CON=0x01MOVWFT1CONCALLGENERATOR ;Send40KHZWave調(diào)用發(fā)射程序,已編寫CALLGENERATOR1MS ;Delay1KTCYx(1*DLY_1MS),調(diào)用延時1MS程序,已編寫B(tài)CFINTCON,I

44、NTF ;INTCONbits.INT0IF=0BSFINTCON,INTE ;INTCONbits.INT0IE=0MOVLW000H ;ReceiveOKFlag=0MOVWFRECEIVEOKFLAG MOVLW0FFHMOVWFTIMERINTERVALMOVLW001HMOVWFTIMERENABLELOOP_1BTFSSRECEIVEOKFLAG,0 ;等待接收GOTOLOOP_2GOTOCHECKTIMERLOOP_2BTFSCTIMERENABLE,0GOTOLOOP_1GOTOCHECKTIMER;*if(1 = TimerEnable)*CHECKTIMER;MOVLW00

45、1H;MOVWFTIMERENABLEBTFSCTIMERENABLE,0GOTOTIMERENABLEIFGOTOTIMERENABLEELSETIMERENABLEIF;*計算距離*;MOVLW000H ;T1CON=0x01;MOVWFT1CON;MOVLW000HMOVWFTIMERENABLEMOVFTMR1H,0;MOVLW030HMOVWFBCCBHIMOVFTMR1L,0;MOVLW039HMOVWFBCCBLOMOVLW064HMOVWFBCCALOMOVLW000HMOVWFBCCAHICALLD_div ;先對us除以100MOVFBCCBLO,0MOVWFACCBLOMOVFBCCBHI,0MOVWFACCBHIMOVLW0BFHMOVWFACCALOMOVLW000HMOVWFACCAHICALLD_mpy;算出距離,單位為1e04mMOVFACCCLO,0MOVWFBCCBLOMOVFACCCHI,0MOVWFBCCBHIMOVLW00AHMOVWFBCCALOMOVLW000HMOVWFBCCAHICALLD_div;對距離除以100,單位變?yōu)閏m;*數(shù)碼管顯示*;數(shù)碼管代碼GOTODISPLAYBTOBCDCLRFSIGN1LOOP1YBCFSTATUS,CMOVLW.16MOVWFCOUNT2CLRFYCCCHICLRF

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論