当前位置: 首页 > news >正文

蓝桥杯15单片机--超声波模块

目录

一、超声波工作原理

二、超声波电路图

三、程序设计

1-设计思路

2-具体实现

四、程序源码


一、超声波工作原理

超声波时间差测距原理超声波发射器向某一方向发射超声波,在发射时刻的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。

超声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离(s),即:s=340*t/2。这就是所谓的时间差测距法。

超声波测距的原理是利用超声波在空气中的传播速度为已知,测量声波在发射后遇到障碍物反射回来的时间,根据发射和接收的时间差计算出发射点到障碍物的实际距离。由此可见,超声波测距原理与雷达原理是一样的。测距的公式表示为:

                                                                       L = C x T

式中:L为测量的距离长度;C为超声波在空气中的传播速度;T为测量距离传播的时间差(T为发射到接收时间数值的一半)。

二、超声波电路图

我们用跳线帽把N A1引脚和P10引脚连接起来,把NB1引脚和P11引脚连接起来,这样就能用P10和P11两个引脚分别操控超声波发射和接收。

如果将NA2引脚和P10引脚连接,NB2和P11引脚连接,我们使用的就是电路板上红外线的发射接收模块。

三、程序设计

1-设计思路

  1、产生8个40KHz的超声波信号, 通过TX引脚发射出去。

  2、启动定时器,开始计时。

  3、等待超声波信号返回,如果接收到反射回来的信号,RX引脚变为低电平。

  4、停止定时器,读取脉冲个数,即获得时间T。

  5、根据公式,L = V*T/2m,进行距离的计算。

2-具体实现

我们默认每300ms进行一次超声波检测,这个300ms的检测我们用定时器2来完成即可。

在我们主函数中,如果检测到要开始进行超声波检测了,就要开始发送超声波信号(send_wave函数),也就是发送8次40KHZ的超声波信号。超声波信号是40KHZ,周期就是25微秒,正负周期各占一半(也就是TX口置0和置1的时间各占周期的一半,12.5微秒,13微秒即可)。所以我们要在正负信号后面加一个13微秒的延时。

但经过实际测量之后发现,由于电路中电容较多,存在误差,所以使用16微秒的延时会更好。(当然这个也不是唯一选择,可以根据自己实际情况选择)

发送完信号之后;就要开始用定时器进行计时。这里我们要用另一个定时器(定时器1),这里要注意的是:定时器时钟设置上要选择12T,其他程序用定时器选择1T即可。定时长度选择0。然后把程序中的TR1=1给注释掉(要在发送完信号之后开始计时)。

接着我们在主函数内进行检测:

如果RX没有接收到低电平(返回信号);并且检测中断标志位,没有溢出中断,就一直等待。

当检测到返回信号,或者一直没有接收到返回信号但是中断溢出了,程序就继续往下进行。首先进行判断,如果是一直没有接收到返回信号但是溢出中断了,就让距离等于9999,表示没有检测到返回信号了,数据超出范围。如果是另一种情况,也就是检测到了返回信号,

LCM_Time = TH1;
LCM_Time <<= 8;
LCM_Time |= TL1;

就读出超声波从发送到接收信号所用的时间LCM_Time,但这读出来的是定时器计数的值,所以下面我们要对其进行换算。

LCM=(uint)(LCM_Time*17/1000);

原因:定时器计数一次需要 1/1000000秒(1/12000000/12)(12M晶振),总共计数了 LCM_Time次,LCM_Time * 1/1000000 * 17000(34000/2) 距离单位是厘米。

最后,把计数值清零方便下次计数。    

TL1=0X00;
TH1=0X00;

四、程序源码

#include <STC15F2K60S2.H>
#include <intrins.H>#define uchar unsigned char
#define uint unsigned intsbit TX = P1^0;
sbit RX = P1^1;uchar code tab[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XBF,0XFF};
uchar Smg_num=0;
uchar Smg[]={0,7,10,5,6,10,1,2};unsigned int LCM_tt = 0 ;//超声波采集时间的计数 间隔多长时间进行一次超声波测量
bit LCM_Ref = 0 ;//超声波开始测量的标志位
unsigned int LCM = 0 ;//超声波测量的距离  单位:cm
unsigned int LCM_Time = 0 ;//超声波从发送到接收返回信号的时间void Allinit();
void Delayms(uint ms);
void Timer2Init(void);		//1毫秒@11.0592MHz
void Timer1Init(void);		//0微秒@12.000MHz
void Delay16us();		//@12.000MHz
void Send_wave();//发送超声波信号void main()
{Allinit();Timer2Init();Timer1Init();while(1){if(LCM_Ref==1){LCM_Ref=0;Send_wave();TR1=1;while((RX==1)&&(TF1==0));//如果RX没有接收到低电平(返回信号),就一直等待;或者检测中断标志位,没有溢出中断//当检测到返回信号,或者一直没有接收到返回信号但是中断溢出了,程序就继续往下进行。TR1=0;if(TF1==1)//这种情况是 一直没有接收到返回信号但是溢出中断了{TF1=0; LCM=999;//表示没有检测到返回信号了,数据超出范围}else{LCM_Time = TH1;LCM_Time <<= 8;LCM_Time |= TL1;//读出超声波从发送到接收信号所用的时间,但这读出来的是定时器计数的值,所以下面我们要对其进行换算LCM=(uint)(LCM_Time*17/1000);//定时器计数一次需要 1/1000000秒(1/12000000/12)(12M晶振),总共计数了 LCM_Time次//LCM_Time * 1/1000000 * 17000(34000/2) 距离单位是厘米}TL1=0X00;TH1=0X00;//清零方便下次计数	}Smg[5]=LCM/100;Smg[6]=LCM%100/10;Smg[7]=LCM%10;}
}void Timer1Init(void)		//0微秒@12.000MHz
{AUXR &= 0xBF;		//定时器时钟12T模式TMOD &= 0x0F;		//设置定时器模式TL1 = 0x00;		//设置定时初始值TH1 = 0x00;		//设置定时初始值TF1 = 0;		//清除TF1标志//TR1 = 1;		//定时器1开始计时
}void Send_wave()//发送超声波信号
{uchar i=8;do{TX=1;  Delay16us();TX=0;  Delay16us();}while(i--);
}void Delay16us()		//@12.000MHz
{unsigned char i;_nop_();_nop_();i = 45;while (--i);
}void timer2() interrupt 12
{P2|=0XC0;P2&=0XDF;P0=(1<<Smg_num);P2|=0XE0;P2&=0XFF;P0=tab[Smg[Smg_num]];if(++Smg_num==8) Smg_num=0;if(++LCM_tt==699)//每三百毫秒进行一次超声波检测  999的时候数据可以上 60cm,499的时候数据可以上 50cm{LCM_tt=0;LCM_Ref=1;}
}void Timer2Init(void)		//1毫秒@11.0592MHz
{AUXR |= 0x04;		//定时器时钟1T模式T2L = 0xCD;		//设置定时初始值T2H = 0xD4;		//设置定时初始值AUXR |= 0x10;		//定时器2开始计时IE2|=0X04;EA=1;
}void Allinit()
{P2=0XA0;P0=0X00;P2=0X80;P0=0XFF;P2=0XC0;P0=0XFF;P2=0XE0;P0=0XFF;
}void Delayms(uint ms)
{uint i,j;for(i=ms;i>0;i--)for(j=845;j>0;j--);
}

相关文章:

蓝桥杯15单片机--超声波模块

目录 一、超声波工作原理 二、超声波电路图 三、程序设计 1-设计思路 2-具体实现 四、程序源码 一、超声波工作原理 超声波时间差测距原理超声波发射器向某一方向发射超声波&#xff0c;在发射时刻的同时开始计时&#xff0c;超声波在空气中传播&#xff0c;途中碰到障碍…...

【学习笔记】ARC159

D - LIS 2 因为没有让你求方案数&#xff0c;所以还是比较好做的。 如果每一个连续段都退化成一个点&#xff0c;那么答案就是直接求 L I S LIS LIS。 否则&#xff0c;假设我们选了一些连续段把它们拼起来形成答案&#xff0c;显然我们有 r i 1 ≥ l i r_{i1}\ge l_i ri1​…...

2023/4/16总结

图的存储 链式前向星 链式前向星和邻接表很相似&#xff0c;只是存储方式变成了数组。 链式前向星一般要用到一个结构体数组和一个一维数组,结构体数组edges中包括三个变量。结构体数组的大小一般由边的大小决定。 edges数组中的to代表的是某条边的终点v。w代表的是这条边的…...

【剑指offer】常用的数据增强的方法

系列文章目录 BN层详解 梯度消失和梯度爆炸 交叉熵损失函数 反向传播 1*1卷积的作用 文章目录 系列文章目录常用的数据增强的方法示例代码 常用的数据增强的方法 数据增强是指通过对原始数据进行一系列变换来生成更多的训练数据&#xff0c;从而提高模型的泛化能力。常用的数…...

/lib/lsb/init-functions文件解析

零、背景 在玩AppArmor的时候涉及到了/etc/init.d/apparmor&#xff08;无论是sudo /etc/init.d/apparmor start还是sudo systemctl start apparmor.service&#xff09;&#xff0c;而这个文件又涉及到了另一个文件、也就是本文的主角&#xff1a;/lib/lsb/init-functions。 …...

【ChatGPT】ChatGPT-5 强到什么地步?

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 ChatGPT-5 强到什么地步&#xff1f; 技术 深度学习模型的升级 更好的预测能力 自适应学习能力 特点 语言理解能力更强 自我修正和优化 更广泛的应用领域 应用 对话系统 智能写作…...

[ARM+Linux] 基于全志h616外设开发笔记

修改用户密码 配置网络 nmcli dev wifi 命令扫描周围WIFI热点 nmcli dev wifi connect xxx password xxx 命令连接WiFi 查看ip地址的指令&#xff1a; ifconfig ip addr show wlan0 SSH登录 这是企业开发调试必用方式&#xff0c;比串口来说不用接线&#xff0c;前提是接入网络…...

如何实现24小时客户服务

许多企业都有着这样的愿望&#xff1a;在不增加客服人员的同时能实现24小时客户服务。 那么有没有什么方法可以实现这一想法呢&#xff1f;在想解决方案之前我们可以先来谈谈客服的作用。 客服的作用主要为以下2点&#xff1a; 帮助用户更快地了解产品&#xff08;减轻产品的…...

查询数据库空间(mysql和oracle)

Mysql版 1、查看所有数据库容量大小 -- 查看所有数据库容量大小 SELECTtable_schema AS 数据库,sum( table_rows ) AS 记录数,sum(TRUNCATE ( data_length / 1024 / 1024, 2 )) AS 数据容量(MB),sum(TRUNCATE ( index_length / 1024 / 1024, 2 )) AS 索引容量(MB) FROMinfor…...

为什么 SQLite 一定要用 C 语言来开发?

SQLite 是一种专门为在 Unix 和类 Unix 操作系统上运行的 Linux 服务器应用程序而设计的数据库管理系统&#xff0c;是一种轻量级的关系型数据库管理系统&#xff0c;它适用于许多嵌入式设备和物联网设备。它使用 C 语言编写&#xff0c;并且是一个开源项目。 简单易用&#x…...

TensorFlow Lite,ML Kit 和 Flutter 移动深度学习:6~11

原文&#xff1a;Mobile Deep Learning with TensorFlow Lite, ML Kit and Flutter 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的…...

你的GPT跟ChatGPT可能只差了一个DPU

“人类永远不会嫌网络太快&#xff0c;就像永远不会嫌高铁太快&#xff0c;你只会嫌它慢&#xff0c;希望它更快些。” 一个月内&#xff0c;百度、阿里、腾讯、商汤、讯飞、360等国内大厂扎堆发布“中国版 GPT ”&#xff0c;这家的名字还没记清楚&#xff0c;另一家的又蹦了出…...

springboot服务端接口外网远程调试,并实现HTTP服务监听 - 内网穿透

文章目录 前言1. 本地环境搭建1.1 环境参数1.2 搭建springboot服务项目 2. 内网穿透2.1 安装配置cpolar内网穿透2.1.1 windows系统2.1.2 linux系统 2.2 创建隧道映射本地端口2.3 测试公网地址 3. 固定公网地址3.1 保留一个二级子域名3.2 配置二级子域名3.2 测试使用固定公网地址…...

NumPy的应用-1

准备工作 在Python中使用NumPy时&#xff0c;需要先安装NumPy。可以使用以下命令来安装NumPy&#xff1a; pip install numpy安装完成后&#xff0c;在Python中引入NumPy&#xff1a; import numpy as np安装完成并引入NumPy后&#xff0c;我们可以开始使用NumPy进行数据分析…...

k8s的yaml文件中kind类型详解

在Kubernetes&#xff08;k8s&#xff09;的YAML语法中&#xff0c;kind是一种重要的关键字&#xff0c;它用于指定Kubernetes资源的类型。根据Kubernetes官方文档&#xff0c;以下是kind可能的取值&#xff1a; Deployment&#xff1a;用于定义应用程序的声明式更新。Statefu…...

第三天:C语言控制结构

目录 1. 条件语句 2. 循环语句 3. 实例&#xff1a;计算阶乘 在前两天的学习中&#xff0c;您已经掌握了C语言的基本知识。今天&#xff0c;我们将学习C语言的控制结构&#xff0c;包括条件语句和循环语句。通过控制结构&#xff0c;您可以实现程序的分支和循环&#xff0c;…...

访问若依vue版后端api接口

访问若依vue版后端api接口 如何使用Talend API Tester进行访问若依vue-前后端分离版的后端api接口&#xff1f; 方法一&#xff1a; 写好一个后台api接口&#xff0c;启动项目 直接使用Talend API Tester进行访问后台api出现如下错误&#xff0c;原因是因为若依系统有jwt认证…...

另一种迁移xxl-job任务的方法,适合不满足数据迁移条件

以为多个项目组同时使用一个xxl-job&#xff0c;同时涉及到版本提升&#xff0c;由此不太满足数据库数据迁移&#xff0c;所以这里提供另一种解决办法 使用工具&#xff1a;postman,json转excel&#xff0c;excel 核心&#xff1a;excel拼接&#xff1a; 1.使用f12抓取xxl任务访…...

Redis缓存穿透、击穿、雪崩面试题详解

缓存穿透 问题&#xff1a; 指的是客户端请求的数据在缓存中找不到&#xff0c;数据库中也没有存储&#xff0c;客户端还不断的发起请求。这样每次都无法在数据库查询到&#xff0c;缓存中永远没有这个数据。 ​ 这样的话&#xff0c;客户端一直去访问&#xff0c;会给后端数据…...

【网络安全】本地提权漏洞分析

0. 前言 CVE-2023-21752 是 2023 年开年微软第一个有 exploit 的漏洞&#xff0c;原本以为有利用代码会很好分析&#xff0c;但是结果花费了很长时间&#xff0c;难点主要了两个&#xff1a;漏洞点定位和漏洞利用代码分析&#xff0c;欢迎指正。 1. 漏洞简介 根据官方信息&a…...

HunterPie完全指南:3分钟掌握《怪物猎人世界》终极覆盖层工具

HunterPie完全指南&#xff1a;3分钟掌握《怪物猎人世界》终极覆盖层工具 【免费下载链接】HunterPie-legacy A complete, modern and clean overlay with Discord Rich Presence integration for Monster Hunter: World. 项目地址: https://gitcode.com/gh_mirrors/hu/Hunte…...

GD32C10x 标准库 EXTI 驱动源码深度解析

前言 在 GD32C10x 单片机开发中,外部中断 EXTI是实现外设异步响应、按键检测、电平触发等功能的核心外设,几乎所有嵌入式项目都会用到 EXTI。 兆易创新提供的 GD32C10x 标准库中,gd32c10x_exti.c是 EXTI 外设的底层驱动文件,封装了 EXTI 初始化、中断使能、标志位操作、软…...

嵌入式Linux信号量实战:多线程互斥点灯程序设计与实现

1. 项目概述与核心思路最近在整理嵌入式Linux开发笔记时&#xff0c;翻到了一个挺有意思的小项目&#xff1a;用Linux信号量来实现一个互斥的点灯程序。听起来可能有点“杀鸡用牛刀”的感觉&#xff0c;毕竟点个灯用个全局变量或者简单的标志位也能搞定。但这个小项目背后的价值…...

在Windows上直接安装APK的完整指南:告别模拟器时代

在Windows上直接安装APK的完整指南&#xff1a;告别模拟器时代 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 你是否曾想过&#xff0c;在Windows电脑上直接运行Andro…...

Audacity音频编辑:从新手到专业创作者的免费音频处理方案

Audacity音频编辑&#xff1a;从新手到专业创作者的免费音频处理方案 【免费下载链接】audacity Audio Editor 项目地址: https://gitcode.com/GitHub_Trending/au/audacity 你是否曾经想过编辑一段音频&#xff0c;却因为昂贵的软件而却步&#xff1f;或者想要录制播客…...

金融技能学习路径:从财务基础到Python建模的实战指南

1. 项目概述&#xff1a;为什么我们需要一个“金融技能”清单&#xff1f;如果你在金融行业工作&#xff0c;或者对个人理财、投资分析、公司财务感兴趣&#xff0c;你大概率有过这样的经历&#xff1a;面对海量的在线课程、书籍、论坛帖子和工具推荐&#xff0c;感到无所适从。…...

SteamVR Unity插件实战:构建跨平台VR交互系统的完整方案

SteamVR Unity插件实战&#xff1a;构建跨平台VR交互系统的完整方案 【免费下载链接】steamvr_unity_plugin SteamVR Unity Plugin - Documentation at: https://valvesoftware.github.io/steamvr_unity_plugin/ 项目地址: https://gitcode.com/gh_mirrors/st/steamvr_unity_…...

如何在Windows上快速安装ViGEmBus虚拟手柄驱动:终极指南

如何在Windows上快速安装ViGEmBus虚拟手柄驱动&#xff1a;终极指南 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 想要在Windows电脑上畅玩所有游戏&#…...

InsForge:基于Python的Instagram内容自动化创作与发布工具全解析

1. 项目概述与核心价值最近在折腾一个挺有意思的开源项目&#xff0c;叫InsForge。这名字听起来有点“工业锻造”的味道&#xff0c;实际上&#xff0c;它是一个专注于Instagram内容创作与自动化的工具集。简单来说&#xff0c;它试图帮你解决在Instagram上创作、发布、管理内容…...

终极免费城通网盘直连解析工具:告别下载限速的完整指南

终极免费城通网盘直连解析工具&#xff1a;告别下载限速的完整指南 【免费下载链接】ctfileGet 获取城通网盘一次性直连地址 项目地址: https://gitcode.com/gh_mirrors/ct/ctfileGet 还在为城通网盘下载速度慢、等待时间长而烦恼吗&#xff1f;ctfileGet是一款专为城通…...