導航:首頁 > 操作系統 > 單片機測距演算法

單片機測距演算法

發布時間:2023-01-01 18:14:35

1. 單片機超聲波測距系統原理

超聲波測距學習板,可應用於汽車倒車、建築施工工地以及一些工業現場的位置監控,也可用於如液位、井深、管道長度的測量等場合。要求測量范圍在0.27~4.00m,測量精度1cm,測量時與被測物體無直接接觸,能夠清晰穩定地顯示測量結果。超聲波測距原理
超聲波發生器內部結構有兩個壓電晶片和一個共振板。當它的兩極外加脈沖信號,其頻率等於壓電晶片的固有振盪頻時,壓電晶片將會發生共振,並帶動共振板振動,便產生超聲波。反之,如果兩電極間未外加電壓,當共振板接收到超聲波本時,將壓迫壓電晶片作振動,將機械能轉換為電信號,就成為超聲波接收器。在超聲探測電路中,發射端得到輸出脈沖為一系列方波,其寬度為發射超聲的時間間隔,被測物距離越大,脈沖寬度越大,輸出脈沖個數與被測距離成正比。超聲測距大致有以下方法:① 取輸出脈沖的平均值電壓,該電壓 (其幅值基本固定 )與距離成正比,測量電壓即可測得距離;② 測量輸出脈沖的寬度,即發射超聲波與接收超聲波的時間間隔 t,故被測距離為 S=1/2vt。本測量電路採用第二種方案。由於超 聲波 的聲速 與溫度有關,如果溫度變化不大,則可認為聲速基本不變 。如果測距精度要求很高,則應通 過溫度補償 的方法加以校正。超聲波測距適用於高精度的中長距離測量。因為超聲波在標准空氣中的傳播速度為331.45米/秒,由單片機負責計時,單片機使用12.0M晶振,所以此系統的測量精度理論上可以達到毫米級。
採用AT89C51或AT89S51單片機,晶振:12M,單片機用P1.0口輸出超聲波換能器所需的40K方波信號,利用外中斷0口監測超聲波接收電路輸出的返回信號,顯示電路採用簡單的4位共陽LED數碼管,斷碼用74LS244,位碼用8550驅動.
超聲波測距的演算法設計: 超聲波在空氣中傳播速度為每秒鍾340米(15℃時)。X2是聲波返回的時刻,X1是聲波發聲的時刻,X2-X1得出的是一個時間差的絕對值,假定X2-X1=0.03S,則有340m×0.03S=10.2m。由於在這10.2m的時間里,超聲波發出到遇到返射物返回的距離。
硬體部分採用AT89C51或AT89S51單片機,晶振:12M,單片機用P1.0口輸出超聲波換能器所需的40K方波信號,利用外中斷0口監測超聲波接收電路輸出的返回信號,顯示電路採用簡單的4位共陽LED數碼管,斷碼用74LS244,位碼用8550驅動. 主要由單片機系統及顯示電路、超聲波發射電路和超聲波檢測接收電路三部分組成。採用AT89S51來實現對CX20106A紅外接收晶元和TCT40-10系列超聲波轉換模塊的控制。單片機通過P1.0引腳經反相器來控制超聲波的發送,然後單片機不停的檢測INT0引腳,當INT0引腳的電平由高電平變為低電平時就認為超聲波已經返回。計數器所計的數據就是超聲波所經歷的時間,通過換算就可以得到感測器與障礙物之間的距離。

1.單片機系統及顯示電路
單片機採用89S51或其兼容系列。採用12MHz高精度的晶振,以獲得較穩定的時鍾頻率,減小測量誤差。
單片機用P1.0埠輸出超聲波轉化器所需的40KHz方波信號,利用外中斷0口檢測超聲波接受電路輸出的返回信號。顯示電路採用簡單實用的4位共陽LED數碼管,段碼用74LS244驅動,位碼用PNP三極體驅動。單片機系統及顯示電路如下圖所示.
使用CX20106A集成電路對接收探頭受到的信號進行放大、濾波。其總放大增益80db。以下是CX20106A的引腳注釋。

1腳:超聲信號輸入端,該腳的輸入阻抗約為40kΩ。
2腳:該腳與地之間連接RC串聯網路,它們是負反饋串聯網路的一個組成部分,改變它們的數值能改變前置放大器的增益和頻率特性。增大電阻R1或減小C1,將使負反饋量增大,放大倍數下降,反之則放大倍數增大。但C1的改變會影響到頻率特性,一般在實際使用中不必改動,推薦選用參數為R1=4.7Ω,C1=1μF。
3腳:該腳與地之間連接檢波電容,電容量大為平均值檢波,瞬間相應靈敏度低;若容量小,則為峰值檢波,瞬間相應靈敏度高,但檢波輸出的脈沖寬度變動大,易造成誤動作,推薦參數為3.3μf。
4腳:接地端。
5腳:該腳與電源間接入一個電阻,用以設置帶通濾波器的中心頻率f0,阻值越大,中心頻率越低。例如,取R=200kΩ時,f0≈42kHz,若取R=220kΩ,則中心頻率f0≈38kHz。
6腳: 該腳與地之間接一個積分電容,標准值為330pF,如果該電容取得太大,會使探測距離變短。
7腳:遙控命令輸出端,它是集電極開路輸出方式,因此該引腳必須接上一個上拉電阻到電源端,推薦阻值為22kΩ,沒有接受信號是該端輸出為高電平,有信號時則產生下降。 8腳:電源正極,4.5~5V。
軟硬體調試及性能
超聲波測距儀的製作和調試,其中超聲波發射和接收採用Φ16的超聲波換能器TCT40-16F1(T發射)和TCT40-16S1(R接收),中心頻率為40kHz,安裝時應保持兩換能器中心軸線平行並相距4~8cm,其餘元件無特殊要求。若能將超聲波接收電路用金屬殼屏蔽起來,則可提高抗干擾能力。根據測量范圍要求不同,可適當調整與接收換能器並接的濾波電容C4的大小,以獲得合適的接收靈敏度和抗干擾能力。
硬體電路製作完成並調試好後,便可將程序編譯好下載到單片機試運行。根據實際情況可以修改超聲波發生子程序每次發送的脈沖寬度和兩次測量的間隔時間,以適應不同距離的測量需要。根據所設計的電路參數和程序,測距儀能測的范圍為0.07~5.5m,測距儀最大誤差不超過1cm。系統調試完後應對測量誤差和重復一致性進行多次實驗分析,不斷優化系統使其達到實際使用的測量要求。後續工作需實驗後才能驗證 根據參考電路和集成的電路器件測距范圍有限10m以內為好。

2. 單片機紅外線測距

利用電磁波來測距、測速,是利用了變頻、差頻的原理,前端的電路和器件,都是使用模擬電路中高頻電子線路的理論和電路器件。
用P0~P3口與感測器的輸出口連接。
1、單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。相當於一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。
2、單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。各種產品一旦用上了單片機,就能起到使產品升級換代的功效,常在產品名稱前冠以形容詞——「智能型」,如智能型洗衣機等。

3. 基於單片機超聲波測距c語言程序求解釋

//上面這段什麼意思?
//上下面這段什麼意思? 沒有code為什麼也可以存16進制?
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

有code和沒有code的區別在於 dis_smg變數的存儲的存儲方式上
我記得有code的適合 dis_smg的數組元素不能改變的吧 記得不清楚了
你可以網路去

//下面是不是數碼管引腳和單片機引腳對應?
//數碼管位選定義
sbit smg_we1 = P3^4; //數碼管位選定義

答案: 是

4. 用51單片機實現超聲波測距怎樣才可以測到4m

輸出用並聯門電路驅動,如CD4069,以增大輸出電流。
接收採用低雜訊運放,如NE5532,放大1000倍。
採用接收,發射分開的探頭
超聲波測距系統的軟體設計,由於超聲發射感測器與超聲接收感測器相隔很近,當發射超聲波時,接收感測器會收到很強的干擾信號。為防止系統的誤測,在軟體上採用延遲接收技術,來提高系統的抗干擾能力。一旦按下起始鍵,即發送發射超聲波的指令,同時單片機控制系統開始執行程序,完成對溫度的采樣、濾波,然後獲得發送、接收超聲波的時間間隔,最後計算出距離值。
(1) 接收放大電路,可加入帶通濾波或鎖相放大(LM567)以盡可能減少干擾信號引起誤觸發,另外為防止發射信號直接進入接收端所以設置一定的延時。鎖相應用電路,調整在40KHZ上,但要考慮加入後對接收處理的延時,用軟體調整。
另一方面可採用自動增益補償技術,隨著時間的增加, AGC的放大倍數呈指數規律變化,從而保證了超聲波接收器波形的幅值不隨測量距離的變化而大幅變化,使得每次在同一個波頭觸發計時電路,提高了系統測量准確度。電路可以採用如下圖所示或者採用單片AD603實現,在這里不具體討論。
(2)發射驅動電路,為放大驅動脈沖可以再加入一級三極體放大電路,三極體要選用高頻的如9018以減少放大後波形的失真;另一方面還可以根據超聲波發生器的特點合理設計阻抗匹配,功放效率和機電轉換效率;為此可採用脈沖變壓器,脈沖變壓器是超聲換能器驅動電路中最重要的器件,它的用途是升高脈沖電壓信號,並使功率放大器的輸出阻抗與換能器的負載阻抗匹配。一般脈沖變壓器以變壓器的功率、原副邊電壓信號的幅值確定變壓器的尺寸和變比;而超聲換能器驅動用變壓器則主要以功率和原副邊電感及阻抗匹配確定變壓器的尺寸和變比。缺點是製作和測量都比較麻煩。在大量程應用場合還可以應用電容瞬間放電或電感瞬間放電產生高壓激勵脈沖。
(3)其它可改善的地方,可採用超聲波測距專用晶元SB5027;也可以採用LM1812N單片超聲波收發集成電路。

5. 關於單片機藍牙測距問題

單片機不可能現,

因為藍牙通過無線電傳輸,無線電的速度每秒30萬公里,可以圍繞地球幾圈

還有的是 藍牙只是一種通信協義,和測距扯不上關系吧

你算算無線電跑1米要多長時間,再算算單片機執行一條指令要多長時間

6. 基於51單片機的紅外測距

1、單片機 紅外發射管 紅外接收管 + 邏輯演算法
2、一般情況下,常見的管子,就是類似於發光二極體的樣子,接收的距離很近,你自己搭電路的話要考慮排除干擾,信號放大,也許50元,也解決不了。還有一種是3隻腳的,這種接收方面好一點,價格也不是很貴,大概5元。還有更好的器件,配對使用,檢出有效距離300mm,大概是20-30元,具體看你想怎麼用了,項目是怎麼規定的了

3、利用波速來計算距離,測量出幾個納秒的時間差,使用單片機則是不可能的。

4、利用電磁波來測距、測速,是利用了變頻、差頻的原理,前端的電路和器件,都是使用模擬電路中高頻電子線路的理論和電路器件。
5、單片機之類的數字電路根本跟不上這個速度,只能做後期的低速工作,如顯示報警等。
6、其實,用單片機做搶答器,也是蒙人的,誤差的概率也是極大的。

7. 基於單片機的超聲波測距系統的測量范圍和測量精度如何計算 ...

測量范圍是用程序實現不了的
只能看你的超聲波發射探頭的好壞還有就是CX20106A裡面有一個管腳接的電容(或者是電阻
具體你查手冊)的值就可以
測量精度的話要保證發射是40K
發射後立即啟用定時器
當進入外部中斷時立即關閉定時器
取出來的值就是你記得時間
還有就是注意超聲波在空氣中的速度
在15攝氏度是好像是338米每秒
20攝氏度的時候是340每秒吧
你取340就行
當然如果你的帶溫度補償的設計會更好
知道速度和時間
計算距離就很簡單了吧

8. 51單片機 HC-SR04超聲波測距 我寫的C語言代碼,請問

1、HC-SR04使用方法:給觸發端子trig一個10us以上的高電平即可觸發,觸發後echo端子將接受到高電平,高電平的持續時間就是測距的往返時間。


2、常式:

#include<reg52.h>
#defineucharunsignedchar
#defineuintunsignedint
/*位定義*/
sbitCHUFA=P0^1;//位定義超聲波觸發端(10us以上高電平觸發)
sbitJIESHOU=P0^3;//接收端(接受高電平)
sbitBEEP=P2^0;//蜂鳴器
sbitOUT0=P3^2;//外部中斷0
ucharJS_FLAG;//接收標志
uintCF_TIME,t0,t1,shu;
/*函數聲明*/
voidtimer0();
voidint0();
voiddisplay(uint);
main(){
CHUFA=0;//初始化拉低觸發端和接收端電平
JIESHOU=0;
JS_FLAG=0;
CF_TIME=15;//初始化觸發時間(大於10us)
TMOD=0x11;//定時器方式選擇
EA=1;//開總中斷
ET0=1;//開定時器0中斷
EX0=1;//開外部中斷0
IT0=0;//外部中斷選擇下降沿觸發
//JIESHOU=1;
while(1){
OUT0=JIESHOU;//外部中斷0被賦值為接收端信號,當出現下降沿是觸發外部中斷0
if(JS_FLAG==0){//如果沒有接收到高電平則觸發
CHUFA=1;
while(CF_TIME--);//10us以上高電平觸發感測器
}
if(JIESHOU==1){
TR0=1;//如果接收端收到高電平則啟動定時器
JS_FLAG=1;//並且標志位置1
BEEP=0;//蜂鳴器響
}
display(t1);//顯示測量時間(秒)
}
}
/*定時器0中斷程序*/
voidtimer0()interrupt1{
TH0=(65536-10000)/256;//裝初值10ms
TL0=(65536-10000)%256;
t0++;//每進入一次中斷t0加1
}
/*外部中斷0中斷程序*/
voidint0()interrupt0{
TR0=0;//一旦進入外部中斷0,說明接收端收到下降沿信號。關閉定時器0
JS_FLAG=0;//接收標志位置0
BEEP=1;//關閉蜂鳴器
t1=t0*10/1000;//測量時間為進入定時器中斷次數t0乘以每次時間10ms,除以1000化為秒為單位
t0=0;//t0清零
}
/*數碼管顯數函數*/
voiddisplay(uintshu){
//數碼管顯示函數
}

9. 51單片機超聲測距中,公式:uS/58=厘米或者 uS/148=英寸是怎麼得來的,為什麼US/58就是厘米

因為通常音速是340m/s,測距的話就是L=340m/s*T/2=T*170m/s=T*1s/170m=T*58uS/cm

10. 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;}
}

閱讀全文

與單片機測距演算法相關的資料

熱點內容
addto新建文件夾什麼意思 瀏覽:158
有伺服器地址怎麼安裝軟體 瀏覽:659
安卓如何完全清除數據 瀏覽:690
安卓安卓證書怎麼信任 瀏覽:53
伺服器被攻擊如何解決 瀏覽:221
學霸變成程序員 瀏覽:881
c語言編譯錯誤fatalerror 瀏覽:441
ipv4內部伺服器地址怎麼分配 瀏覽:463
java線程安全的方法 瀏覽:950
重復命令畫梯形 瀏覽:164
在疫情就是命令 瀏覽:328
自己搭建一個什麼伺服器好玩 瀏覽:253
java基礎馬士兵 瀏覽:823
完美世界手游如何查看伺服器 瀏覽:859
光遇安卓與ios什麼時候互通 瀏覽:598
js如何運行時編譯 瀏覽:917
引力app在哪裡下載 瀏覽:609
編寫app如何得到錢 瀏覽:801
吉利汽車軟體放哪個文件夾安裝 瀏覽:223
多文件編譯c 瀏覽:543