51单片机基础8——单片机控制超声波模块

超声波模块的使用

    • 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 超声波模块工作原理

操作顺序:

  1. 当要测距时,给trig引脚一个持续至少10us的高电平,等待echo引脚跳变为高电平。
  2. echo引脚跳变为高电平时表示发出超声波,等待echo引脚跳变为低电平。
  3. echo引脚跳变为低电平表示接收到发出的超声波,记录传播时间。
  4. 计算距离。

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();
	}

}
相关推荐
A懿轩A20 分钟前
C/C++ 数据结构与算法【数组】 数组详细解析【日常学习,考研必备】带图+详细代码
c语言·数据结构·c++·学习·考研·算法·数组
半盏茶香25 分钟前
在21世纪的我用C语言探寻世界本质 ——编译和链接(编译环境和运行环境)
c语言·开发语言·c++·算法
字节高级特工1 小时前
【C++】深入剖析默认成员函数3:拷贝构造函数
c语言·c++
计算机学长大白2 小时前
C中设计不允许继承的类的实现方法是什么?
c语言·开发语言
yutian06066 小时前
Keil MDK下载程序后MCU自动重启设置
单片机·嵌入式硬件·keil
XH华8 小时前
初识C语言之二维数组(下)
c语言·算法
析木不会编程9 小时前
【小白51单片机专用教程】protues仿真独立按键控制LED
单片机·嵌入式硬件·51单片机
Uu_05kkq11 小时前
【C语言1】C语言常见概念(总结复习篇)——库函数、ASCII码、转义字符
c语言·数据结构·算法
枯无穷肉13 小时前
stm32制作CAN适配器4--WinUsb的使用
stm32·单片机·嵌入式硬件
不过四级不改名67713 小时前
基于HAL库的stm32的can收发实验
stm32·单片机·嵌入式硬件