一.前言
HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可達高到3mm;模塊包括超聲波發射器、接收器與控制電路。像智能小車的測距以及轉向,或是一些項目中,常常會用到。智能小車測距可以及時發現前方的障礙物,使智能小車可以及時轉向,避開障礙物,所以,我們今天就來學習一下這個傳感器。
二.工作原理
1.給超聲波模塊接入電源和地。
2.給脈沖觸發引腳(trig)輸入一個長為20us的高電平方波
3.輸入方波后,模塊會自動發射8個40KHz的聲波,與此同時回波引腳(echo)端的電平會由0變為1;(此時應該啟動定時器計時)
4.當超聲波返回被模塊接收到時,回波引 腳端的電平會由1變為0;(此時應該停止定時器計數),定時器記下的這個時間即為超聲波由發射到返回的總時長。
5.根據聲音在空氣中的速度為344米/秒,即可計算出所測的距離。
要學習和應用傳感器,學會看懂傳感器的時序圖是很關鍵的,所以我們來看一下HC-SR04的時序觸發圖。
我們來分析一下這個時序圖,先由觸發信號啟動HC-RS04測距模塊,也就是說,主機要先發送至少10us的高電平,觸發HC-RS04,模塊內部發出信號是傳感器自動回應的,我們不用去管它。輸出回響信號是我們需要關注的。信號輸出的高電平就是超聲波發出到重新返回接收所用的時間。用定時器,可以把這段時間記錄下來,算出距離,別忘了結果要除於2,因為總時間是發送和接收的時間總和。
三.程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit Echo=P3^2;
sbit Trig=P1^5;
bit flag=0;
/*********************************** 函數:void Delay5us() ---------------------- 說明:5微秒延時函數 參數:無 返回值:無 ***********************************/
void Delay5us()
{ uchar i; i--; i--; i--; i--; i--; i--; }
void DelayMs(uint ms)
{ uint x,y; for(x=ms;x>0;x--)
for(y=110;y>0;y--); }
void Init()
{
TMOD=0x21;
SCON = 0x50;
EA=1;
ES=1;
ET0=1;
ET1=1;
TH1=0Xfd;
TL1=0xfd;
TR1=1;
}
void Send(uint dat)
{
SBUF=(dat/100)+ 48; // 發送 百 位
while(!TI);
TI=0;
SBUF=(dat%100/10)+48; // 發送 十 位
while(!TI); TI=0;
SBUF=(dat%10)+48; // 發送 個 位
while(!TI); TI=0;
}
uint Conut(void)
{
uint time; // 用於記錄測得的時間
uint ss; // 用於記錄測得的距離
time = (TH0*256+TL0)*1.09; // 總時間
TH0=0; TL0=0;
if(flag==1) // 如果超出測量距離,則不傳輸數據
{ flag=0; ss=0; }
else
{
ss=time*1.7/100; // 空氣中聲音的速度是340m/s
}
return ss; }
void main(void) {
uint ss; Init();
while(1)
{
Trig=1;
Delay5us();
Delay5us();
Trig=0;
while(!Echo);
TR0=1;
while(Echo);
TR0=0;
ss=Conut(); // 計算
Send(ss); // 將計算的值通過串口發送出去
DelayMs(800);
}
四.總結
上面這個程序的功能就是從測距傳感器獲得距離的數值,進行單位的轉化后用串口進行輸出,顯示在串口助手中,轉化后的單位為厘米,還有一點需要注意的是,觸發輸入和回響輸出端在不同的板子上是不一樣的,大家要根據自己的原理圖及單片機自己修改,有什么問題可以互相交流0.0
}
void zd0() interrupt 1 { flag=1; }