蓝桥杯备战——12.超声波与测频代码优化

news2024/12/26 0:03:01

1.优化分析

昨天我在看原理图的发现超声波模块的反馈引脚P11刚好可以使用PCA模块0的捕获功能,我就想着把PCA功能留给超声波,然后测频功能还是改成定时器0来完成,然后前后台功能改成定时器1。
在这里插入图片描述
在这里插入图片描述
至于我为什么要这么改呢,看一下我原来封装的超声波代码就知道了,下图高亮部分,如果一直没有接收到反馈信号,程序就会一直等待65ms,严重吃MCU资源,而且会导致数码管闪动。如果换成PCA模块捕获功能来做的话,我们只需初始化一下,然后在每个下降沿捕获中断里面获取距离就行,这大大提高了代码效率!
在这里插入图片描述

2.代码示例

STC15使用CCP功能驱动超声波模块

#include "wave.h"

#define Wave_TX P10	//超声波发送引脚
#define Wave_RX P11	//超声波信号接收反馈引脚

float Distance=0;	//单位:cm

void Send_Vave()	//发出超声波脉冲
{
	u8 i=8;
	while(i--)
	{
		Wave_TX=1;
		_nop_();_nop_();_nop_();
		Wave_TX=0;
		_nop_();_nop_();_nop_();
	}
}

void Wave_Init()
{
	P_SW1 &=0XCF;	//清除CCP_S1,CCP_S0位
	P_SW1 |=0X00;	//CCP在P11/CCP0
	CCON = 0;     //清除CF标志 PCA定时器停止 清除模块0/1/2中断标志
	CL = 0;CH = 0;	//复位PCA计数值
	CCAP0L = 0;CCAP0H = 0;	//清除捕获值
	CMOD = 0x01; //设置PCA时钟源:系统时钟/12,允许PCA溢出中断
	CCAPM0 = 0x11; //PCA模块0允许下降沿捕获,开捕获中断
	CR = 1;	//启动PCA计数器阵列计数
	EA = 1; //开总中断
}

void PCA_isr() interrupt 7
{
	static u8 count=0;
	if (CF){ //每65.536ms发生溢出中断
		CF = 0;
		CR=0;
		CL = 0;CH = 0; 	//复位PCA计数值
		CCAP0L = 0;CCAP0H = 0; //清除捕获值
		if(++count==8) count=0;
		Send_Vave(); 
		CR=1;	//启动PCA计数阵列
  }
	if (CCF0)	//发生下降沿捕获中断
  {
		CCF0 = 0;
		if(count==4) //65*8ms采样一次,防止数值频繁变动
			Distance = (CCAP0H<<8 | CCAP0L)*0.017;	//返回距离
  }
}

定时器0外部脉冲输入测频

#include "capture.h"

u8 Overflow=0;

//定时器0对P34输入脉冲计数
void Capture_Init()
{
	TMOD |= 0x04;			//定时器0外部脉冲计数,16自动重装载
	TL0 = 0x00;				//设置自动重装载值
	TH0 = 0x00;
	TF0 = 0;	//清除TF0标志
	ET0 = 1;
	EA = 1;
	TR0 = 1;	//定时器0开始计时
}

void Timer0_Isr(void) interrupt 1
{
	Overflow++;
}

//每1S获取一次计数值,即频率
u32 Get_Frequency()
{
	u32 count = (Overflow<<16) | (TH0<<8) |TL0;
	TR0=0;	//先关定时器再清零
	TH0 = 0;
	TL0 = 0;
	Overflow=0;
	TR0=1;
	return count; //返回计数值(频率),单位HZ
}

定时器1前后台

#include "main.h"

bit KeyScan_Flag=0;
u32 frequency=0;
extern float Distance;	//单位:cm

void System_Init(void);
void Timer1_Init(void);

void main()
{
	System_Init();
	Timer1_Init();
	Capture_Init();
	Wave_Init();
	while(1)
	{
		if(KeyScan_Flag){ //50HZ
			Keys_Scan();
			KeyScan_Flag=0;
		}
		//前四位显示超声波获取距离
		Nixie_Display(1,((u8)Distance%100)/10);
		Nixie_Display(2,(u8)Distance%10);
		Nixie_Display(2,16);	//小数点
		Nixie_Display(3,(u8)(Distance*10)%10);
		Nixie_Display(4,(u8)(Distance*100)%10);
		
		//后四位显示频率
		Nixie_Display(5,(frequency%10000)/1000);	
		Nixie_Display(6,(frequency%1000)/100);	
		Nixie_Display(7,(frequency%100)/10);	
		Nixie_Display(8,frequency%10);

	}
}

void Timer1_Isr(void) interrupt 3 //1ms中断一次
{
	static u8 count1=0,count2=0;
	static u16 counter3=0;
	
	if(++count1==20){	//20ms扫描一次按键
		KeyScan_Flag=1;
		count1=0;
	}
	if(++count2==250){	//LED8一秒闪四次
		P12=!P12;
		Set_Leds(8,P12);
		count2=0;
	}
	if(++counter3==1000)
	{
		frequency = Get_Frequency();
		counter3=0;
	}
}

void Timer1_Init(void)		//1毫秒@12.000MHz
{
	AUXR &= 0xBF;
	TMOD &= 0x0F;
	TL1 = 0x18;
	TH1 = 0xFC;
	TF1 = 0;
	ET1 = 1;
	EA = 1;
	TR1 = 1;
}

void System_Init()//系统上电初始化
{
	//先锁存蜂鸣器,继电器所在573输出低电平,防止上电乱叫
	P25=1;P26=0;P27=1; //74HC138-->Y5=0,else=1-->Y5C=1,else=0
	P04=0;P06=0;	//ULN2003输入经过非门送入达林顿管,低电平有效
	P25=0;P26=0;P27=0;//锁存数据
	
	//关闭所有LED灯
	P25=0;P26=0;P27=1; //74HC138-->Y4=0,else=1-->Y4C=1,else=0
	P0=0XFF;
	P25=0;P26=0;P27=0;//锁存数据
}

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

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

相关文章

【2024美赛】C题 Problem C: Momentum in Tennis网球运动中的势头 网球问题一python代码

相关链接 &#xff08;1&#xff09;问题分析 &#xff08;2&#xff09;26页论文 1 题目 http://t.csdnimg.cn/BzhFu 2 问题一数学模型 采用隐马尔可夫模型&#xff08;Markov Model&#xff09;&#xff0c;这是一种描述随机过程的数学模型&#xff0c;它满足马尔可夫性…

Powershell Install 一键部署Prometheus

前言 Prometheus是一个开源的系统监控和报警系统,现在已经加入到CNCF基金会,成为继k8s之后第二个在CNCF托管的项目,在kubernetes容器管理系统中,通常会搭配prometheus进行监控,同时也支持多种exporter采集数据,还支持pushgateway进行数据上报,Prometheus性能足够支撑上…

redis 6.x集群搭建

redis6集群搭建 安装文件下载 redis-6.2.6.tar.gz 编译 tar -zxvf redis-6.2.6.tar.gz cd redis-6.2.6/ make MALLOClibc make install PREFIX/opt/soft/redis复制可执行文件 cp /opt/soft/redis/redis-cli /usr/bin/redis-cli cp /opt/soft/redis/redis-server /usr/bi…

ffmpeg操作实战001:视频+音频文件融合

一、功能需求 把视频文件video.mp4 和音频文件audio.wav融合在一起&#xff0c;输出视频文件output.mp4 二、操作指令 ffmpeg -i video.mp4 -i audio.wav -c:v copy -map 0:v:0 -map 1:a:0 output.mp4 三、参数说明 ffmpeg: 这是用于执行FFmpeg命令行工具的命令。-i video…

数据结构(C语言)代码实现(六)——单链表的实现

目录 参考、格式 头文件LinkList.h 一、将函数的小括号写成中括号 二、读取权限冲突 三、L->Last指针没有移动 四、函数指针的使用 头文件完整代码 测试函数&#xff08;主函数&#xff09;test.cpp 测试结果 参考、格式 数据结构课本2.3节&#xff08;严蔚敏版&a…

虚幻UE5Matehuman定制自己的虚拟人,从相机拍照到UE5制作全流程

开启自己的元宇宙,照片扫描真实的人类,生成虚拟形象,保姆级教程,欢迎大家指正。 需要的软件: 制作流程: 一.拍照。 围绕自己拍照,大概20多张图就差不多了,把脑门漏出来,无需拍后脑勺。 拍照方式 例如,拍照时尽量不要在脸上体现出明显的光源方向。

如何在Shopee平台上进行测款选品

在如今竞争激烈的电商市场&#xff0c;选择合适的产品成为卖家们提高销售业绩的重要一环。在Shopee平台上进行测款选品&#xff0c;可以帮助卖家找到符合市场需求的产品&#xff0c;提高销售业绩。本文将介绍一些策略和步骤&#xff0c;帮助卖家在Shopee平台上进行测款选品。 …

PCL安装以及CGAL构建三维凸包

基础理论专栏目录 - 知乎 (zhihu.com) 凸包问题——概述 - 知乎 (zhihu.com) 1、安装PCL 安装pcl,我的是window10,vs2019。我安装的是1.13 win10系统下 VS2019点云库PCL1.12.0的安装与配置_windows 10使用pcl-CSDN博客 照着上述博客进行配置&#xff0c;再结合这个设置环境变…

LeAPI 后端接口开发 - 发布、下线接口

一、上线接口&#xff08;仅管理员&#xff09; 1. 校验请求参数 2. 判断&#xff08;测试&#xff09;接口是否可以调用 引入调用接口的客户端&#xff08;自己写的 SDK&#xff09;注入客户端实例调用接口 3. 修改数据库中接口的状态 /*** 上线&#xff08;发布&#xff…

070:vue中provide、inject的使用方法(图文示例)

第070个 查看专栏目录: VUE 本文章目录 示例背景示例效果图示例源代码父组件代码子组件代码孙组件代码 基本使用步骤 示例背景 本教程是介绍如何在vue中使用provide和inject。在 Vue 中&#xff0c;provide 和 inject 是用于实现祖先组件向后代组件传递数据的一种方式。 在这个…

Linux一些实用操作

学习笔记&#xff0c;记录以下课程中关于Linux的一些实用操作。黑马程序员新版Linux零基础快速入门到精通&#xff0c;全涵盖linux系统知识、常用软件环境部署、Shell脚本、云平台实践、大数据集群项目实战等_哔哩哔哩_bilibili 目录 1 各类小技巧&#xff08;快捷键&#xff…

计算机速成课Crash Course - 28. 计算机网络

今天继续计算机速成课Crash Course的系列讲解。 更多技术文章&#xff0c;全网首发公众号 “摸鱼IT” 锁定 -上午11点 - &#xff0c;感谢大家关注、转发、点赞&#xff01; 计算机速成课Crash Course - 28. 计算机网络 (qq.com) 28. 计算机网络 互联网太棒啦&#xff0c;键…

java05 数组

一 概念介绍 指的是一种容器&#xff0c;可以同来存储同种数据类型的多个值。 但是数组容器在存储数据的时候&#xff0c;需要结合隐式转换考虑。 比如&#xff1a; 定义了一个int类型的数组。那么boolean。double类型的数据是不能存到这个数组中的&#xff0c; 但是byte类…

Linux文本三剑客-sed

一、sed介绍&#xff1a; sed&#xff08;Stream Editor&#xff09;是一种流编辑器&#xff0c;用于对文本进行处理和转换。它可以从输入流中读取文本&#xff0c;并根据指定的规则进行编辑和替换。sed通常用于在命令行中进行文本处理&#xff0c;可以实现搜索、替换、删除、…

Python对日期的一些操作

1. 把这种日期 Mon Jan 29 11:10:49 0800 2024 转换成 ‘2024/2/1 10:50:38’ 这里定义一个func 传入英文日期&#xff0c;返回标准日期格式 def time_formater(input_time_str): input_format %a %b %d %H:%M:%S %z %Y output_format %Y-%m-%d %H:%M:%S return dat…

springboot154基于Spring Boot智能无人仓库管理

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

【Win10下实现开机Jar启动的CICD自动化流程】

目录 在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作:在Win10下实现开机Jar启动的CICD自动化流程,可以按照以下步骤进行操作: 安装Java环境:确保你的计算机上已经安装Java环境,可以通过命令行运行java -version来验证Java环境是否已安装。 编写启动…

操作符重点

简介 移位操作符 <<:左移操作符 移动的是二进制的数&#xff0c;即存储在计算机内部的数的补码 移动之后再右边补零 >>:右移操作符 同左移操作符 移动之后补的数分两种情况: (1).逻辑右移:移动后左边补1 (2).算术右移:移动后左边补原符号位 位操作符: (1).&a…

嵌入式基础知识-逻辑覆盖测试用例设计

1 基础示例 1.1 例题一 有如下程序&#xff0c;设计分别满足语句覆盖和分支覆盖的最有效力的测试用例。 int x 0; int y 0;if (x > 0 && y > 0) {y y/x; }if (x > 1 || y > 1) {y y 1; }x x y;分析&#xff1a; 语句覆盖只需要所有的语句都被执…

【JavaEE spring】SpringBoot 统一功能处理

SpringBoot 统一功能处理 1. 拦截器1.1 拦截器快速⼊⻔1.2 拦截器详解1.2.1 拦截路径1.2.2 拦截器执⾏流程 1.3 登录校验1.3.1 定义拦截器1.3.2 注册配置拦截器 2. 统⼀数据返回格式2.1 快速⼊⻔2.2 存在问题2.3 案例代码修改2.4 优点 3. 统⼀异常处理 1. 拦截器 后端程序根据…