#超聲波原理#
①超聲波測距原理:聲波反射原理
聲波分類:
超聲波測距原理
超聲波頻率越高,波長越短,反身性越強,衍射性越弱
②超聲波模塊原理
發射原理
跳線帽
接收原理
問題:
1.超聲波發射模塊需要一直發射嗎?
不需要,否則很難確定接收的回波對應哪一個發射波
所以我們一般發射較短時間
2.發射持續時間多久?
一般是5~8個周期,這個就大致取一個即可
若為5個周期,t=12us*10
程序設計:
一般用定時器0
①產生一個24us周期,占空比50%方波,持續時間五個周期
(高/低電平12us)
②發送完畢后開始計時,當檢測到P11引腳為低電平時停止計時(已接收到回波)
③開始計算距離
④若在測量范圍內無障礙物,則較長的時間未收到回波,則停止計時
將距離設為255cm,一般測距范圍是2m
s=0.017cm/us *t
超聲波wave.c代碼編寫
#include "main.h"
sbit TX=P1^0;//發射
sbit RX=P1^1;//接收
uchar distance;//定時器2不可以。使用定時器0
void Timer2_Init(void) //12微秒@12.000MHz
{T2MOD = 0; //初始化模式寄存器T2CON = 0; //初始化控制寄存器TL2 = 0xF4; //設置定時初始值TH2 = 0xFF; //設置定時初始值RCAP2L = 0xF4; //設置定時重載值RCAP2H = 0xFF; //設置定時重載值TR2 = 0; //先不 計時 定時器2開始計時ET2 = 1; //使能定時器2中斷TF2=0;//清除TF標志
}uchar distance_read()
{uchar distance;uchar num=10;//5個周期
//不發射超聲波,并設定初始時間TX=0;TL2 = 0xF4; //設置定時初始值TH2 = 0xFF; //設置定時初始值//開始計時TR2=1;while(num--){while(!TF2);//結束發射超聲波,TF2=1TX= ~TX;TF2=0;}//發射五個超聲波完成,停止計時,并且初始化定時初始值,開始計時,接收到的時間TR2=0;TL2 = 0x00; //設置定時初始值TH2 = 0x00; //設置定時初始值TR2=1;while(RX &&!TF2);//等待收到的脈沖(RX為低電平)和長時間未接受到脈沖//判斷溢出現象if(TF2){TF2=0;distance=255;}else{distance=((TH2<<8)|TL2)*0.017;//340/2=170m/s}return distance;
}void display()
{distance=distance_read();}void main()
{Timer2_Init();//12微秒@12.000MHzEA=1;while(1){display();}
}
wave.h代碼編寫
#ifndef __MAIN_H_
#define __MAIN_H_
#include "intrins.h"
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar distance_read();
void Timer2_Init(void); //12微秒@12.000MHz#endif
根據原理進行代碼編寫
最好知道原理代碼編寫,便于熟悉各個引腳的作用
根據定時器12us計時→發射器開始發射→5個周期→發射器停止發射進行代碼編寫
wave.c(方便但誤差較大版)
#include "wave.h"
sbit TX=P1^0;
sbit RX=P1^1;//5個周期12us
void Delay12us(void) //@12.000MHz
{unsigned char data i;_nop_();_nop_();i = 33;while (--i);
}void wave()
{uchar i;for(i=0;i<5;i++){TX=1;Delay12us();TX=0;Delay12us();}
}uchar read_distance()
{uchar distance;CMOD=0;CH=CL=0;wave();CR=1;while(RX &&!CF);CR=0;if(CF){CF=0;distance=255;}else{distance=((CH<<8)|CL)*0.017;}return distance;
}