A. 51單片機超聲波測距的問題
關鍵這個電路是硬體設計好就可以。做一個40khz的發射電路。。。用2051的一個io控制電源。。。動態掃描led顯示
另外再做一個40khz的接收電路。。。二者頻率對准。。。接收電路接收到發射信號的時候輸出一個電壓觸發中斷,先接通40khz發射電路的工作電壓。。。單片機開始計時。。。等侍接收電路觸發中斷。當有中斷。停止計時。。。
這個時間除以2再乘以超聲波在空氣中傳播速度。應該就是等於你要測試的距離。。。
這是參考源代碼,可能不全,僅作參考!
#include
#define
unit
unsigned
int
#define
uchar
unsigned
char
sbit
fs="p3"^0;
//發送端;
sbit
h="p3"^7;
sbit
l="p3"^5;
//數碼管位選端;
sbit
m="p3"^4;
uchar
tab[16]=\{0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0x60,0x25,0x3c,0x23,0x34,0x74};//段碼;
uchar
u[3];
//顯示數組;
unit
count,b;
void
delay(unit
a)
//延時;
\{
unit
m;
for(m=0;m
=300)
\{
b=(17*count)/1000;
u[0]=b%10;
u[1]=(b/10)%10;
u[2]=(b/100)%10;
display();
}
}
void
over()interrupt
1
//t0溢出為無效測量fff;
\{
u[0]=15;
u[1]=15;
u[2]=15;
display();
}
void
main()
\{
fs=0;
delay(8600);
th0=0;
tl0=0;
tmod=0x01;
tr0=1;
ea=1;
et0=1;
pt0=1;
tx();
it0=1;
ie=0x83;
}
B. 基於51單片機的紅外測距
1、單片機 紅外發射管 紅外接收管 + 邏輯演算法
2、一般情況下,常見的管子,就是類似於發光二極體的樣子,接收的距離很近,你自己搭電路的話要考慮排除干擾,信號放大,也許50元,也解決不了。還有一種是3隻腳的,這種接收方面好一點,價格也不是很貴,大概5元。還有更好的器件,配對使用,檢出有效距離300mm,大概是20-30元,具體看你想怎麼用了,項目是怎麼規定的了
3、利用波速來計算距離,測量出幾個納秒的時間差,使用單片機則是不可能的。
4、利用電磁波來測距、測速,是利用了變頻、差頻的原理,前端的電路和器件,都是使用模擬電路中高頻電子線路的理論和電路器件。
5、單片機之類的數字電路根本跟不上這個速度,只能做後期的低速工作,如顯示報警等。
6、其實,用單片機做搶答器,也是蒙人的,誤差的概率也是極大的。
C. 一個單片機同時控制三個超聲波測距模塊,程序怎樣實現呢
只不過是單片機上接了三個模塊,是不可能同時控制的,寫程序時,分別對三個模塊進行測量,因單片機的速度是非常快的,從外觀上看就好像是同時測量的,可程序是不可能同時執行的,只是互相間隔的時間極短,表面上就同時了。確切說,從微觀上是分時控制,從宏觀上看是同時了。
D. 單片機測距如何實現
單片機測距離,分為超聲波激光測距:基本上是通過激光的發送與接收的時間差來算出距離的。這就要求系統輸出一個驅動發光管的電流脈沖,驅動LED發出激光脈沖。然後等待反射回來的光脈沖關閉計時電路。再根據計時的數值,算出距離。激光測距(超聲測距類同):基本上是通過激光的發送與接收的時間差來算出距離的。這就要求系統輸出一個驅動發光管的電流脈沖,驅動LED發出激光脈沖。然後等待反射回來的光脈沖關閉計時電路。再根據計時的數值,算出距離。
E. 單片機紅外線測距
利用電磁波來測距、測速,是利用了變頻、差頻的原理,前端的電路和器件,都是使用模擬電路中高頻電子線路的理論和電路器件。
用P0~P3口與感測器的輸出口連接。
1、單片機又稱單片微控制器,它不是完成某一個邏輯功能的晶元,而是把一個計算機系統集成到一個晶元上。相當於一個微型的計算機,和計算機相比,單片機只缺少了I/O設備。概括的講:一塊晶元就成了一台計算機。它的體積小、質量輕、價格便宜、為學習、應用和開發提供了便利條件。同時,學習使用單片機是了解計算機原理與結構的最佳選擇。
2、單片機的使用領域已十分廣泛,如智能儀表、實時工控、通訊設備、導航系統、家用電器等。各種產品一旦用上了單片機,就能起到使產品升級換代的功效,常在產品名稱前冠以形容詞——「智能型」,如智能型洗衣機等。
F. 51單片機控制超聲波測距,大家看看我的程序為什麼不對,詳細注釋
你好:
這時我用51單片機寫的HC_SR04超聲波測距程序。
其實很簡單的,程序一目瞭然。
希望我的回答能幫助到你。
很抱歉,回答者上傳的附件已失效
G. 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;}
}
H. 求一段匯編程序,利用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 ;結束
我見過一款製作容易免調試的超聲波測距板,你可到「谷歌」上搜索一下《一款製作容易免調試的超聲波測距板》,該超聲波測距板結構簡單、製作容易不需要調試、測量精度高,比較適合單片機初學都使用,同時也是單片機課程設計比較好的實訓課題。該超聲波測距系統,提供套件,及組裝好的板件,含原理圖、源程序、設計說明等。