摘要:本文介紹了AT89C2051單片機的性能和特點,并在分析了超聲波測距原理的基本上,指出了設計測距儀的思路和所需考慮的問題,給出了實現超聲波測距方案的軟、硬件設計系統框圖。該設計系統經校正后,其測量精度可達0.1米。
關鍵詞:超聲波 換能器 測距 AT89C2051
超聲波測距主要應用于倒車雷達、建筑施工工地以及一些工業現場,例如:液位、井深、管道長度等場合。目前國內一般使用專用集成電路設計超聲波測距儀,但是專用集成電路的成本很高,并且沒有顯示,操作使用很不方便。本文介紹一種以AT89C2051或GSM97C2051單片機為核心的低成本、高精度、微型化數字顯示超聲波測距儀的硬件電路和軟件設計方法。實際使用證明該儀器工作穩定,性能良好。
1 超聲波測距原理
超聲波測距是通過不斷檢測超聲波發射后遇到障礙物所反射的回波,從而測出發射和接收回波的時間差t,然后求出距離S=Ct/2,式中的C為超聲波波速。
由于超聲波也是一種聲波,其聲速C與溫度有關,表1列出了幾種不同溫度下的聲速。在使用時,如果溫度變化不大,則可認為聲速是基本不變的。如果測距精度要求很高,則應通過溫度補償的方法加以校正。聲速確定后,只要測得超聲波往返的時間,即可求得距離。這就是超聲波測距儀的機理。其系統框圖如圖1所示。
2 AT89C2051的功能特點
AT89C2051是一個2k字節可編程EPROM的高性能微控制器。它與工業標準MCS-51的指令和引腳兼容,因而是一種功能強大的微控制器,它對很多嵌入式控制應用提供了一個高度靈活有效的解決方案。AT89C2051有以下特點:2k字節EPROM、128字節RAM、15根I/O線、2 個16位定時/計數器、5個向量二級中斷結構、1個全雙向的串行口、并且內含精密模擬比較器和片內振蕩器,具有4.25V至5.5V的電壓工作范圍和12MHz/24MHz工作頻率,同時還具有加密陣列的二級程序存儲器加鎖、掉電和時鐘電路等。此外,AT89C2051還支持二種軟件可選的電源節電方式。空閑時,CPU停止,而讓RAM、定時/計數器、串行口和中斷系統繼續工作。可掉電保存RAM的內容,但可使振蕩器停振以禁止芯片所有的其它功能直到下一次硬件復位。
AT89C2051有2個16位計時/計數器寄存器Timer0t Timer1。作為一個定時器,每個機器周期寄存器增加1,這樣寄存器即可計數機器周期。因為一個機器周期有12個振蕩器周期,所以計數率是振蕩器頻率的1/12。作為一個計數器,該寄存器在相應的外部輸入腳P3.4/T0和P3.5/T1上出現從1至0的變化時增1。由于需要二個機器周期來辨認一次1到0的變化,所以最大的計數率是振蕩器頻率的1/24,可以對外部的輸入端P3.2/INT0和P3.3/INT1編程,便于測量脈沖寬度的門。
表1 聲速與溫度關系表
| 溫度(℃) | -30 | -20 | -10 | 0 | 10 | 20 | 30 | 100 |
| 聲速(米/稱) | 313 | 319 | 325 | 323 | 338 | 344 | 349 | 386 |
充分利用AT89C2051的片內資源,即可在很少外圍電路的情況下構成功能完善的超聲波測距系統。
3 系統硬件電路設計
超聲波測距儀的硬件電路如圖2所示。
AT89C2051通過外部引腳P1.6輸出脈沖寬度為250μs,載波為40kHz的10個脈沖的脈沖群,以推挽形式加到變壓器的初級,經升壓變換推動超聲波換能器發射出去。在發射的同時,P1.7輸出一個高電平啟動,給電容C4充電。發射結束時高電平翻轉為低電平,C4開始對R2、R3組成的分壓器放電并輸出到比較器的負端。超聲波接收換能器將接收到的障礙物反射的超聲波送到放大器進行放大,這是一個高增益、低噪聲放大器,在對放大后的信號進行檢波后將檢測回波送到比較器的正輸入端。發射時P1.7輸出的電平可以抑制比較器的翻轉,這樣就可以抑制發射器發射的超聲波直接輻射到接收器而導致錯誤檢測。
圖3是超聲波測距原理的波形圖,從圖中可以看到,測出回波和發射脈沖之間的時間間隔,利用S=Ct/2就可以算出距離,再在LCD上顯示出來。當然還可以設置若干個鍵,以用來控制電路的工作狀態。限制系統的最大可測距離存在四個因素:超聲波的幅度,反射而的質地,反射而和入射聲波之間的夾角以及接收換能器的靈敏度。接收換能器對聲波脈沖的直接接收能力將決定最小的可測距離。
4 系統軟件設計
AT89C2051單片機和其開發應用系統具有語言簡潔、可移植性好、表達能力強、表達方式靈活、可進行結構化設計、可以直接控制計算機硬件、生成代碼質量高、使用方便等諸多優點。超聲波測距儀就是用AT89C51單片機開發設計的。它采用模塊化設計,由主程序、發射子程序、查蟓接收子程序、定時子程序、顯示子程序等模塊組成。
圖4和圖5分別為主程序和測量子程序的框圖。該系統的主程序處于鍵控循環工作方式,當按下測量鍵時,主程序開始調用發射子程序、查詢接收子程序、定時子程序,并把測量結果用顯示子程序在液晶屏上顯示出來。
必須指出的是,由于液晶要使用同一P3口,所以必須全部使用位操作,否則將導致LCD不能正常顯示。另外,在系統還可以加入溫度傳感器來監測環境溫度,把表1所列的數據做到程序中可進行溫度被償。為了增強系統的可靠性,應在軟硬件上采用一些特殊措施。限于篇幅,下面僅給出部分程序,感興趣者可與作者聯系。
# pragma DB OE CD OT(5,SPEED) ROM(LARGE)IV
/*連接所需要的庫*/
#include<reg52.h>
#include<absacc.h>
#include<stdio.h>
/*定義數據類型*/
typedef unsingned char byte;
typedef unsigned int word
#define uchar unsigned char
#define unint unsigned int
#define ulong unsigned long
/*定義系統常數*/
#define TRUE 1
#define FALSE 0
#define C=340 /*聲速*/
/*定義功能位*/
sbit bflag=ACC7;
sbit VOLCK=P1^5;
sbit MING=P3^5;
sbit QUIET=P1^3;
sbit BACK=P1^2;
/*定義顯示緩沖區*/
uchar idata ON[16]={’,’L’,’E’,’N’,’G’,’T’,’H’,’=’,’8’,’.’,’8’8’,’m’,’’,’’,’’};
/*主程序用延時子程序*/
woid main-delay(void)
{
register i;
TRO=1;
for(i=0;i<15;i++)
{
TH0=0;
TL0=0;
Do{}while(!TF0);
TF0=0;
}
TR0=0;
}
*/通用延時子程序*/
void delay(void)
{
unint i;
for(i=0;i<200;i++){;}
}
/*鍵盤延時子程序*/
void key-delay(void)
{
unint i;
for(i=0;i<200;i++){;}
}
/*初始化程序*/
void start_main()
{
tegister i;
uchar a[16]={’’,’L’,’E’,’N’,’G’,’T’,’H’,’=,’8’,’.’,’8’,’8’,’m’,’’,’’,’’};
for(i=0;<16;i++)
{ON[i]=a[i];}
nitlcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
/*主程序*/
void main()
{
register s,keycode;
long idata t;
start-main();/*初始化*/
main-delay();/*延時*/;
if(keycoed= =true)
{
keycode=key-scan-wait();
/*判斷是否有測量鍵按下*/
t=measure();*/測量*/
S=0.5*t*C;*/換算*/
Decode-bcd(s.0x09);
/*把測量結果置換入顯示緩沖區*/
init-lcd();/*初始化液晶*/
display(ON);/*更新顯示*/
}
}
5 結束語
雖然用一個單獨計時器電路也可以測量超聲波的傳輸時間,但利用AT89C2051單片機可以簡化設計,便于操作和直觀讀數。該系統經實際測試證明,可以滿足大多數場合的測距要求。