當(dāng)前位置: 首頁(yè) > 傳感測(cè)量產(chǎn)品 > 工業(yè)傳感器 > 超聲波傳感器
發(fā)布日期:2022-10-09 點(diǎn)擊率:447
一、原理介紹
遇到障礙物,能夠感應(yīng)做出反應(yīng),超聲波可以作為一種測(cè)量手段,超聲波在固體液體氣體中傳播良好,氣體中速度約為340m/s。如果知道時(shí)間,那么就可以計(jì)算出距離。利用宏晶STC89C52計(jì)算超聲波模塊HC-SR04反饋信號(hào)高電平的時(shí)間,換算成距離顯示在數(shù)碼管上(這里用573和138組合的共陰極數(shù)碼管顯示電路)。
STC89C52是國(guó)產(chǎn)宏晶的一塊8位寄存器芯片,IO準(zhǔn)雙向口,可以輸入輸出,七個(gè)中斷源,六個(gè)中斷通道,有ISP系統(tǒng),支持USB串口下載,8KB系統(tǒng)可編程下載Flash(程序儲(chǔ)存空間),512BRAM(數(shù)據(jù)儲(chǔ)存空間),27個(gè)特殊功能寄存器。
HC-SR04超聲波模塊,模塊四個(gè)引腳觸發(fā)信號(hào)Trig,回聲信號(hào)Echo,供電VCC和GND,測(cè)量周期60ms以上。當(dāng)給Trig一個(gè)10us以上的脈沖時(shí),HC-SR04內(nèi)部自動(dòng)循環(huán)發(fā)出8個(gè)40KHz的脈沖,Echo剛收到回波時(shí)置一(超出一定范圍收到的信號(hào)不夠HC-SR04置一定時(shí)器不計(jì)數(shù)),單片機(jī)定時(shí)器開始計(jì)數(shù),直到Echo沒有收到信號(hào)置零,記了TH+TL次機(jī)器周期,一個(gè)機(jī)器周期需要12個(gè)振蕩周期,由此時(shí)間就可以計(jì)算出來(lái),再用時(shí)間X速度就可以計(jì)算出距離S。
數(shù)碼管有七段的,十四段的,十六段的,這里用的八位共陰極七段數(shù)碼管。共陰極數(shù)碼管就是共地,a,b,c,d,e,f,g,h對(duì)應(yīng)哪一段輸入高電平,哪一段LED亮,所以特定的組合可以顯示0~9數(shù)字,所以有共陰極段碼表,一組數(shù)組,顯示幾就對(duì)P0端口賦值對(duì)應(yīng)這個(gè)數(shù)值的下標(biāo)的數(shù)組元素。
HC-SR04收發(fā)信號(hào),STC89C52計(jì)算結(jié)果,數(shù)碼管顯示,74HC573負(fù)責(zé)數(shù)碼管的段選,74LS138負(fù)責(zé)數(shù)碼管的位選。
二、仿真測(cè)試
完整的電路仿真圖如圖一所示,首先打開Protues ISIS新建一個(gè)空白文件,從庫(kù)中拾取元件,選擇IC芯片AT89C52,第一步取兩個(gè)20PF~33PF的電容一個(gè)晶振和個(gè)地信號(hào)組成晶振電路,第二步給P0口上拉一的330歐的排阻,第三步加入兩個(gè)四位共陰極(CC)七段數(shù)碼管,第四步加一個(gè)74HC573進(jìn)行段選,連接數(shù)碼管的段選引腳,第五步加入一個(gè)74LS138,三位地址線控制八位位選,連接上數(shù)碼管的位選位,第六步構(gòu)造一個(gè)HC-SR04超聲波傳感器模塊,并根據(jù)程序連好線,第七步加入一個(gè)信號(hào)源和一個(gè)示波器,方便模擬測(cè)試,電路連接完成。
圖一 仿真電路
激勵(lì)源連接在HC-SR04模塊的Echo腳上,進(jìn)行如圖二的設(shè)置。
圖二 激勵(lì)源設(shè)置
示波器分別接上HC-SR04的Trig和Echo腳,雙擊主控芯片,打開程序生成的hex文件,點(diǎn)擊運(yùn)行,得到如圖三的結(jié)果。
圖三 仿真結(jié)果
首先黃色線是Trig,放大看了下,如圖四。單位5us,由圖可見四格多,這個(gè)觸發(fā)信號(hào)高電平20幾u(yù)s,符合資料中Trig觸發(fā)信號(hào)高電平要保持10us以上。其次水平滾輪每20代表一格即一個(gè)單位,結(jié)合圖三和圖五,兩個(gè)發(fā)射信號(hào)水平滾輪數(shù)間隔左右,800格左右,單位為1ms,即800ms,符合程序中發(fā)射間隔800ms。最后數(shù)碼管顯示34,給Echo的方波200hz,占空比40%,即高電平2ms,12M晶振的單片機(jī)一個(gè)機(jī)器周期1us,定時(shí)器需要計(jì)數(shù)2000次,所以TH+TL=2000,根據(jù)公式S=(Th+TL)X1.7/100=34cm。綜上所述,仿真程序設(shè)計(jì)沒有問題。
圖四 觸發(fā)信號(hào)保持時(shí)間
圖五 觸發(fā)信號(hào)間隔時(shí)間
三、程序設(shè)計(jì)
? ?
#include "reg51.h"
#include
//常變量定義:
code unsigned char table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//表:共陰數(shù)碼管 0-9 -
unsigned int ?time=0;
unsigned int ?timer=0;
unsigned long S=0;
bit flag =0;
unsigned char l_disbuff[4]={ 0,0,0,0};//顯示緩沖
unsigned char l_posit=1; //位選擇
//引腳定義:
//sbit SMG_q = P2^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(千位)本例程只用到三位數(shù)碼管
sbit SMG_b = P2^2; //定義數(shù)碼管陽(yáng)級(jí)控制腳(百位)
sbit SMG_s = P2^3; //定義數(shù)碼管陽(yáng)級(jí)控制腳(十位)
sbit SMG_g = P2^4; //定義數(shù)碼管陽(yáng)級(jí)控制腳(個(gè)位)
sbit RX = P2^1; //模塊引腳
sbit TX = P2^0;
//顯示函數(shù),參數(shù)為顯示內(nèi)容
void display()
{
P0=0x00; //
switch(l_posit){
case 0: //選擇千位數(shù)碼管,關(guān)閉其它位
//SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[0]];
break;
case 1: //選擇百位數(shù)碼管,關(guān)閉其它位
//SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]];//加入小數(shù)點(diǎn)要與一下
break;
case 2: //選擇十位數(shù)碼管,關(guān)閉其它位
//SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //選擇個(gè)位數(shù)碼管,關(guān)閉其它位
//SMG_q=1;
SMG_b=0;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[3]];
break;
}
l_posit++;
if(l_posit>3)
l_posit=0;
}
void Count(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100; ? ? //算出來(lái)是CM
if((S>=700)||flag==1) //超出測(cè)量范圍顯示“-”
{ ?
?flag=0;
?l_disbuff[1]=10; ? //“-”
?l_disbuff[2]=10; ? //“-”
?l_disbuff[3]=10; ? //“-”
}
else
{
?l_disbuff[1]=S%1000/100;
?l_disbuff[2]=S%1000%100/10;
?l_disbuff[3]=S%1000%10 %10;
}
}
void zd0() interrupt 1 //T0中斷用來(lái)計(jì)數(shù)器溢出,超過(guò)測(cè)距范圍
{
? ? flag=1; //中斷溢出標(biāo)志
}
void ?zd3() ?interrupt 3 //T1中斷用來(lái)掃描數(shù)碼管和計(jì)800MS啟動(dòng)模塊
{
TH1=0xf8;
TL1=0x30;
display();
timer++;
if(timer>=400)
{
?timer=0;
?TX=1; ? ? ? ?//800MS ?啟動(dòng)一次模塊
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();
?_nop_();?
?_nop_();?
?_nop_();?
?_nop_();
?TX=0;
}?
}
void ?main( ?void ?)
{ ?
? ? TMOD=0x11; ? //設(shè)T0,T1為方式1
TH0=0;
TL0=0; ? ? ? ? ?
TH1=0xf8; ? //2MS定時(shí)
TL1=0x30;
ET0=1; ? ? ? ? ? ? //允許T0中斷
ET1=1; ? //允許T1中斷
TR1=1; ? //開啟定時(shí)器
EA=1; ? //開啟總中斷
while(1)
{
while(!RX); //當(dāng)RX為零時(shí)等待
TR0=1; ? ?//開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
? ? ?Count(); //計(jì)算
}
}
? ? ? ? ? ? ?
四、實(shí)物測(cè)試
一、模塊介紹
1.1 模塊圖示
模塊共有四個(gè)引腳,分別是Vcc(供5V電源)、Trig(控制端,下文簡(jiǎn)稱Tr)、Echo(接收端,下文簡(jiǎn)稱Ec)、Gnd(地線)
2.2 產(chǎn)品參數(shù)
?
二、 工作原理(時(shí)序)
在初始狀態(tài)時(shí),Tr引腳電平由單片機(jī)拉高,Ec引腳電平由傳感器拉低。工作時(shí),首先由單片機(jī)將Tr引腳拉低后再給一個(gè)高電平脈沖(持續(xù)時(shí)間至少為10us),傳感器收到該脈沖信號(hào)后開始向外發(fā)射8個(gè)40KHz的方波即用來(lái)測(cè)距的超聲波。該測(cè)距超聲波以聲速(340m/s)向前傳播,在遇到障礙物時(shí),該超聲波被反彈向回傳播,因此最終能夠被傳感器接收到,傳感器會(huì)記錄從發(fā)射超聲波到接收到超聲波的所經(jīng)歷的時(shí)間t。傳感器在收到返回的信號(hào)后,由Ec引腳輸出一個(gè)與t相同時(shí)間的高電平脈沖。此時(shí),我們只需要通過(guò)單片機(jī)內(nèi)部定時(shí)/計(jì)數(shù)器記錄Ec引腳高電平脈沖時(shí)間即可得超聲波的傳播時(shí)間t。因此可算出傳感器到障礙物間的距離=340*(t/2)? ?(因?yàn)閠是超聲波一來(lái)一回經(jīng)歷的時(shí)間,所以單程時(shí)間要除以2)。
?
三、例程(例程均為自己編寫且仿真通過(guò))
單片機(jī)為AT89C52,工作頻率為12Mhz,最終結(jié)果通過(guò)八段數(shù)碼管顯示。
注意:因?yàn)?2MHz的單片機(jī)的機(jī)器周期為1us,即計(jì)數(shù)值就等于以u(píng)s為單位的時(shí)間值,因此計(jì)算公式 可以寫為? 時(shí)間=TH0*256+TL0;但如果使用的單片機(jī)工作頻率為11.0592MHz,其機(jī)器周期為1.085us,因此時(shí)間計(jì)算公式需寫為? 時(shí)間=(TH0*256+TL0)*1.085
?
四、仿真電路
?
左肩理想右肩擔(dān)當(dāng),君子不怨永遠(yuǎn)不會(huì)停下腳步!
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
?
大多數(shù)人感覺超聲波測(cè)距proteus仿真是無(wú)法實(shí)現(xiàn)的,雖然proteus自帶的庫(kù)有GUR03和SRF04兩種模型,但是卻與實(shí)際傳感器使用方法相差甚遠(yuǎn),即使求助度娘也很難找到簡(jiǎn)單易懂的教程。
gur03和srf04.png (8.23 KB, 下載次數(shù): 61)
下載附件
2020-3-31 23:52 上傳
之前很多人想做超聲波測(cè)距仿真但都沒有找到很好的辦法去實(shí)現(xiàn),在軟件里沒有這樣的元件,有人用一個(gè)按鍵開關(guān)去模擬仿真,這樣仿真出來(lái)的效果,非常不好。還有人用555時(shí)基電路產(chǎn)生一個(gè)延時(shí)信號(hào)(555電路作為超聲波仿真的內(nèi)部元件),來(lái)模擬超聲波頭發(fā)送后遇到回波返射回來(lái)的這階段時(shí)間,來(lái)對(duì)單片機(jī)超聲波測(cè)距單片機(jī)系統(tǒng)進(jìn)行模擬,能完成對(duì)超聲波測(cè)距模塊大致仿真,但需要繁雜的設(shè)計(jì)。
下面是一個(gè)超聲波測(cè)距模塊的proteus模型,能直接用于proteus仿真,且使用方法與實(shí)際傳感器幾乎一致,模型如下圖。樓主千辛萬(wàn)苦終于完成了仿真,分享交流一下,請(qǐng)大家不嗇賜教!
ULTRASonIC SENSOR.png (23.56 KB, 下載次數(shù): 82)
下載附件
2020-3-31 23:56 上傳
(library文件見附件)
下面是仿真效果:
simulation.png (157.85 KB, 下載次數(shù): 77)
下載附件
2020-4-1 00:06 上傳
單片機(jī)程序代碼:#include
//生成20us的脈沖寬度的觸發(fā)信號(hào)
Trig=1;
Delay20us();
Trig=0;
//等待回響信號(hào)變高電平
while(!Echo);
TR0=1; //啟動(dòng)定時(shí)器0
//等待回響信號(hào)變低電平
while(Echo);
TR0=0; //關(guān)閉定時(shí)器0
//返回距離值(mm)
return (SPEEDSOUND*(TH0*256.0+TL0))/2000;
}
//HCSR04初始化
void HCSR04_Initialize()
{
SPEEDSOUND=334.1+25*0.61;
Trig=0;
Echo=0;
TMOD=0x01;
}
//測(cè)距的數(shù)值排序求平均
float DistanceStatistics()
{
uchar i;
float disData;
for(i=0;i<7;i++) //連續(xù)測(cè)距
{
disData+=MeasuringDistance();
delay(1);
}
return disData/7.0;
}
void main()
{
LcdInitiate();//1602初始化
HCSR04_Initialize();//HC-SR04初始化
while(1)
{
Distancevalue=DistanceStatistics() ;
display_val((int)Distancevalue,0x45);//顯示距離值
delay(1000);
LEDRed=~LEDRed; //測(cè)距系統(tǒng)工作指示燈
}
}
復(fù)制代碼
全部文件已打包,請(qǐng)自行下載(2個(gè)文件內(nèi)容一樣,推薦下載7z的):
7z:
7z壓縮版.7z
(96.58 KB, 下載次數(shù): 124)
2021-4-28 19:46 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
winrar:
超聲波測(cè)距(仿真原理圖+源程序).rar
(102.08 KB, 下載次數(shù): 1048)
2021-5-17 18:03 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
推薦閱讀
單片機(jī)學(xué)習(xí)筆記————proteus實(shí)現(xiàn)虛擬串口
一、環(huán)境搭建1.proteus軟件2.虛擬串口軟件3.串口助手二、繪制原理圖使用非門的原因:由于MAX232在proteus中的非符號(hào)管腳并無(wú)取反的作用。實(shí)際不需要。
發(fā)表于 2021-11-09
ARM嵌入式實(shí)驗(yàn) 熟悉PROTEUS電子仿真軟件的使用(LPC2138)
一、實(shí)驗(yàn)?zāi)康恼莆誖PROTEUS電子仿真軟件的安裝過(guò)程;掌握RPROTEUS電子仿真軟件的使用方法;掌握創(chuàng)建電子仿真原理圖的過(guò)程;掌握為ARM芯片添加程序并仿真調(diào)試的過(guò)程。二、實(shí)驗(yàn)內(nèi)容實(shí)現(xiàn)流水燈仿真實(shí)驗(yàn)。安裝RPROTEUS電子仿真軟件,根據(jù)實(shí)驗(yàn)原理圖創(chuàng)建一個(gè)PROTEUS原理圖,并添加相應(yīng)的元件和導(dǎo)線;使用RealView MDK集成開發(fā)環(huán)境建立并生成實(shí)現(xiàn)流水燈的代碼,為ARM芯片添加代碼,最后查看仿真運(yùn)行結(jié)果。三、實(shí)驗(yàn)要求了解RPROTEUS電子仿真軟件的安裝過(guò)程;能夠使用RPROTEUS電子仿真軟件建立原理圖并添加元件和導(dǎo)線;能夠設(shè)置元件及芯片的參數(shù),并為ARM芯片添加代碼;能夠檢查并修改原理圖的錯(cuò)誤,并進(jìn)行仿真運(yùn)行
發(fā)表于 2021-08-11
CVAVR編譯在proteus7.4中無(wú)法正確運(yùn)行問題
這個(gè)問題主要會(huì)出現(xiàn)在用CVAVR來(lái)編譯的程序中。一時(shí)興起想弄個(gè)仿真,結(jié)果怎么著都不正常,AVR的端口一閃一閃的,覺得很奇怪,后來(lái)才發(fā)現(xiàn)是看門狗溢出了導(dǎo)致單片機(jī)不停的復(fù)位,把程序下到網(wǎng)上的proteus的AVR中就可以,網(wǎng)上下的proteus中的ATmega16何庫(kù)里找出來(lái)的不太一樣,就是沒明白為什么庫(kù)里調(diào)出來(lái)的不行。 后來(lái)在仿真日志中發(fā)現(xiàn)原來(lái)是看門狗一直都開著,我又沒喂狗,因此一直都把處理器復(fù)位了,這回我更郁悶,我又沒開看門狗,又沒配置fuse,為什么自己會(huì)開呢,搞了N久后,發(fā)現(xiàn)有這個(gè)可能,一個(gè)CVAVR本身編譯之后在proteus仿真中,默認(rèn)開了看門狗(實(shí)際上我并沒有開?。。。《以趯?shí)物中,要配置fuse才能開的吧?)經(jīng)過(guò)考究后
發(fā)表于 2021-08-05
proteus7.7+Keil2仿真80C51控制流水燈
, 我們還要收集實(shí)驗(yàn)所需的器件(比如多個(gè)LED發(fā)光二極管、多個(gè)阻值不同的電阻、多個(gè)不同類型的開關(guān)等). 上面的問題可以通過(guò)proteus來(lái)較好的解決.在"流水燈"實(shí)驗(yàn)中, 我們可以直接在proteus中繪制原理圖. 在proteus元件庫(kù)中, 我們可以找到需要的器件, 這是很方便的.在繪制完原理圖后, 打開Keil2, 將編寫好的控制程序(.c)進(jìn)行編譯, 之后定位到編譯生成的.hex文件, 進(jìn)入proteus, 將80C51控制程序的路徑改為定位的位置即可.從上面使用proteus進(jìn)行實(shí)驗(yàn)的步驟來(lái)看, 使用軟件仿真是一種極其靈活的方式.將電路的原理圖(下圖示)繪制完畢后, 我們來(lái)看一下軟件控制部分
發(fā)表于 2021-08-04
proteus7.7+Keil2仿真80C51控制路口信號(hào)燈(無(wú)綠燈倒計(jì)時(shí)+綠燈倒計(jì)
本例的控制程序未使用80C51的(定時(shí)器)中斷功能, 而是以for循環(huán)作為延時(shí)函數(shù), 以粗略提供0.5s和1s的時(shí)延.本例的控制邏輯為①南北方向圓餅燈為紅燈時(shí), 南北方向車輛停止在停車線內(nèi)等待. ②南北方向圓餅燈為綠燈時(shí), 南北方向車輛(直行和左轉(zhuǎn))同時(shí)放行. ③東西方向圓餅燈為紅燈時(shí), 東西方向車輛停止在停車線內(nèi)等待. ④東西方向圓餅燈為綠燈時(shí), 東西方向車輛(直行和左轉(zhuǎn))同時(shí)放行. ⑤圓餅燈為黃燈時(shí), 未越過(guò)停車線的車輛應(yīng)停車等待. ⑥南北方向和東西方向的右轉(zhuǎn)車輛在不影響交通秩序的前提下, 可不用看圓餅燈通行.本例的設(shè)計(jì)邏輯其實(shí)并不復(fù)雜. 我先將南北方向的信號(hào)控制設(shè)計(jì)好, 之后相對(duì)于南北方向設(shè)計(jì)東西方向即可. 如果非
發(fā)表于 2021-08-04
proteus7.7+Keil2仿真80C51控制路口信號(hào)燈(帶左轉(zhuǎn)信號(hào)燈)
要想設(shè)計(jì)帶左轉(zhuǎn)信號(hào)的路口信號(hào)燈, 就必須先將圓餅信號(hào)燈的控制邏輯理解透徹.在本例的設(shè)計(jì)過(guò)程中, 我設(shè)計(jì)了本路口的信號(hào)控制邏輯: 南北直行放行 -> 東西直行放行 -> 南北左轉(zhuǎn)放行 -> 東西左轉(zhuǎn)放行, 若不考慮數(shù)碼管的顯示問題, 則只需對(duì)圓餅信號(hào)燈的控制程序稍加修改即可. 但在實(shí)際應(yīng)用中, 大部分的路口都配備了數(shù)字顯示數(shù)碼管, 用于顯示直行方向紅、黃、綠燈的倒計(jì)時(shí)秒數(shù), 以提升交通通行效率——所以, 在此很有必要將倒計(jì)時(shí)顯示功能加入到設(shè)計(jì)中.我將完整的信號(hào)控制邏輯繪制為下圖.在實(shí)際編程中, 由于我一開始并未將控制邏輯完全理清, 所以編寫的控制程序是在圓餅信號(hào)控制系統(tǒng)之上經(jīng)過(guò)修修補(bǔ)補(bǔ)完成的, 多少有點(diǎn)碰巧的成分.
發(fā)表于 2021-08-04
下一篇: PLC、DCS、FCS三大控
上一篇: 電氣控制線路圖控制原