超声波模块的使用
-
- 51单片机控制超声波模块
-
- [1. 软硬件条件](#1. 软硬件条件)
- [2. 超声波控制原理](#2. 超声波控制原理)
-
- [2.1 超声波测距原理](#2.1 超声波测距原理)
- [2.2 超声波模块工作原理](#2.2 超声波模块工作原理)
- [3. 接线](#3. 接线)
- [4. 代码实现](#4. 代码实现)
51单片机控制超声波模块
1. 软硬件条件
- 单片机型号:STC89C52RC
- 开发环境:KEIL4
- 烧录软件:stc-isp
- 超声波模块:HC-SR04
2. 超声波控制原理
2.1 超声波测距原理
超声波模块发出超声波,等待超声波碰撞到物体返回,由超声波模块接收,再经过简单计算后得出距离。
v 音速 = 340 m / s = 0.034 c m / u s L 距离 = S 波的路程 2 = 1 2 ∗ v 音速 ∗ t 总时长 c m v_{音速} = 340m/s = 0.034cm/us\\ L_{距离} = \frac{S_{波的路程}}{2} = \frac{1}{2} * v_{音速} * t_{总时长} cm v音速=340m/s=0.034cm/usL距离=2S波的路程=21∗v音速∗t总时长cm
2.2 超声波模块工作原理
操作顺序:
- 当要测距时,给trig引脚一个持续至少10us的高电平,等待echo引脚跳变为高电平。
- echo引脚跳变为高电平时表示发出超声波,等待echo引脚跳变为低电平。
- echo引脚跳变为低电平表示接收到发出的超声波,记录传播时间。
- 计算距离。
3. 接线
超声波模块 | 51单片机 |
---|---|
VCC | 5V |
GND | GND |
trig | P1.1 |
echo | P1.2 |
4. 代码实现
实现效果为:检测到的距离<= 10cm 灯亮;> 10cm 灯灭。
c
#include "reg52.h"
#include <intrins.h>
#define ON 1
#define OFF 0
#define TON 0
#define TOFF 1
sbit trig = P1^1;
sbit echo = P1^2;
sbit LED = P1^3;
sbit testLED1 = P3^7;
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void Delay200ms() //@11.0592MHz
{
unsigned char i, j, k;
_nop_();
i = 2;
j = 103;
k = 147;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
// 启动超声波
void startHC(){
trig = OFF;
trig = ON;
Delay10us();
trig = OFF;
testLED1 = TON;
}
void Timer0Init(){
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = 0x00;
TL0 = 0x00;
TF0 = 0;
ET0 = 0;
EA = 0;
TR0 = 0;
}
void init(){
testLED1 = TOFF;
LED = OFF;
trig = OFF;
echo = OFF;
Timer0Init();
Delay1000ms(); // 稳定系统
}
void main(){
float dis = 0;
float time = 0;
init();
while(1){
startHC();
while(!echo);
TR0 = ON;
while(echo);
TR0 = OFF;
time = 1.085 * (TH0 * 256 + TL0);
dis = 0.034 * time / 2;
if(dis <= 10){
LED = ON;
}
else if(dis > 10){
LED = OFF;
}
TL0 = 0;
TH0 = 0;
Delay200ms();
}
}