蓝桥杯-单片机基础13——完美代码:官方开发板超声波传感器详解(超声波传感器CX20106A)

蓝桥杯单片机组备赛指南请查看 :本专栏第1篇文章

本文章针对蓝桥杯-单片机组比赛开发板所写,代码可直接在比赛开发板上使用。

型号:国信天长4T开发板(绿板),芯片:IAP15F2K61S2

(使用国信天长蓝板也可以完美兼容,与绿板几乎无差别)


1. 代码目的

分别采用软件延时与中断两种方式

实现正确设置超声波,并将障碍物距离超声波模块的距离折算成cm显示在数码管上。

数码管显示格式如下:

S12
标识无用位熄灭数据位

表示距离为12cm,其中开发板数码管为共阳极连接,符号S的采用数字5表示

2. 命题现状

        官方开发板使用的超声波传感器为:CX20106A。该芯片与常见的HC-SR04不同。   

        20年以前的资料,大家都会说该模块省赛不考,但却是国赛的重点

        21年省赛成功考了,因此大家需要在省赛掌握该模块

        目前市面上的蓝桥杯超声波代码,基本都是基于小蜜蜂老师的程序,采用软件延时的方式近似产生周期为40Khz的方波,本文将提供采用定时计数器方式的代码。

3. 超声波测距原理

        超声波的原理很好理解,通过TX引脚连续发送8个40Khz(周期25us)的方波信号,当信号碰到障碍物便会反射回来被接收,模块自动将RX引脚置为低电平。我们利用定时计数器获取发出信号与接收信号的时间差,乘以声速并除以2便可得到距离。

CX20106A芯片要求发送信号为38KHZ~41KHZ,大部分教程建议取40Khz。

其计算公式如下:

Distance = \Delta t * V_{ultrasonic} * \frac{1}{2}

其中:

        Distance表示距离,

        \Delta t表示发出信号与接收到信号的时间差,

        V_{ultrasonic}表示声波的传播速度,一般取340M/S。

同时我们的比赛开发板采用11.0592Mhz,经过12分频后,定时计数器加1为1.085us.

带入计算,并且将单位折算为cm,我们可以得到超声波最终的计算表达式为:

Distance = 0.0184 * 计数值   (cm)

8个40Khz的波形实现:

方法:

        比较常见的方法是,利用for循环写8次循环,在一次循环中将TX引脚置为高电平,软件延时13~14us,再将TX引脚置为低电平,软件延时13~14us。从而在一次for循环后,发出了一个周期为26~28us的矩形波。循环8次即发送了8个矩形波信号。

        实际测试中,14us的软件延时最完美

出现的问题(可以不看):

        因为方法1会造成8*26us=2.08ms的软件延时,对于数码管或其他外设而言可能会耽误工作时序。因此我们可以采用定时计数器去产生标准12.5us的中断,进行方波信号的发送。当定时值达到12.5us的整数倍时,中断产生,即取反一次TX引脚。共定时12.5*8*2=200us时进行定时,信号发送完成。

        但其实2.08ms的软件延时,基本不对数码管造成显著影响。且iic等底层通信有自己的时序,很少产生负面影响。为了节省单片机定时计数器个数,因此忽略该影响

关于定时计数器:

        理论上,假设我们的超声波发出去,不论距离多远只要碰到障碍物都会反射回来。那我们可以测量的范围只由定时计数器的工作方式决定

        当工作在方式0,13位计数器,最大计数值为8192,则最远可以8192*0.0184=150cm

        当工作在方式1,16为计数器,最大计数值65536,则最远可以1205cm

        当工作在方式2,8位计数器,最大计数值256,则最远可以4cm

经过实际测试,只有方式0是比较适合我们实际使用的,因此都采用方式0

        问题(数码管闪烁原因):如果超声波正常反射并被接收,则等待接收数据的过程较短,不影响数码管的动态显示。但是当没有接收到反射的超声波时,程序等待时长会达到8192*1.085=8.888ms,这个时间会让数码管产生明显的闪烁。因此,我们需要研究如何使用中断方式。但是在蓝桥杯比赛中,开发板上并未将中断的引脚进行连接,因此未接收到信号时的闪烁问题,可以忽略。本文将在末尾提出闪烁的解决方案,供大家一起学习

4. 函数实现参考

软件延时发送超声波:

轮询方式判断是否有超声波信号返回:

5. 开发板原理图介绍(可以不看)

N_B1为超声波模块CX20106A发射端接口,通过跳线帽与TX(P11)引脚相连:

N_A1为超声波模块CX20106A接收端接口,通过跳线帽与RX(P10)引脚相连:

6. 全代码参考

6.1 传统软件延时方法

        采用传统软件延时方案的超声波数据显示:

#include <reg52.h>
#include <intrins.h>

sbit AUXR = 0x8e;
sbit TX = P1^0;
sbit RX = P1^1;

void SMGrunning ();

unsigned char code duanma[18]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
											0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f};

void select_HC573 ( unsigned char channal )
{
	switch ( channal )
	{
		case 4:
			P2 = ( P2 & 0x1f ) | 0x80;
		break;
		case 5:
			P2 = ( P2 & 0x1f ) | 0xa0;
		break;
		case 6:
			P2 = ( P2 & 0x1f ) | 0xc0;
		break;
		case 7:
			P2 = ( P2 & 0x1f ) | 0xe0;
		break;
	}
}

void state_SMG ( unsigned char pos_SMG , unsigned char value_SMG )
{
	select_HC573 ( 7 );
	P0 = 0xff;
	
	select_HC573 ( 6 );
	P0 = 0x01 << pos_SMG;
	select_HC573 ( 7 );
	P0 = value_SMG;
}
	
void state_SMG_all ( unsigned char value_SMG_all )
{
	select_HC573 ( 6 );
	P0 = 0xff;
	select_HC573 ( 7 );
	P0 = value_SMG_all;	
}

void init_sys ( )
{
	select_HC573 ( 4 );
	P0 = 0xff;
	select_HC573 ( 5 );
	P0 = 0x00;		
}

void Delay1ms()		//@11.0592MHz
{
	unsigned char i, j;

	_nop_();
	_nop_();
	_nop_();
	i = 11;
	j = 190;
	do
	{
		while (--j);
	} while (--i);
}

void Delay14us()		//@11.0592MHz
{
	unsigned char i;

	_nop_();
	i = 36;
	while (--i);
}


void init_timer0 ()
{
	AUXR &= 0x7F;		//定时器时钟12T模式
	TMOD &= 0xF0;		//设置定时器模式
	TL0 = 0x00;		//设置定时初始值
	TH0 = 0x00;		//设置定时初始值
	TF0 = 0;		//清除TF0标志

}
	
void send_sonic ()
{
	unsigned char i;
	for ( i=0 ; i<8 ; i++ )
	{
		TX = 1;
		Delay14us();
		TX = 0;
		Delay14us();
	}
}

unsigned int value_distance = 0;
void read_sonicrunning ()
{
	TL0 = 0x00;
	TH0 = 0x00;

	send_sonic ();
	TR0 = 1;
	
	//当超声波未接受到返回信号,且计时器没有溢出
	while ( (RX ==1) && (TF0 == 0) );
	TR0 = 0;
	
	if ( TF0 == 0 )    //如果接收到了返回信号,且定时器未溢出
	{
		value_distance = TH0;
		value_distance = (value_distance<<8) | TL0;
		value_distance = value_distance * 0.0184;//加7是误差补偿,室温26℃
		
	}
	else    //如果定时器溢出,却还没返回信号
	{
		TF0 = 0;
		value_distance = 999;
	}
}

void SMGrunning ()
{
	state_SMG ( 0 , duanma[5] );
	Delay1ms();

	if ( value_distance>99 )
	{
		state_SMG ( 5 , duanma[value_distance/100%10] );
		Delay1ms();
	}
	if ( value_distance>9 )
	{
		state_SMG ( 6 , duanma[value_distance/10%10] );
		Delay1ms();
	}
	state_SMG ( 7 , duanma[value_distance%10] );
	Delay1ms();
	
	state_SMG_all ( 0xff );
	Delay1ms();
}

void main ()
{
	init_sys ();
	init_timer0 ();
	while ( 1 )
	{
		read_sonicrunning ();
		SMGrunning ();
	}
}

6.2 采用中断的方法

采用中断,核心目的在于要消除当传感器未接受到返回信号时,等待的8192*1.085=8.888ms时间内,数码管刷新一次。从而避免闪烁。

但是一次数码管刷新函数涉及8ms以上的时间,又会对超声波造成严重的影响。

但是我们可以找规律,当传感器未接受到返回信号,数码管会显示的内容只有一位或者三四位。并不需要全部刷新一遍。因此我们可以定义一个间隔时间为2ms的中断,一次只刷新一位数码管

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实验:基于Red Hat Enterprise Linux系统的创建磁盘和磁盘分区(二、三)

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 实验二&#xff1a; 1. 为nvme0n2p1设备建立配额属性和文件(EXT) 2. 要求自己名字的用户只能存储不超过200M的文件&#xff0c;总数量不能大于10个 quotacheck [选项] 文件系统 edquota quotaon [选项] 文件系…

全志 Linux Qt

一、简介 本文介绍基于 buildroot 文件系统的 QT 模块的使用方法&#xff1a; • 如何在 buildroot 工具里编译 QT 动态库&#xff1b; • 编译及运行 qt_demo 应用程序&#xff1b; • 适配过程遇到的问题。 二、QT动态库编译 在项目根路径执行 ./build.sh buildroot_menuc…

蓝桥杯—DS1302

目录 1.管脚 2.时序&官方提供的读写函数 3.如何使用读写函数 4.如何在数码管中显示在DS1302中读取出的数据&#xff1f; 1.管脚 2.时序&官方提供的读写函数 /* # DS1302代码片段说明1. 本文件夹中提供的驱动代码供参赛选手完成程序设计参考。2. 参赛选手可以自行…

Python网络爬虫(一):HTML/CSS/JavaScript介绍

1 HTML语言 1.1 HTML简介 HTML指的是超文本标记语言&#xff1a;HyperText Markup Language&#xff0c;它不是一门编程语言&#xff0c;而是一种标记语言&#xff0c;即一套标记标签。HTML是纯文本类型的语言&#xff0c;使用HTML编写的网页文件也是标准的文本文件&#xff0c…

代码重用攻击及栈溢出攻击

攻击一个软件曾经就像找到一个缓冲区溢出漏洞一样简单&#xff0c;用要执行的任意代码填充缓冲区并替换返回地址以指向这个新代码的开头。幸运的是&#xff0c;我们现在防止内存区域既可写又可执行&#xff0c;攻击者要么不能覆盖现有的代码&#xff0c;要么不能执行他们注入的…

蓝桥杯 204/4/2

目录 蚂蚁感冒 “蓝桥杯”练习系统 (lanqiao.cn) 时间显示 “蓝桥杯”练习系统 (lanqiao.cn) 蚂蚁感冒 “蓝桥杯”练习系统 (lanqiao.cn) 思路借鉴&#xff1a;AcWing 1211. 蚂蚁感冒 - AcWing 完整代码&#xff1a; #include <bits/stdc.h> #define int long lon…

蓝桥杯第八届c++大学B组详解

目录 1.购物单 2.等差素数列 3.承压计算 4.方格分割 5.日期问题 6.包子凑数 7.全球变暖 8.k倍区间 1.购物单 题目解析&#xff1a;就是将折扣字符串转化为数字&#xff0c;进行相加求和。 #include<iostream> #include<string> #include<cmath> usin…

ABC319 G - Counting Shortest Paths

解题思路 按照到的距离远近&#xff0c;进行分层为第一层分层步骤&#xff1a;用一个集合记录还未定层的点&#xff0c;用逐层确定对于当前点与其有连边的&#xff08;不是删边&#xff09;且还未确定的点&#xff0c;确定为的下一层&#xff0c;入队列没连边且还未确定的点&a…

适用于车载设备无钥匙进入系统汽车用晶振FA-238A

汽车用晶振FA-238A是一款适用于车载设备无钥匙进入系统的耐高温晶振。汽车用晶振FA-238A是爱普生推出一的款MHz表贴式晶体单元&#xff0c;具有很好的预率性能&#xff0c;符合AEC-0200标准&#xff0c;其封装尺寸仅为3.2x2.5x0.7mm&#xff0c;工作温度范围在-40℃~125℃之间&…

市场复盘总结 20240402

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 二进三&#xff1a; 进级率 50% 最常用的二…

最新版两款不同版SEO超级外链工具PHP源码

可根据个人感觉喜好自行任意选择不同版本使用&#xff08;版V1或版V2&#xff09; 请将zip文件全部解压缩即可访问&#xff01; 源码全部开源&#xff0c;支持上传二级目录访问 已更新增加大量高质量外链&#xff08;若需要增加修改其他外链请打开txt文件&#xff09;修复优…

探索牙科业务架构的优化与整合解决方案

在现代医疗领域中&#xff0c;牙科作为一个重要的分支&#xff0c;其业务架构和整体解决方案的优化与整合&#xff0c;对于提高诊疗效率、提升患者体验以及促进口腔健康水平具有重要意义。本文将深入探讨牙科业务架构的优化方向和整体解决方案&#xff0c;为牙科行业的发展提供…

基于SSM的“汽车销售分析与管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SSM的“汽车销售分析与管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 销售经理系统首页图 客户管理图 车辆…

27.ReentrantLock

1.与synchronized不同点&#xff1a; 可中断可以设置超时时间可以设置公平锁&#xff0c;公平锁就是为了解决饥饿线程&#xff0c;让线程排队&#xff0c;先进先出&#xff0c;先来的线程先执行。支持多个条件变量 2.与synchronized相同点都支持锁的可重入。 基本格式&#…

js使用canvas实现画roi功能,并实现交集并集差集操作,附源码

效果概览 支持圆形&#xff0c;矩形&#xff0c;旋转矩形绘制&#xff0c;鼠标像素拾取&#xff0c;图片缩放&#xff0c;图片拖拽&#xff0c;像素测量&#xff0c;roi交集并集补集输出 TODO&#xff1a;实现自由路径绘制&#xff0c;与后台交互数据 实现原理 交集并集差集…

【HTML】标签学习(下.4)

&#xff08;Hello&#xff01;大家好哇&#xff0c;今天我们将继续学习HTML的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; &#xff08;续接【HTML】标签学习&#xff08;下.3&#xff09;&#xff09; 3.4.2 <label&g…

Java设计模式:代理模式的静态和动态之分(八)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 在软件设计中&#xff0c;代理模式是一种常用的设计模式&#xff0c;它为我们提供了一种方式来控制对原始对象的访问。在Java中&a…

Python快速入门系列-9(Python项目实战)

第九章:Python项目实战 9.1 开发一个简单的Web应用9.1.1 项目概述9.1.2 环境准备9.1.3 项目结构9.1.4 代码实现9.1.4.1 创建数据库模型9.1.4.2 创建视图9.1.4.3 实用工具函数9.1.4.4 运行应用9.1.5 模板设计9.2 数据分析与可视化项目9.2.1 项目概述9.2.2 环境准备9.2.3 数据分…

vulnhub之devguru靶场提权过程(vulnhub打靶日记)

一、环境搭建 VM版本&#xff1a;17.5.1 build-23298084 攻击机&#xff1a;Kali2024&#xff08;下载地址&#xff1a;https://www.kali.org/&#xff09; 靶机&#xff1a;vulnhub靶场Devguru&#xff08;下载地址&#xff1a;https://www.vulnhub.com/entry/devguru-1,62…

探索网红系统功能菜单架构的设计与优化

随着社交媒体和数字化内容的普及&#xff0c;网红经济正在成为新兴的产业。在网红经济体系中&#xff0c;网红系统的功能菜单架构对于平台的用户体验和运营效率至关重要。本文将深入探讨网红系统功能菜单架构的设计与优化&#xff0c;为网红经济的发展提供新的思路和方法。 --…