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

}
相关推荐
励志成为嵌入式工程师6 分钟前
c语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq43 分钟前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hairenjing11232 小时前
使用 Mac 数据恢复从 iPhoto 图库中恢复照片
windows·stm32·嵌入式硬件·macos·word
hikktn2 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错2 小时前
C语言扫雷小游戏
c语言·开发语言·算法
模拟IC攻城狮3 小时前
华为海思招聘-芯片与器件设计工程师-模拟芯片方向- 机试题-真题套题题目——共8套(每套四十题)
嵌入式硬件·华为·硬件架构·芯片
IT B业生3 小时前
51单片机教程(六)- LED流水灯
单片机·嵌入式硬件·51单片机
一枝小雨3 小时前
51单片机学习心得2(基于STC89C52):串口通信(UART)
单片机·嵌入式硬件·51单片机
IT B业生4 小时前
51单片机教程(一)- 开发环境搭建
单片机·嵌入式硬件·51单片机
小林熬夜学编程5 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法