㈠ 51單片機控制的超聲波測距儀程序
希望對你有幫助
//超聲波模塊顯示程序
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //產生脈沖引腳
sbit Rx = P3^2; //回波引腳
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
i=0;
flag=0;
Tx=0; //首先拉低脈沖輸入引腳
TMOD=0x11; //定時器0,定時器1,16位工作方式
TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0
while(1) //程序循環
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //產生一個20us的脈沖,在Tx引腳
while(Rx==0); //等待Rx回波引腳變高電平
succeed_flag=0; //清測量成功標志
EX0=1; //打開外部中斷
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //
TR1=1; //啟動定時器1
EA=1;
while(TH1 < 30);//等待測量的結果,周期65.535毫秒(可用中斷實現)
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷
if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合並成為16位結果數據
distance_data*=12; //因為定時器默認為12分頻
distance_data/=58; //微秒的單位除以58等於厘米
} //為什麼除以58等於厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //沒有回波則清零
}
distance[i]=distance_data; //將測量結果的數據放入緩沖區
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
pai_xu();
distance_data=distance[1];
a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
INTO_() interrupt 0 // 外部中斷是0號
{
outcomeH =TH1; //取出定時器的值
outcomeL =TL1; //取出定時器的值
succeed_flag=1; //至成功測量的標志
EX0=0; //關閉外部中斷
}
//****************************************************************
//定時器0中斷,用做顯示
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0=0xfd; //寫入定時器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=;P2=0xdf;flag=0;break;
}
}
//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算
ge_data=temp_data;
_data=SEG7[_data];
shi_data=SEG7[shi_data]&0x7f;
ge_data =SEG7[ge_data];
EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}
㈡ 求個51單片機超聲波測距(距離+報警)的c程序
//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共陽數碼管引腳
//Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //為STC單片機定義,系統時鍾分頻
//為STC單片機的IO口設置地址定義
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //產生脈沖引腳
sbit Echo = P3^2; //回波引腳
sbit test = P1^1; //測試用引腳
uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系統時鍾為1/8晶振(pdf-45頁)
P0M1 = 0; //將io口設置為推挽輸出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test=0;
Trig=0; //首先拉低脈沖輸入引腳
TMOD=0x11; //定時器0,定時器1,16位工作方式
TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
//ET1=1; //打開定時器1中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0
while(1) //程序循環
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //產生一個20us的脈沖,在Trig引腳
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測量成功標志
EX0=1; //打開外部中斷
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //
TR1=1; //啟動定時器1
EA=1;
while(TH1 < 30);//等待測量的結果,周期65.535毫秒(可用中斷實現)
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷
if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合並成為16位結果數據
distance_data*=12; //因為定時器默認為12分頻
distance_data/=58; //微秒的單位除以58等於厘米
} //為什麼除以58等於厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //沒有回波則清零
test= !test; //測試燈變化
}
/// distance[i]=distance_data; //將測量結果的數據放入緩沖區
/// i++;
/// if(i==3)
/// {
/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
/// pai_xu();
/// distance_data=distance[1];
a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
/// i=0;
/// }
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
INTO_() interrupt 0 // 外部中斷是0號
{
outcomeH =TH1; //取出定時器的值
outcomeL =TL1; //取出定時器的值
succeed_flag=1; //至成功測量的標志
EX0=0; //關閉外部中斷
}
//****************************************************************
//定時器0中斷,用做顯示
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0=0xfd; //寫入定時器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=;P2=0xfb;flag=0;break;
}
}
//*****************************************************************
/*
//定時器1中斷,用做超聲波測距計時
timer1() interrupt 3 // 定時器0中斷是1號
{
TH1=0;
TL1=0;
}
*/
//******************************************************************
//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算
ge_data=temp_data;
_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];
EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ ucharbt ;
for(bt=0;bt<100;bt++);
}
/*
void pai_xu()
{ uint t;
if(distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交換值
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交換值
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交換值
}
*/
㈢ 求C51單片機程序,關於超聲波測距儀
看下這個
原文http://www.elecfans.com/article/87/82/2009/20091219139294.html
基於單片機的倒車防撞預警系統設計和實現
0 引 言
汽車倒車防撞預警系統即是俗稱的倒車雷達,是汽車泊車輔助裝置。在汽車倒車時,倒車雷達採用超聲波測距原理探測汽車尾部離障礙物的距離,當汽車尾部離障礙物的距離達到探測范圍時,倒車雷達通過數碼管實時動態顯示距離。當汽車尾部離障礙物的距離達到設定的安全警告值時,倒車雷達發出報警聲,以警示駕駛員,輔助駕駛員安全倒車。現在生產的中高檔小轎車大多數都配置有倒車雷達,而出於節省成本等方面的考慮,經濟型小轎車、大客車等其他車輛都沒有配置倒車雷達。有市場需求的產品,必然會帶動產品的開發設計。倒車雷達電路種類較多,本文介紹基於單片機控制的倒車雷達系統,該系統採用通用型單片機作為控制電路,方便系統功能擴展。系統電路主要採用集成器件構成,外圍元件少,電路簡潔、調試方便、成本低,利於商品化生產。
1 系統組成及工作原理
倒車防撞預警系統由四路收發一體封閉(防水)型超聲波感測器及其超聲波發射與回波接收電路、超聲波電信號放大電路、單片機控制電路、LED數碼管顯示電路和蜂鳴器聲音報警電路組成。系統組成框圖如圖1所示。
當汽車倒車時由倒車換擋裝置自動接通系統電源,系統上電復位,進入工作狀態。單片機編程產生一串40 kHz的矩形脈沖電壓,經四選一模擬開關加到超聲波發射與回波接收電路,經放大驅動超聲波感測器發射出超聲波,同時單片機開始計時。發射出的超聲波碰到障礙物後形成反射波,部分反射波返回作用於超聲波感測器,經超聲波感測器的聲/電轉換,變成微弱的電信號,該微弱的電信號經放大、整形產生負跳變電壓,向單片機發出中斷申請。單片機收到中斷申請的信號後,立即響應中斷,執行外部中斷服務程序,停止計時,得到超聲波發送和返回的時間T,計算出發射點離障礙物的距離S,即:S=(C·T)/2。C是超聲波在空氣中的傳播速度,在常溫25℃時,C約為346 m/s。若發射出的超聲波在測距范圍內未遇到障礙物,直到單片機定時中斷產生,執行定時中斷服務程序,選擇下一路,依次按後左路、後左中路、後右中路、後右路的順序繼續發射和接收超聲波,並經過計算處理。四路探測處理完畢,選擇四路中測出的最小距離值通過LED數碼管顯示出來。當最小距離值小於預先設定的報警距離時,單片機接通蜂鳴器的電源,蜂鳴器發出報警聲。若四路探測無回波中斷申請,則顯示「-.--」,表明在安全距離內沒有障礙物,再繼續下一輪的循環探測處理。
2 系統硬體電路的設計
2.1 超聲波發射與回波接收電路
超聲波發射與回波接收電路的主要作用是提高驅動超聲波感測器的脈沖電壓幅值,有效地進行電/聲轉換,增大超聲波的發射距離,並通過收發一體的超聲波感測器將返回的超聲波轉變成微弱的電信號。超聲波發射與回波接收電路如圖2所示(畫出一路,其他三路與該路一樣)。
EFR40RS是收發一體封閉(防水)型超聲波感測器,其中心頻率f0=(40.0±1.0)kHz,-3 dB帶寬1 kHz。驅動電壓峰一峰值要求60~150 V。CD4052是雙路四選一模擬開關,單片機的P3.4和P3.5埠輸出選通信號,單片機的P3.3埠輸出一串40 kHz的脈沖電壓,通過CD4052的X路加到選通的開關三極體Q1基極,經脈沖變壓器T1升壓至100 VP-P左右,驅動超聲波感測器EFR40RS發射超聲波。發射時的脈沖電壓幅值大小直接影響測距的遠近,應採用超聲波專用的脈沖變壓器。反射回的超聲波經原收發一體封閉型超聲波感測器變成毫伏級的一串脈沖電信號。由於回波電信號的幅值小,VD3和VD4二極體截止,該信號不會通過T1變壓器副邊線圈形成短路。VD1和VD2二極體也截止,所以回波電信號經R1和C1,通過CD4052的Y路送到超聲波電信號放大與整形電路。R1和VD1,VD2組成雙向限幅電路,避免發射時的大信號造成超聲波放大與整形電路阻塞,甚至損壞電路。
2.2 超聲波電信號放大電路
超聲波電信號放大電路採用集成電路CX20106A構成。CX20106A是日本索尼公司生產的紅外遙控信號接收集成電路。通過外部所接電阻,將其內部帶通濾波電路的中心頻率f0設置為40 kHz,就可以接收放大超聲波電信號,並整形輸出負脈沖電壓。
應用電路如圖3所示。1腳是超聲波電信號輸入端,2腳與地之間連接RC串聯網路,是內部前置放大電路負反饋網路的組成部分。電阻R5的數值確定前置放大電路的增益。R5電阻值減小,負反饋減弱,放大倍數增大;反之,則放大倍數減小。3腳與地之間連接檢波電容C3,適當改變電容C3的大小,可以改變超聲波電信號放大和整形電路的靈敏度和抗干擾能力。C3電容量大,靈敏度低,抗干擾能力強;C3容量小,靈敏度高,抗干擾能力弱,易造成誤動作。5腳與電源間接入一個電阻,用以設置內部帶通濾波電路的中心頻率f0。
當R6=200 kΩ時,f0=40 kHz。6腳與地之間接一個積分電容,標准值為330 pF。如果該電容值取得太大,會使探測距離變短。7腳是電路集電極開路輸出端,R7是該引腳的上拉電阻。集成電路CX20106A無信號輸入時,7腳輸出高電平,當輸入的超聲波電信號經放大、整形後,7腳輸出一個負脈沖電壓。
2.3 單片機控制電路和顯示、報警電路
電路如圖4所示。由於系統用到單片機的輸入/輸出埠不多,在不考慮功能擴展時,從功能夠用和低成本的角度考慮,採用AT89C2051單片機作為控制電路的核心器件。AT89C2051單片機共有20個引腳,其中有15個I/O埠(P3.6無引出腳)。兩個16位定時器/計數器,其體積小、價格低。採用12 MHz高精度的晶振,以獲得較穩定的時鍾頻率,減小測量誤差。單片機的P3.3埠周期性的輸出一串40 kHz的矩形脈沖,通過雙路四選一模擬開關CD4052周期性地加到四路超聲波發射與回波接收電路。單片機的P3.4和P3.5埠輸出雙路四選一模擬開關CD4052的選通信號。單片機的P3.2埠為外部中斷0中斷申請信號輸入端。三位LED數碼管採用動態掃描顯示。U4的小數點常亮,U4的單位為m,U5的單位為dm,U6的單位為cm。採用有源蜂鳴器作為報警發音器件,一是器件成本低,二是便於動態掃描顯示的軟體編程。
3 系統軟體的設計
系統軟體採用模塊化設計,方便擴展移植。採用匯編語言編程。主要有主程序、T0中斷服務程序、外部中斷0服務程序、超聲波發生子程序。
3.1 主程序
本系統有四路測距通道,採用分時工作,按後左一後左中一後右中一後右順序循環測距。每一路發射超聲波後的等待外部中斷時間應大於超聲波在最大有效探測距離內往返時間。所以按最大有效探測距離可以估算出最短的循環間隔時間。因為超聲波在空氣中傳播能量會不斷衰減,所以超聲波測距存在最大有效探測距離。這最大有效探測距離與多種因數有關:
與超聲波感測器性能的好壞、與驅動超聲波感測器的脈沖電壓幅值(功率)的大小、障礙物大小和形狀、障礙物吸波特性以及反射波與入射波之間的夾角、與超聲波放大和整形電路的靈敏度等有關。設定最大有效探測距離為8 m(收發一體封閉型超聲波感測器比較難達到,實際上也沒有必要探測很遠的障礙物,只是設計留有裕量。由於顯示位數有限,也必須對最大探測距離做限制),則循環工作的間隔時間Tm=2S/C=2×8/346A46 ms,加上避免接收超聲波感測器余振的延時和程序執行時間,留足裕量,設定Tm△56 ms。
主程序流程圖如圖5所示。首先是對系統初始化。埠p1.0、P3.3置0;設置堆棧,中斷允許總控制位EA允許中斷(EA=1);允許外部中斷0中斷(EX0=1),採用邊沿觸發方式(IT0=1);設置定時器T0允許中斷(ET0=1),以16位工作方式定時約56 ms;設置定時器T1以16位工作方式定時/計數,計數初值0000H,然後啟動T0定時。設置顯示數據初值為三位BCD碼999(cm),對應字形段碼顯示「---」。四路探測處理完畢後,將四組數據中的最小值送入顯示緩沖區,通過LED數碼管顯示。同時該值與設定的100 cm值比較,若四組數據中的最小值小於100 cm,P3.7埠置0,Q2三極體導通,有源蜂鳴器得電發出報警聲。
由於單片機採用12 MHz的晶振,1個機器周期為1μs,所以計數器每計一個數就是1μs,定時器T1工作模式設置為16位定時/計數器模式,則其最大定時65.536 ms。由於定時器T0每56 ms產生中斷,執行T0中斷服務程序時停止T1計時,所以T1計時不會產生溢出中斷。一輪四路探測處理完畢所用時間大約是56 ms×4=224 ms,用時很短,而倒車速度又比較慢,所以可以做到實時動態顯示。
3.2 T0中斷服務程序
T0中斷服務程序流程圖如圖6所示。每隔56 ms分別按後左→後左中→後右中→後右順序選通下一路超聲波發射與回波接收電路,調用超聲波發生子程序,送出16個40 kHz的超聲波脈沖電壓,定時器T1開始計時,定時器T0開始定時56 ms,使每路工作56 ms。
為了避免接收到超聲波感測器余振的直射波產生的中斷申請,延時2.8 ms後,才允許外部中斷0中斷,等待接收返回的超聲波信號。所以,最小探測距離(盲區)Smin=Ct/2=346×0.002 8/2△0.48 m。四路探測處理完畢,將四路中最小值送入顯示緩沖區。若在四路探測中有些路在有效探測范圍內發射的超聲波未遇障礙物,無返回波,外部中斷0不產生中斷申請信號,或者是進入探測盲區,外部中斷0產生的中斷申請不被受理,則定時器T1計時到定時器T0產生中斷,在T0中斷服務程序中,用三位BCD碼999(三位十進制數最大值999 cm)置夠四組數據。若顯示緩沖區的四組數據都是999時,則對應字形段碼顯示「---」。倒車伊始,LED數碼顯示器就顯示「-.--」,表明在安全距離內沒有障礙物;若發出報警聲後,又顯示「-.--」,表明進入了探測盲區。
3.3 外部中斷0服務程序
外部中斷O服務程序流程圖如圖7所示。單片機一旦接收到返回超聲波信號(即INT0引腳由高電平跳變為低電平),立即進入外部中斷0服務程序。首先停止定時器T1計時,禁止外部中斷0中斷。然後將定時器T1中的數N,也即將超聲波往返所用的時間N(單位:μs),按式S=CT/2=(346 x N×10-6)/2=173×N÷10 000計算,即得被測物的距離(單位:cm),將計算結果以百位、十位、個位BCD碼方式送入比較大小的緩沖區,以備比較大小使用。然後等待定時器T0定時56 ms中斷的產生,繼續下一路的探測處理。
3.4 超聲波發生子程序
超聲波發生子程序通過P3.3埠發送16個周期是25μs(即頻率40 kHz,1個周期內高電平持續13μs、低電平持續12 μs)的矩形脈沖電壓。脈沖串個數在10~20個比較合適。脈沖個數太少,發射強度小,探測距離短;脈沖個數太多,發射持續時間長,在離障礙物距離近時,脈沖串尚未發射完畢,先發射出去的脈沖產生的回波就到達接收端,影響測距結果,造成測距盲區增大。
4 實現應用分析
本系統在實驗室條件下進行了可行性的研究設計,要實際應用中就必須考慮測量精度和工作穩定性的問題。因此,本系統可採取幾項措施來提高測量精度和工作穩定性。
(1)超聲波的傳播速度與溫度有關。為了適應不同環境溫度下的測距需要,提高測量精度,硬體電路上可增加檢測車外環境溫度的環節。單片機根據實測的溫度值,再計算確定超聲波的傳播速度,即C=331.4+0.6lt。t是環境溫度。或者在不增加硬體成本情況下,可考慮通過實驗數據分析,找到測量值與實際值偏差特點和規律,通過軟體編程對測量數據進行校正處理。
(2)軟體設計中採用數字濾波中的算術平均濾波程序對每個測距點進行連續多次測量,取平均值作為該測距點的測量數據,以提高數據采樣的可靠性。要盡量減小探測盲區,所設定的延時時間可根據實際所用超聲波感測器余振時間而定,可在實際調試中確定最小延時時間。
(3)倒車雷達安裝在車上,倒車雷達的工作環境非常惡劣,汽車倒車工作時,高壓點火產生很強的電磁輻射,會影響電路正常工作。所以在硬體及軟體方面要考慮採取抗干擾措施,提高系統工作的可靠性。如用金屬殼屏蔽電路,採用屏蔽線連接超聲波感測器;在滿足測量距離的情況下,可適當調大超聲波電信號放大和整形電路中檢波電容C3的容量。硬體上可增加「看門狗」電路,軟體設計添加指令冗餘、軟體陷阱、或設置軟體「看門狗」,防止程序「跑飛」或者進入死循環。對於駕駛員來說,倒車時主要關心的是車後方有無障礙物、以及障礙物離車大約有多遠等問題。由於車子制動時存在慣性,倒車遇到障礙物時,駕駛員總要提前制動。考慮性價比,倒車雷達測量精度不必很高。但從倒車安全考慮,此時的測量顯示值寧大勿小。
5 結 語
本系統充分利用了單片機的內部資源,用軟體編程產生超聲波矩形脈沖,代替硬體的超聲波發生電路,節省了硬體成本。採用一塊集成器件實現超聲波接收放大和整形,避免了採用多級集成運放組成高增益放大電路易產生自激等問題。實驗表明設計可行。在不增加硬體成本時,通過完善軟體設計,可提高系統測量精度和工作的可靠性,能夠滿足使用要求。在考慮功能擴展時,可以採用帶「看門狗」的AT89S52單片機,以增加擴展埠。在超聲波測距的基礎上,如可增加防盜報警功能、車載蓄電池電壓檢測功能等,若增加微型攝像頭和小型液晶顯示器,便成為可直接觀察車後方的可視倒車雷達。本系統實用性強,性價比高。
㈣ 用51單片機實現超聲波測距怎樣才可以測到4m
輸出用並聯門電路驅動,如CD4069,以增大輸出電流。
接收採用低雜訊運放,如NE5532,放大1000倍。
採用接收,發射分開的探頭
超聲波測距系統的軟體設計,由於超聲發射感測器與超聲接收感測器相隔很近,當發射超聲波時,接收感測器會收到很強的干擾信號。為防止系統的誤測,在軟體上採用延遲接收技術,來提高系統的抗干擾能力。一旦按下起始鍵,即發送發射超聲波的指令,同時單片機控制系統開始執行程序,完成對溫度的采樣、濾波,然後獲得發送、接收超聲波的時間間隔,最後計算出距離值。
(1) 接收放大電路,可加入帶通濾波或鎖相放大(LM567)以盡可能減少干擾信號引起誤觸發,另外為防止發射信號直接進入接收端所以設置一定的延時。鎖相應用電路,調整在40KHZ上,但要考慮加入後對接收處理的延時,用軟體調整。
另一方面可採用自動增益補償技術,隨著時間的增加, AGC的放大倍數呈指數規律變化,從而保證了超聲波接收器波形的幅值不隨測量距離的變化而大幅變化,使得每次在同一個波頭觸發計時電路,提高了系統測量准確度。電路可以採用如下圖所示或者採用單片AD603實現,在這里不具體討論。
(2)發射驅動電路,為放大驅動脈沖可以再加入一級三極體放大電路,三極體要選用高頻的如9018以減少放大後波形的失真;另一方面還可以根據超聲波發生器的特點合理設計阻抗匹配,功放效率和機電轉換效率;為此可採用脈沖變壓器,脈沖變壓器是超聲換能器驅動電路中最重要的器件,它的用途是升高脈沖電壓信號,並使功率放大器的輸出阻抗與換能器的負載阻抗匹配。一般脈沖變壓器以變壓器的功率、原副邊電壓信號的幅值確定變壓器的尺寸和變比;而超聲換能器驅動用變壓器則主要以功率和原副邊電感及阻抗匹配確定變壓器的尺寸和變比。缺點是製作和測量都比較麻煩。在大量程應用場合還可以應用電容瞬間放電或電感瞬間放電產生高壓激勵脈沖。
(3)其它可改善的地方,可採用超聲波測距專用晶元SB5027;也可以採用LM1812N單片超聲波收發集成電路。
㈤ 51單片機超聲波測距儀 流程圖 及 程序 急求50分
#include<at89x52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define nop _nop_()
uchar code WE0[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//0x40-不帶點
//unsigned char code WE1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xf0,0xef,0x80}; //0-9 帶點
uchar code W[]={0xfe,0xfd,0xfb,0xf7} ;
unsigned char temp[3];
sbit RX=P3^4; //接受端,ECHO
sbit TX=P3^5; //控制端,TRIG
sbit wei=P2^7;
sbit an=P2^6;
bit flag=0;
uint time=0;
uint s=0;
void delay(int xms)//延時大概x毫秒
{
int i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void start() //給至少10us的高電平,啟動模塊
{
TX=1;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
TX=0;
}
uchar count()
{
time=TH0*256+TL0;
TH0=0;
TL0=0; //清零
s=(time*1.7)/100;//厘米
return s;
}
void dispros()//數據分割
{
temp[0]=s/100%10;//百位
temp[1]=s/10%10; //十位
temp[2]=s%10; //個位
}
void display() //顯示函數
{
if(s>=500||s<=2) //進入盲區,溢?
{
uchar i;
s=0;
TH0=0;
TL0=0; //清零
P0=0x40;
an=1;
an=0;
for(i=0;i<3;i++)
{
P0=W[i];
wei=1;
wei=0;
}
}
else //正常顯示
{
wei=1;
P0=0xfe;
wei=0;
an=1;
P0= WE0[temp[0]];
delay(3);
an=0;
wei=1;
P0=0xfd;
wei=0;
an=1;
P0= WE0[temp[1]];
delay(2);
an=0;
wei=1;
P0=0xfb;
wei=0;
an=1;
P0= WE0[temp[2]];
delay(1);
}
}
void main()
{
TMOD=0X01; //定時器工作方式0
TH0=0;
TL0=0;
EA=1; //開總中斷
ET0=1;//開定時器中斷
while(1)
{
start();//啟動模塊
while(!RX); //當RX為零時等待
TR0=1; //啟動計數
while(RX); //當RX為1時計數並等待
TR0=0; //關閉計數器
count(); //計數
dispros(); //處理,分割數據
display(); //顯示
delay(1);
}
}