Ⅰ 誰能給我一篇超聲波測距的程序的謝謝了
相關資料,請參考
超聲波測距儀設計及其應用分析
[摘要] 本文利用超聲波傳輸中距離與時間的關系,採用AT89C51單片機進行控制及數據處理,設計出了能精確測量兩點間距離的超聲波測距儀。該測距儀主要由超聲波發射器電路、超聲波接收器電路、單片機控制電路、環境溫度檢測電路及顯示電路構成。利用所設計出的超聲波測距儀,對不同距離進行了測試,並進行了詳盡的誤差分析。
[關鍵詞] 超聲波測距 單片機 溫度感測器
隨著社會的發展,人們對距離或長度測量的要求越來越高。超聲波測距由於其能進行非接觸測量和相對較高的精度,越來越被人們所重視。本設計的超聲波測距儀,可以對不同距離進行測試,並可以進行詳盡的誤差分析。
一、設計原理
超聲測距儀是根據超聲波遇到障礙物反射回來的特性進行測量的。超聲波發射器向某一方向發射超聲波,在發射同時開始計時,超聲波在空氣中傳播,途中碰到障礙物就立即返回來,超聲波接收器收到反射波就立即中斷停止計時。 通過不斷檢測產生波發射後遇到障礙物所反射的回波,從而測出發射超聲波和接收到回波的時間差T,然後求出距離L。基本的測距公式為:L=(△t/2)*C
式中 L——要測的距離
T——發射波和反射波之間的時間間隔
C——超聲波在空氣中的聲速,常溫下取為340m/s
聲速確定後,只要測出超聲波往返的時間,即可求得L。
二、超聲波測距儀設計目標
測量距離: 5米的范圍之內;通過LED能夠正確顯示出兩點間的距離;誤差小於5%。
三、數據測量和分析
1.數據測量與分析
由於實際測量工作的局限性,最後在測量中選取了一米以下的30cm、50cm、70cm、80cm、90cm、100cm 六個距離進行測量,每個距離連續測量七次,得出測量數據(溫度:29℃),如表所示。從表中的數據可以看出,測量值一般都比實際值要大幾厘米,但對於連續測量的准確性還是比較高的。
對所測的每組數據去掉一個最大值和最小值,再求其平均值,用來作為最終的測量數據,最後進行比較分析。這樣處理數據也具有一定的科學性和合理性。從表中的數據來看,雖然對超聲波進行了溫度補償,但在比較近的距離的測量中其相對誤差也比較大。特別是對30cm和50cm的距離測量上,相對誤差分別達到了5%和4.8%。但從全部測量結果看,本設計的絕對誤差都比較小,也比較穩定。本設計盲區在22.6cm左右,基本滿足設計要求。
2.誤差分析
測距誤差主要來源於以下幾個方面:
(1)超聲波發射與接收探頭與被測點存在一定的角度,這個角度直接影響到測量距離的精確值;(2)超聲波回波聲強與待測距離的遠近有直接關系,所以實際測量時,不一定是第一個回波的過零點觸發;(3)由於工具簡陋,實際測量距離也有誤差。影響測量誤差的因素很多,還包括現場環境干擾、時基脈沖頻率等等。
四、應用分析
採用超聲波測量大氣中的地面距離,是近代電子技術發展才獲得正式應用的技術,由於超聲測距是一種非接觸檢測技術,不受光線、被測對象顏色等的影響,在較惡劣的環境(如含粉塵)具有一定的適應能力。因此,用途極度廣泛。例如:測繪地形圖,建造房屋、橋梁、道路、開挖礦山、油井等,利用超聲波測量地面距離的方法,是利用光電技術實現的,超聲測距儀的優點是:儀器造價比光波測距儀低,省力、操作方便。
超聲測距儀在先進的機器人技術上也有應用,把超聲波源安裝在機器人身上,由它不斷向周圍發射超聲波並且同時接收由障礙物反射回波來確定機器人的自身位置,用它作為感測器控制機器人的電腦等等。由於超聲波易於定向發射,方向性好,強度好控制,它的應用價值己被普遍重視。
總之,由以上分析可看出:利用超聲波測距,在許多方面有很多優勢。因此,本課題的研究是非常有實用和商業價值。
五、結論
本設計的測量距離符合市場要求,測量的盲區也控制在23cm以內。針對市場需求,本設計還可以加大發射功率,讓測量的距離更加的遠。在顯示方面,也可以對程序做適當改動,使開始發射超聲波時LED顯示出溫度值,到超聲波回波接收到以後通過計算得出距離值時,LED自動切換顯示距離值,這樣在視覺效果上得到更加直觀的了解。
參考文獻:
[1]MCS一51/96系列單片機原理及應用(修訂版)[M].北京:北京航空航天大學出版社.2002.46-170
[2]金篆芷王明時:現代感測器技術[M].電子工業出版社.1995.331—335
[3]MCS一51/96系列單片機原理及應用(修訂版)[M].北京:北京航空航天大學出版社.2002.46-170
[4]超聲波測距儀的設計[J].感測器技術.2002
Ⅱ 51單片機超聲波測距代碼
1602液晶顯示 的超聲波模塊程序
介面程序里邊都有、、
#include
//#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P2^3;
sbit lcden=P2^2;
sbit trig=P2^0; //超聲波發送
//sbit echo=P3^2; //超聲波接受
//P0____________DB0-DB7
uchar dis[]="Disp_HC-SR04";
uchar num[]="0123456789";
uint distance;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
void HC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}
uint HC_jisuan()
{
uint dist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53; //晶振11.0592MHz 距離cm=微秒us/58
return dist; //1個機器周期是12個時鍾周期 timer*12/(58*11.0592)=timer/53
}
void HC_run()
{
uint tempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay(1);
trig=0;
while((TH0-tempH!=0||TL0-tempL!=0)||(TH0==0&&TL0==0))
{
tempH=TH0;
tempL=TL0;
}
delay(1);
}
void lcd_write_com(uchar com) //LCD寫指令
{
lcdrs=0;
P0=com;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_write_data(uchar date) //LCD寫數據
{
lcdrs=1;
P0=date;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcd_init() //LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}
void lcd_display(uchar temp)
{
uint i;
lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}
lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}
void main()
{
lcd_init();
HC_init();
while(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}
Ⅲ 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單片機控制超聲波感測器測距的程序。
; 基於AT89C2051單片機超聲波測距系統
; 測量范圍35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中斷入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START : MOV R0,#70H ;立即數70H送寄存器R0中
MOV R7,#0BH ;立即數0BH送寄存器R7中
MOV 20H,#00H ;立即數00H送20H單元中
CLEARDISP: MOV @R0,#00H ;立即數立即數00H送R0中的地址單元中
INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的數值減1非零時轉移
MOV TMOD,#01H ;置定時器T0工作方式樣3,對內部機器周期計數
CJZCX:MOV TL0,#00H ;裝入定時器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超聲波發射持續200us
Here:CPL P3.5 ;輸出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
SETB TR0
SETB P3.2
MOV R6,#53H ;延時1.5ms
DL0: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL0
QBA:JNB P3.7,QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:CLR P3.2
CLR TR0
MOV 70H,tl0
MOV 71H,tH0
MOV R2,71H
MOV R3,70H
MOV R6,#22H
MOV R7,#0H
LCALL MULD
MOV R6,#64H
MOV R7,#0H
LCALL DIVD
MOV 73H,R2
MOV 74H,R3
MOV R3,#0H
MOV R4,#0H
MOV R5,#0H
MOV R6,73H
MOV R7,74H
LCALL HB2
MOV A,R4 ;分離BCD
MOV B,#10H
DIV AB
MOV 78H,A
MOV 77H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 76H,A
MOV 75H,B
MOV 7AH,#0EFH
XXX:LCALL DISPLAY
DJNZ 7AH,XXX
AJMP CJZCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 乘34程序(乘聲速) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MULD: MOV A,R3 ;計算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;計算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分積
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 除100程序(除法) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙位元組商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD轉換 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙位元組十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當於乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙位元組十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 顯示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#76H ;立即數76H送寄存器中
MOV R5,#0FEH ;立即數FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的數值送累加器A中
MOV P3,A ;累加器A中的數值送P3口
MOV A,@R1 ;以寄存器R1中的數為地址單元的數值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址為基地變址定址單元中的數送累加器
MOV P1,A ;累加器A中的數值送P1口
MOV R6,#14H ;立即數據14送寄存器R6中
DL1:MOV R7,#19H ;立即數據19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的數據減1,不為零時則轉移
DJNZ R6,DL1 ;寄存器中的數據減1,不為零時則轉移
INC R1 ;寄存器R1中的數值加1
MOV A,R5 ;寄存器R5中的數值送累加器A中
JNB ACC.2,ENDOUT ;地址位為0則轉到ENDOUT
RL A ;累加器循環右移
MOV R5,A ;累加器A中的數值送寄存器R5中
AJMP PLAY ;絕對短轉移
ENDOUT: SETB P3.5 ;置P3.5口
MOV P1,#0FFH ;立即數0FEH送P1口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
END ;結束
我見過一款製作容易免調試的超聲波測距板,你可到「谷歌」上搜索一下《一款製作容易免調試的超聲波測距板》,該超聲波測距板結構簡單、製作容易不需要調試、測量精度高,比較適合單片機初學都使用,同時也是單片機課程設計比較好的實訓課題。該超聲波測距系統,提供套件,及組裝好的板件,含原理圖、源程序、設計說明等。
Ⅳ 單片機超聲波雷達測距的C語言程序設計,具體看問題補充
功能這么多的單片機超聲波雷達測距的C語言程序設計,這里可能沒有人會無償給你做,你到淘寶網上看看吧,找一下:「單片機超聲波測距模塊電子設計製作C程序」這是一款比較好的單片機超聲波雷達測距的C語言程序設計,附的資料比較多,有Protel格式原理圖、PCB圖,有源程序,製作非常容易,只要按圖焊接好元件,基本不需要調試,最遠可測量到6.99米,報警距離還可調節。
Ⅵ 超聲波測距儀的設計需要用到哪些軟體
設計電原理圖、PCB圖需要PROTEL;編寫51系列單片機程序需要用到KEIL等單片機編譯軟體(不同系統列的單片機編譯軟體也不同);下載單片機程序需要相應的下載軟體,如果要進行模擬,還要用到Proteus模擬軟體。
Ⅶ 幫忙詳細解答一下基於單片機的超聲波測距儀的匯編源程序(急求啊)
我可以負責的告訴你,用C吧,完全可以勝任。
2003年的時候我們為了確保MCU的效率(時效性),強制使用匯編寫的超聲波程序,結果程序寫不大,匯編你也知道,寫百八十行可以,代碼多了,這程序就沒法看了,更談不上程序升級和維護了。因此,那一代超聲波產品的功能很弱。
2006年,我們要重新設計第二代超聲波產品,要求可靠性好、功能強大,自然的代碼量也要多了,當時我們仍然固執的使用匯編、絕不用C,可匯編的代碼仍然寫不長,為了方便技術人員管理和後續的產品升級,我把這一套復雜的系統代碼分成了4級,也就是4套匯編代碼,分別在32個MCU里運行(同一個設備里),這4套代碼分別交給4個人來編寫和維護,這4個人中若有人跳槽走了,由於他掌握的代碼量小,功能又單一,接替他的人也很容易接手。(否則,這4套匯編程序,集中在一個冗長的代碼里,那麼這套代碼將很難維護,而且幾乎只能有1個人才能完全看懂它,一旦這個人走了,別人很難接手這套『爛』程序,這對於產品的持續改進非常不利)
2008年,我們試探性的,在DSP(TMS320F28335)上用C完成了所有的功能,而且程序量比匯編要少得多,可讀性、可維護性也要好得多。後來,我們在單片機上,也用C完成了絕大部分功能,原來擔心的時效性問題從沒有發生,這才領悟:2003-2008這5年,我們繞了一個大圈。
從此以後,我們就不再用匯編了,用C寫超聲波程序一直至今(偶爾嵌入匯編代碼),算一下也有5年了,從沒覺得C有任何局限性。
那麼,你是還覺得必須要用匯編么?
Ⅷ 超聲波測距程序分析
程序我沒有仔細看,有些思路你考慮一下:
1、不知道你用的哪個型號的單片機,計數器所用的時鍾頻率是多少?5cm意味著約300uS的聲波傳輸時間,結合你的計數頻率和計數器的位數,看看300uS你的計數器有沒有溢出;
2、超過5cm的時候,用示波器探一下有沒有收到聲波信號,可能是你的放大倍數不夠,信號太弱導致信號沒有被識別;
3、仔細考慮一下你的收發探頭的安裝方式,有沒有可能接收到直射波,我覺得這種可能性要大一些;超聲測距,接收探頭必須只接收到反射波,否則測出來肯定不準確;
4、測試不準確,可以考慮進行多次測量,去掉一半的異常值(比如說測回來8個數,去掉2個最大的,再去掉2個最小的),然後取平均;這樣測出來的結果相對准確一些。
就是這些了,希望對你有幫助。