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

news2024/12/24 10:22:52

目录

一、超声波工作原理

二、超声波电路图

三、程序设计

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 int
	
sbit 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--);
}

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

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

相关文章

计算属性,watch和watchEffect

计算属性-computed 什么是计算属性&#xff1a; computed函数&#xff0c;是用来定义计算属性的&#xff0c;计算属性不能修改。 模板内的表达式非常便利&#xff0c;但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护。 计算属性还可以依…

【目标检测论文阅读笔记】Extended Feature Pyramid Network for Small Object Detection

&#xff08;未找到代码&#xff0c;只有yaml文件&#xff09; Abstract. 小目标检测仍然是一个未解决的挑战&#xff0c;因为很难提取只有几个像素的小物体的信息。虽然特征金字塔网络中的尺度级对应检测缓解了这个问题&#xff0c;但我们发现各种尺度的特征耦合仍然会损害小…

百度飞桨paddlespeech实现小程序实时语音流识别

前言&#xff1a; 哈哈&#xff0c;这是我2023年4月份的公司作业。如果仅仅是简单的语音识别倒也没什么难度&#xff0c;wav文件直接走模型输出结果的事。可是注意标题&#xff0c;流式识别、实时&#xff01; 那么不得不说一下流式的优点了。 1、解决内存溢出的烦恼。 2、…

《论文阅读》Unified Named Entity Recognition as Word-Word Relation Classification

总结 将NER视作是word-word间的 Relation Classification。 这个word-word 间的工作就很像是TPlinker那个工作&#xff0c;那篇工作是使用token间的 link。推荐指数&#xff1a;★★★☆☆值得学习的点&#xff1a; &#xff08;1&#xff09;用关系抽取的方法做NER抽取 &…

佳明手表APP开发系列01——简单汉化英文版

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、佳明手表APP开发过程简介二、做个简单的个性化——在英文版写几个汉字1.MonkeyC 图形处理2.获得汉字点阵字模数据3.MonkeyC 汉字输出函数总结前言 佳明手表…

蓝海创意云应邀参与苏州市元宇宙生态大会

4月14日&#xff0c;苏州市软件行业协会元宇宙专委会成立大会暨元宇宙生态大会在苏成功举办。此次大会由苏州市工业和信息化局指导&#xff0c;苏州高新区&#xff08;虎丘区&#xff09;经济发展委员会、苏州市软件行业协会主办&#xff0c;蓝海彤翔集团作为协办单位参与此次大…

IDEA集成Git、GitHub、Gitee

一、IDEA 集成 Git 1.1、配置 Git 忽略文件 为什么要忽略他们&#xff1f; 与项目的实际功能无关&#xff0c;不参与服务器上部署运行。把它们忽略掉能够屏蔽 IDE 工具之间的差异。 怎么忽略&#xff1f; 创建忽略规则文件 xxxx.ignore&#xff08;前缀名随便起&#xff0c…

创建Google play开发者账号,并验证身份通过

一、注册前准备 最好准备一台没有怎么用过Google的电脑和&#x1fa9c;准备一个没有注册过Google的手机号准备一张信用卡或者借记卡&#xff08;需要支付$25&#xff09;&#xff0c;支持的类型如下图 这里还需注意&#xff1a;最后账号注册成功还需要验证身份也就是实名认证&…

关于Python爬虫的一些总结

作为一名资深的爬虫工程师来说&#xff0c;把别人公开的一些合法数据通过爬虫手段实现汇总收集是一件很有成就的事情&#xff0c;其实这只是一种技术。 初始爬虫 问题&#xff1a; 什么是爬虫&#xff1f; 网络爬虫是一种按照一定的规则&#xff0c;自动地抓取网络信息的程…

动态规划算法OJ刷题(3)

CC19 分割回文串-ii 问题描述 给出一个字符串s&#xff0c;分割s使得分割出的每一个子串都是回文串。计算将字符串s分割成回文串的最小切割数。例如:给定字符串s“aab”&#xff0c;返回1&#xff0c;因为回文分割结果[“aa”,“b”]是切割一次生成的。 解题思路 方法1&…

计算机操作系统(第四版)第四章存储器管理—课后习题答案

1.为什么要配置层次存储器&#xff1f; &#xff08;1&#xff09;设置多个存储器可以使存储器两端的硬件能并行工作。 &#xff08;2&#xff09;采用多级存储系统,特别是Cache技术,这是一种减轻存储器带宽对系统性能影响的最佳结构方案。 &#xff08;3&#xff09;在微处理机…

《Java8实战》第5章 使用流

上一章已经体验到流让你从外部迭代转向内部迭代。 5.1 筛选 看如何选择流中的元素&#xff1a;用谓词筛选&#xff0c;筛选出各不相同的元素。 5.1.1 用谓词筛选 filter 方法&#xff0c;该操作会接受一个谓词&#xff08;一个返回boolean 的函数&#xff09;作为参数&am…

MySQL数据库:聚合函数、分组查询、约束、默认值设置、自增属性

一、聚合函数 1.聚合函数 在MySQL数据库中预定义好的一些数据统计函数。 2.count(*) 功能&#xff1a;统计结果条数。 3.sum(字段名) 功能&#xff1a;对指定字段的数据求和。 4.avg(字段名) 功能&#xff1a;对指定字段的数据求平均值。 5.max(字段名) 和 min(字段名) …

正则化的基本认识

正则化(一) 拟合与欠拟合(二) 正则化的目的(三) 惩罚项&#xff08;3.1&#xff09;常用的惩罚项&#xff1a;&#xff08;3.2&#xff09;L-P范数&#xff1a;&#xff08;3.3&#xff09;L1与L2的选择&#xff1a;(一) 拟合与欠拟合 欠拟合&#xff1a; 是指测试级与训练集都…

docker目录映射

docker 常用命令 docker ps // 查看所有正在运行容器 docker stop containerId // containerId 是容器的ID docker ps -a // 查看所有容器 $ docker ps -a -q // 查看所有容器ID docker stop $(docker ps -a -q) // stop停止所有容器 docker rm $(docker ps -a -q) // remove删…

受害者有罪论——如何反驳

目录 一、那些「受害者有罪论」的说法 二、「受害者有罪论」的潜台词 三、如何反驳 反驳1&#xff1a;让受害者有罪论者感同身受 反驳2&#xff1a;说理 反驳3&#xff1a; 直接指出结论的错误 反驳4&#xff1a;与对方无关&#xff0c;不用多费唇舌 四、罪犯就是罪犯&…

golang-gin框架入门

基础 快速入门 gin完整支持路由框架支持全局异常&#xff08;错误&#xff09;处理内置渲染高可扩展 组件 在gin框架中四个基本组件是&#xff1a; Engine&#xff1a;是web server的根数据结构&#xff0c;也是基础容器&#xff1b;它包含复用器、中间件和配置设置。类似S…

GC 垃圾回收算法、垃圾回收器及 JVM 调优【JVM知识点-resu】

JVM知识点 详情请见&#xff1a;垃圾回收算法、垃圾收集器详情请见&#xff1a;JVM调优 1 GC垃圾回收算法 众所周知&#xff0c;Java的内存管理是交由了JVM&#xff0c;那么程序时时刻刻都在产生新对象&#xff0c;为了避免内存溢出&#xff0c;此时必然会涉及到垃圾回收&…

【MySQL数据库原理】Python3.7 中连接 MySQL 数据库

目录 1、安装mysql-connector-python2、连接 MySQL 数据库3、修改数据库1、安装mysql-connector-python 要在 Python 中连接 MySQL 数据库 “test”,可以使用 “mysql-connector-python” 包。首先,确保已经安装了该包。可以使用 pip 命令进行安装: pip install mysql-con…

[abc复盘] abc297 20230409

[atc复盘] abc297 20230409 一、本周周赛总结A - Double Click1. 题目描述2. 思路分析3. 代码实现B - chess9601. 题目描述2. 思路分析3. 代码实现C - PC on the Table1. 题目描述2. 思路分析3. 代码实现D - Count Subtractions1. 题目描述2. 思路分析3. 代码实现E - Kth Takoy…