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

}
相关推荐
Mr-pn-junction2 小时前
clk_gate
单片机·嵌入式硬件·fpga开发
尼喃6 小时前
662K和65Z5三脚稳压芯片PW6566,附引脚定义与典型电路图
嵌入式硬件
无相求码10 小时前
【C语言】字符串的本质是什么,为什么 strlen 会读到野内存
c语言·开发语言
李永奉10 小时前
杰理可视化SDK开发-【BUG】配置“TWS两边同时按消息使能”功能后,按键单击功能无效失灵
开发语言·单片机·嵌入式硬件·物联网·bug
执迷不悟82310 小时前
51单片机--中断/定时/PWM
单片机·嵌入式硬件·51单片机
LuminousCPP11 小时前
C 语言集中实践全记录:顺序表 + 单链表原理实现与通讯录项目实战【附可运行源码】
c语言·开发语言·数据结构·经验分享·笔记
SuperByteMaster12 小时前
__set_MSP 和__set_MSPLIM 接口区别
c语言
A小调的码农13 小时前
OPENOCD+MSYS+VSCODE:从“灯不亮“到“终于亮了“
ide·vscode·stm32·单片机·编辑器
AI的探索之旅13 小时前
让 Claude Code 直接操刀画原理图和 PCB:VSCode 插件接外部 API 全流程
linux·ide·vscode·嵌入式硬件·编辑器
CS创新实验室13 小时前
NumPy数组的C风格和Fortran风格
c语言·开发语言·numpy