A. 51單片機超聲波測距代碼是多少
1602液晶顯示 的超聲波模塊程序
介面程序里邊都有、、
#include<reg52.h>
//#include<delay.h>
#include <intrins.h>
#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);
}
}
B. 想學下51單片機的超聲波測距,有幾個疑問。
這個是都已經把發射接收做好的。其實超聲的發射接收電路並不難,真的想學,建議你直接做。不要去用這種模塊。
C. 怎麼用51單片機做超聲波測距實驗
設計軟體時感測器在發射超聲波時輸出高電平,在接收到反射信號後,將輸出復位成低電平。這個高電平時間就是超聲波在某塊與障礙物之間往返一次所需的時間。當無障礙物時,高電平會無限期延續下去,可這樣就無法啟動下一個超聲波發送,你可以在一段合適的時間後,用軟體將其強制復位。這個時間決定這個模塊的最大檢測距離。
超聲波測距我也沒用過,我在網上查了下,感覺也不是太難,你用的什麼型號的超聲波感測器的質料找到,硬體連接應該在網上也能找的到。自己多動手學的會快點。我也是新手,呵呵。
D. 51單片機超聲波測距最遠距離是多少
51單片機超聲波測距最遠距離是30m。
提高超聲波測試距離的辦法有三種:
1、降低超聲波的頻率;
2、加大超聲波發射功率;
3、提高超聲波接收的靈敏度,提高放大電路的增益;如果用的是模塊,要注意它的技術文檔。
51單片機的優點:
51單片機之所以成為經典,成為易上手的單片機主要有以下特點:從內部的硬體到軟體有一套完整的按位操作系統,稱作位處理器,處理對象不是字或位元組而是位。不但能對片內某些特殊功能寄存器的某位進行處理,如傳送、置位、清零、測試等,還能進行位的邏輯運算,其功能十分完備,使用起來得心應手。
E. 用51單片機實現超聲波測距怎樣才可以測到4m
輸出用並聯門電路驅動,如CD4069,以增大輸出電流。
接收採用低雜訊運放,如NE5532,放大1000倍。
採用接收,發射分開的探頭
超聲波測距系統的軟體設計,由於超聲發射感測器與超聲接收感測器相隔很近,當發射超聲波時,接收感測器會收到很強的干擾信號。為防止系統的誤測,在軟體上採用延遲接收技術,來提高系統的抗干擾能力。一旦按下起始鍵,即發送發射超聲波的指令,同時單片機控制系統開始執行程序,完成對溫度的采樣、濾波,然後獲得發送、接收超聲波的時間間隔,最後計算出距離值。
(1) 接收放大電路,可加入帶通濾波或鎖相放大(LM567)以盡可能減少干擾信號引起誤觸發,另外為防止發射信號直接進入接收端所以設置一定的延時。鎖相應用電路,調整在40KHZ上,但要考慮加入後對接收處理的延時,用軟體調整。
另一方面可採用自動增益補償技術,隨著時間的增加, AGC的放大倍數呈指數規律變化,從而保證了超聲波接收器波形的幅值不隨測量距離的變化而大幅變化,使得每次在同一個波頭觸發計時電路,提高了系統測量准確度。電路可以採用如下圖所示或者採用單片AD603實現,在這里不具體討論。
(2)發射驅動電路,為放大驅動脈沖可以再加入一級三極體放大電路,三極體要選用高頻的如9018以減少放大後波形的失真;另一方面還可以根據超聲波發生器的特點合理設計阻抗匹配,功放效率和機電轉換效率;為此可採用脈沖變壓器,脈沖變壓器是超聲換能器驅動電路中最重要的器件,它的用途是升高脈沖電壓信號,並使功率放大器的輸出阻抗與換能器的負載阻抗匹配。一般脈沖變壓器以變壓器的功率、原副邊電壓信號的幅值確定變壓器的尺寸和變比;而超聲換能器驅動用變壓器則主要以功率和原副邊電感及阻抗匹配確定變壓器的尺寸和變比。缺點是製作和測量都比較麻煩。在大量程應用場合還可以應用電容瞬間放電或電感瞬間放電產生高壓激勵脈沖。
(3)其它可改善的地方,可採用超聲波測距專用晶元SB5027;也可以採用LM1812N單片超聲波收發集成電路。
F. 送於51單片機超聲波測距的問題。
用AT89S52,12M的晶振,用C語言,在從定時器里取得了回波引腳持續的高電平時間後,根本不需要進行乘以12,只是要將計算的結果除2,才是距離值。
你可到「谷歌」上搜索一下《一款製作容易免調試的超聲波測距板》,該超聲波測距板結構簡單、製作容易不需要調試、測量精度高,比較適合單片機初學都使用,同時也是單片機課程設計比較好的實訓課題。該超聲波測距系統,提供套件,及組裝好的板件,含原理圖、源程序、設計說明等。
G. 51單片機做超聲波測距報警系統,報警功能不會加
比如有源蜂鳴器beep一端接電源正一端接單片機IO,輸出低電平驅動。
S裡面就是換算出的距離值了。在main主函數的while(1)里的計算函數下加報警判斷動作語句
if(S<100)beep=0;//小於100報警
else beep=1;//否則關閉
H. 請問51單片機在納秒級別下怎麼計算超聲波距離
我也納悶了,最後的結果竟然是 距離L=T*58us/cm,T 是時間,就算它單位與後面一致是us,那麼 T*58us/cm 的單位結果,不就成了 us的平方/cm 了??
前面算到 L=T*170m/s ,都沒錯。如果後面只是要換算到 us 和 cm單位,那就應該寫成:
L=T*170*100cm/1000000us=T*0.017cm/us。
正確的計算,應該是:距離 L=0.017*S,(其中 L單位cm,S單位 us);
因為這是C語言,float計算比較費時,如果想在整型範圍內計算,那麼0.017約等於1/58.8,可以約為1/59,於是公式換為: L=T*1cm/59us
I. 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);
}
}
J. 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;
}