超声波测距传感器认知

news2024/11/16 21:24:54

目录

一、超声波测距传感器认知

二、从零编程实现超声波测距 

三、项目——感应开关盖垃圾桶

1、开发步骤

2、感应开关盖垃圾桶代码测试


一、超声波测距传感器认知

超声波测距模块是用来测量距离的一种产品,通过发送和接收超声波,利用时间差和声音传播速度,计算出模块到前方障碍物的距离

接线参考:模块除了两个电源引脚外,还有TRIG、ECHO引脚,这两个引脚分别接我们开发板的P1.5和P1.6端口

TRIG引脚:  发送波的引脚

ECHO引脚:接收波的引脚

怎么让它发送波

Trig,给Trig端口至少10μs的高电平

怎么知道开始发波

Echo,由低电平跳转到高电平,表示开始发送波

怎么让它接收了返回波

Echo,由高电平转回低电平,表示波回来了

怎么算时间

波发出去的那一下,开始启动定时器

波回来的那一下,我们停止定时器,计算出中间经过多少时间

怎么算距离

距离 = (速度(340m/s)*  高电平时间)/ 2

超声波的时序图

二、从零编程实现超声波测距 

#include "reg52.h"

//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5 = P3^7;
sbit D6 = P3^6;
sbit Trig = P1^5;
sbit Echo = P1^6;

void Delay10us()		//@11.0592MHz
{
	unsigned char i;
	i = 2;
	while (--i);
}
void Time0Init(){
	
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	TL0 = 0;		    //设置定时初值
	TH0 = 0;		    //设置定时初值
	//设置定时器0工作模式1,初始值设定0开始数数
}
void startHC(){	
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;
}

void main()
{
	double time;
	double dis;
	Time0Init();
	while(1){
		//1、给Trig端口至少10μs的高电平
		startHC();
		//2、由低电平跳转到高电平,表示开始发送波
		while(Echo == 0);
		//3、波发出去时,开启定时器
		TR0 = 1;
		//4、由高电平跳转到低电平,表示接收波
		while(Echo == 1);
		//5、波回来那一下,我们停止定时器
		TR0 = 0;
		//6、计算出中间经过多长时间
		time = (TH0 * 256 + TL0) * 1.085;  //μs为单位
		//7、距离 = 速度(340m/s)* 时间 /2
		//dis= 340m/s = 34000cm/s = 34cm/ms = 0.034cm/μs
		dis = time * (0.034/2);
		
		if(dis < 10){
			D5 = 0;
			D6 = 1;
		}else{
			D5 = 1;
			D6 = 0;
		}
		//定时器数据清零,以便下次测距
		TL0 = 0;		    //设置定时初值
		TH0 = 0;		    //设置定时初值
	}
}

三、项目——感应开关盖垃圾桶

1、开发步骤

1、舵机和超声波代码整合

        舵机用定时器0

        超声波用定时器1

        实现物体靠近后,自动开盖,2秒后关盖

2、查询的方式添加按键控制

3、查询的方式添加震动控制

4、使用外部中断0配合震动控制

2、感应开关盖垃圾桶代码测试

#include "reg52.h"

//距离小于10cm,D5亮,D6灭,反之相反现象
sbit D5       = P3^7;
sbit D6       = P3^6;
sbit Trig     = P1^5;
sbit Echo     = P1^6;
sbit sg90_con = P1^1;
sbit SW1      = P2^1;
sbit vibrate  = P3^2;  //添加震动传感器引脚
sbit beep     = P2^0;  //蜂鸣器引脚

char jd;
char jd_bak;           //记录上一个角度标记
char cnt = 0;
char mark_vibrate = 0;     //添加一个标记

void Delay2000ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	i = 15;
	j = 2;
	k = 235;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay150ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	i = 2;
	j = 13;
	k = 237;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void Delay10us()		//@11.0592MHz
{
	unsigned char i;
	i = 2;
	while (--i);
}

void Time0Init(){

	//1、配置定时器0工作模式位16位计时
	TMOD &= 0xF0;		//设置定时器模式
	TMOD |= 0x01;		//设置定时器模式
	//2、给定时器一个初值,每个周期都等于0.5ms
	TL0 = 0x33;
	TH0 = 0xFE;
	//3、定时器开始计时
	TR0 = 1;
	TF0 = 0;
	
	//4、打开中断定时器
	ET0 = 1;
	//5、设置总中断定时器
	EA = 1;	
}

void Time1Init(){
	
	TMOD &= 0x0F;		//设置定时器模式
	TMOD |= 0x10;		//设置定时器模式
	TL1 = 0;		    //设置定时初值
	TH1 = 0;		    //设置定时初值
	//设置定时器0工作模式1,初始值设定0开始数数
}

void startHC(){
	
	Trig = 0;
	Trig = 1;
	Delay10us();
	Trig = 0;	
}

double get_distance(){
	
	double time;
	//定时器数据清零,以便下次测距
	TL1 = 0;		    //设置定时初值
	TH1 = 0;		    //设置定时初值
	//1、给Trig端口至少10μs的高电平
	startHC();
	//2、由低电平跳转到高电平,表示开始发送波
	while(Echo == 0);
	//3、波发出去时,开启定时器
	TR1 = 1;
	//4、由高电平跳转到低电平,表示接收波
	while(Echo == 1);
	//5、波回来那一下,我们停止定时器
	TR1 = 0;
	//6、计算出中间经过多长时间
	time = (TH1 * 256 + TL1) * 1.085;  //μs为单位
	//7、距离 = 速度(340m/s)* 时间 /2
	//dis= 340m/s = 34000cm/s = 34cm/ms = 0.034cm/μs
	return (time * (0.034/2));
}

void openStatusLight(){
	D5 = 0;
	D6 = 1;
}

void closeStatusLight(){
	D5 = 1;
	D6 = 0;
}

void initSG90_0(){

	jd = 1;        //初始角度是0度,什么时候0度,刚好是0.5ms的高电平,也是定时器溢出1次
	cnt = 0;
	sg90_con = 1;  //刚开始给PWM信号一个高电平	
}

void openDusbin(){  //舵机开盖
	
	char n;
	jd = 3;      //90度,1.5ms的高电平
	if(jd_bak != jd){
		cnt = 0;     //每切换一次角度,都要重置cnt的值
		beep = 0;
		for(n=0;n<2;n++);
			Delay150ms();
		beep = 1;
		Delay2000ms();
	}
	jd_bak = jd;

}

void closeDusbin(){  //舵机关盖
	jd = 1;      //0度,1.5ms的高电平
	cnt = 0;     //每切换一次角度,都要重置cnt的值
	jd_bak = jd;
	Delay150ms();
}

void  EX0_Init(){   //打开外部中断函数
	//打开外部中断
	EX0 = 1;
	//低电平触发
	IT0 = 0;
}

void main()
{
	double dis;
	Time0Init();
	Time1Init();
	EX0_Init();
	
	//舵机的初始位置
	initSG90_0();
	
	while(1){
		//超声波测距
		dis = get_distance();
		if(dis < 10 || SW1 == 0 || mark_vibrate == 1){     //如果小于10cm,或者SW1按键被按下,或者vibrate震动
			//开盖,灯状态,D5亮
			openStatusLight();
			//舵机开盖
			openDusbin();
			mark_vibrate = 0;
		}else{
			//关盖,灯状态,D5灭
			closeStatusLight();
			//舵机关盖
			closeDusbin();		
		}
	}
}

void Time0Handler() interrupt 1   //定时器0的硬件中断号为 interrupt 1
{
	
	cnt ++;           //统计爆表的次数
	//给定时器重新定义初值,每个周期都等于0.5ms
	TL0 = 0x33;      
	TH0 = 0xFE;
	//控制PWM波形
	if(cnt < jd){
		sg90_con = 1;
	}else{
		sg90_con = 0;
	}
	
	if(cnt == 40){   //要爆表40次,经过了20ms
			cnt = 0;      //当100次表示1s,重新让cnt从0开始,计算下一次的1s
			sg90_con = 1;
	}
}

void Ex0_Handler() interrupt 0    //外部中断号为   interrupt 0 
{
	mark_vibrate = 1;
}

垃圾桶实体演示

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136645.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络】udp_socket编程

目录 1.认识端口号 1.1 理解端口号和进程ID 1.2 理解源端口号和目的端口号 2.认识TCP协议 3.认识UDP协议 4.网络字节序 5.socket编程接口 5.1socket常见API 5.2sockaddr结构 sockaddr结构 sockaddr_in 结构 in_addr结构 6.简单的UDP网络程序 6.1创建套接字 6.2 …

【Docker】三 镜像容器常用命令

这里写目录标题1 配置镜像加速器2 Docker镜像常用命令2.1 搜索镜像2.2 下载镜像[重要]2.3 列出镜像[重要]2.3 删除本地镜像[重要]2.4 保存镜像2.5 加载镜像2.6 构建镜像[重要]3 容器常用命令3.1 新建并启动容器[重要]3.2 列出容器[重要]3.3 停止容器[重要]3.4 强制停止容器[重要…

你可以不用Git,但不能不会Git(三)基础(下)

目录 一.将文件添加至忽略列 二.日志记录操作 三.比较文件差异 四.还原文件 一.将文件添加至忽略列 一般我们总会有些文件无需纳入Git的管理&#xff0c;也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件&#xff0c;比如日志文件&#xff0c;或者编译过程中…

重学 Java 设计模式-结构型模式-适配器模式

重学 Java 设计模式-结构型模式-适配器模式 内容摘自&#xff1a;添加链接描述 适配器模式介绍 图片来自&#xff1a;https://refactoringguru.cn/design-patterns/adapter(opens new window) 适配器模式的主要作用就是把原本不兼容的接口&#xff0c;通过适配修改做到统一。…

canva绘制(二次、三次)贝塞尔曲线并且图片在曲线上运动

下图为实现效果&#xff08;图片在三次贝塞尔曲线中运动&#xff09; <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…

Spring之注解开发

目录 一&#xff1a;Bean基本注解开发 二&#xff1a;Bean依赖注入注解开发 三&#xff1a;非自定义Bean注解开发 四&#xff1a;Bean配置类的注解开发 五&#xff1a;Spring配置其他注解 六&#xff1a;Spring注解的解析原理 一&#xff1a;Bean基本注解开发 Spring除了…

【区块链】区块链技术学习总结

文章目录一、区块链技术简介1.1 区块链概念1.2 区块链应用1.2.1 区块链1.0技术&#xff1a;比特币1.2.2 区块链2.0技术&#xff1a;以太坊1.2.3 区块链3.0技术&#xff1a;价值互联网二、区块链1.0技术比特币2.1 比特币2.1.1 比特币概念2.1.2 比特币性质2.1.3 比特币解决的问题…

Springboot扩展点之BeanDefinitionRegistryPostProcessor

前言通过这篇文章来大家分享一下&#xff0c;另外一个Springboot的扩展点BeanDefinitionRegistryPostProcessor&#xff0c;一般称这类扩展点为容器级后置处理器&#xff0c;另外一类是Bean级的后置处理器&#xff1b;容器级的后置处理器会在Spring容器初始化后、刷新前这个时间…

第二章 chrony服务器

文章目录第二章 chrony服务器1.1安装与配置1.2同步网络时间服务器1.3 配置时间服务器1.4 chronyc 命令1.5常见时区课后练习第一题&#xff1a;第一台机器从阿里云同步时间&#xff0c;第二台机器从第一台机器同步时间第二题&#xff1a;第一台服务器使用系统时间作为第二台服务…

jetson nano GPIO控制说明

文章目录一.GPIO介绍二.安装GPIO库python库C库三.几种常用的通信协议UARTPWMI2CI2SSPI四.控制函数说明python&#xff08;[参考](https://pypi.org/project/Jetson.GPIO/)&#xff09;C五.例程一.GPIO介绍 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输…

干货 | Web自动化测试中显式等待与隐式等待该怎么用?

在实际工作中等待机制可以保证代码的稳定性&#xff0c;保证代码不会受网速、电脑性能等条件的约束。等待就是当运行代码时&#xff0c;如果页面的渲染速度跟不上代码的运行速度&#xff0c;就需要人为的去限制代码执行的速度。在做 Web 自动化时&#xff0c;一般要等待页面元素…

高压放大器在电子束增材制造聚焦消像散控制技术研究的应用

实验名称&#xff1a;高压放大器在电子束增材制造聚焦消像散控制技术研究的应用 研究方向&#xff1a;增材制造 实验目的&#xff1a; 电子束选区熔化技术&#xff0c;即电子束3D打印技术&#xff0c;属于金属增材制造的分支。该技术以电子束为热源&#xff0c;在计算机控制下以…

华为防火墙配置笔记

防火墙&#xff08;Firewall&#xff09;也称防护墙&#xff0c;是由Check Point创立者Gil Shwed于1993年发明并引入国际互联网&#xff08;US5606668&#xff08;A&#xff09;1993-12-15&#xff09;防火墙是位于内部网和外部网之间的屏障&#xff0c;它按照系统管理员预先定…

实战工作十年的Code Review方法论与实践总结

作为卓越工程文化的一部分&#xff0c;Code Review其实一直在进行中&#xff0c;只是各团队根据自身情况张驰有度&#xff0c;松紧可能也不一&#xff0c;这里简单梳理一下CR的方法和团队实践。 一、为什么要CR 提前发现缺陷 在CodeReview阶段发现的逻辑错误、业务理解偏差、…

CleanMyMac2023Mac下载排行最好的清理工具

CleanMyMac是Mac清理工具&#xff0c;具有很多功能。例如‬&#xff0c;删除大量不可见的缓存文件&#xff0c;可以批量删除未使用的DMG、不完整的下载以及其余的旧包。不过由于MAC系统不像windows那样会产生缓存或系统垃圾&#xff0c; 使用Win电脑很多人会下载各类系统优化软…

MQ面试题总结

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java面试题…

【流行框架】Zookeeper

&#x1f31f;个人博客&#xff1a;www.hellocode.top&#x1f31f; &#x1f31f;Java知识导航&#xff1a;Java-Navigate&#x1f31f; ⭐想获得更好的阅读体验请前往Java-Navigate &#x1f525;本文专栏&#xff1a;《流行框架》 &#x1f31e;如没有JavaWEB基础&#xff0…

Linux文件目录结构详解

Linux文件目录结构 Linux文件系统是采用级层式的树状目录结构&#xff0c;在此结构中的最上层是根目录“/”&#xff0c;然后在此目录下再创建其他的目录 Linux系统下一切硬件皆文件 具体的目录结构 /bin ->存放最经常使用的指令/sbin ->存放系统管理员使用的系统管理…

从Redis、HTTP协议,看Nett协议设计,我发现了个惊天大秘密

1. 协议的作用 TCP/IP 中消息传输基于流的方式&#xff0c;没有边界 协议的目的就是划定消息的边界&#xff0c;制定通信双方要共同遵守的通信规则 2. Redis 协议 如果我们要向 Redis 服务器发送一条 set name Nyima 的指令&#xff0c;需要遵守如下协议 // 该指令一共有3…

第一章 R语言介绍

1.为何使用R 与起源于贝尔实验室的S语言类似&#xff0c;R也是一种为统计计算和绘图而生的语言和环境&#xff0c;它是一套开源的数据分析解决方案&#xff0c;由一个庞大且活跃的全球性研究型社区维护。但是&#xff0c;市面上也有许多其他流行的统计和制图软件&#xff0c;如…