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

2024-02-05 08:44

本文主要是介绍蓝桥杯备战——12.超声波与测频代码优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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;	//单位:cmvoid 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/CCP0CCON = 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;	//单位:cmvoid System_Init(void);
void Timer1_Init(void);void main()
{System_Init();Timer1_Init();Capture_Init();Wave_Init();while(1){if(KeyScan_Flag){ //50HZKeys_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=0P04=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=0P0=0XFF;P25=0;P26=0;P27=0;//锁存数据
}

这篇关于蓝桥杯备战——12.超声波与测频代码优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680357

相关文章

C语言蓝桥杯

一、语言基础 竞赛常用库函数 最值查询 min_element和max_element在vector(迭代器的使用) nth_element函数的使用 例题lanqiao OJ 497成绩分析 第一种用min_element和max_element函数的写法 第二种用min和max的写法 二分查找 二分查找只能对数组操作 binary_s

超声波清洗机哪个品牌比较好一点的?清洁力强的超声波清洗机品牌

随着生活水平的不断提升和幸福感的增强,珠宝、饰品和眼镜等物品已成为许多家庭的常备之物。然而,这些贵重细小的物件易于积聚微尘与隐形细菌,长此以往可能悄悄影响家人的健康,毕竟细菌是肉眼难以察觉的隐患。超声波清洗机应运而生,它以高科技手段有效地解决了这一隐忧,深层清洁,守护家人免受微小污染物的潜在威胁。不过现在市面上超声波清洗机品牌挺多的,究竟有哪些品牌的超声波清洗机比较好一点呢?接下来就为大家带来四款

树莓派使用WiringPi库配合时间函数实现超声波测距

树莓派使用WiringPi库配合时间函数实现超声波测距 文章目录 树莓派使用WiringPi库配合时间函数实现超声波测距一、HR-04超声波模块原理1.1 超声波测距原理:1.2 超声波时序图: 二、树莓派与超声波模块硬件连接三、时间函数3.1 时间函数gettimeofday()原型和头文件: 四、实现超声波测距4.1 使用wiringOP库和时间函数实现超声波测距: 五、实现超声波测距

找不同-第15届蓝桥省赛Scratch初级组真题第4题

[导读]:超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成,后续会不定期解读蓝桥杯真题,这是Scratch蓝桥杯真题解析第183讲。 如果想持续关注Scratch蓝桥真题解读,可以点击《Scratch蓝桥杯历年真题》并订阅合集,查阅教程更方便。 第15届蓝桥杯省赛已于2024年8月24日落下帷幕,编程题一共有5题,分别如下: 猪八戒落地 游乐场 画西瓜 找不同 消

【蓝桥杯嵌入式(一)程序框架和调度器】

蓝桥杯嵌入式(一)程序框架和调度器 序、代码命名规则零、STM32和8051⼀、软件及环境安装⼆、⼯程框架搭建1.时钟配置2、SYS配置3、⼯程配置4、NVIC配置5.、Keil配置 三、系统初始化四、任务调度器 链接: 视频出处 序、代码命名规则 以下是一些常见的举例 零、STM32和8051 链接: 8位和32位单片机最本质区别 ⼀、软件及环境安装

【蓝桥杯嵌入式(二)Led、Key、Lcd】

蓝桥杯嵌入式(二)Led、Key、Lcd 五、Led模块1.原理图配置2. 知识点3.底层代码 六、Key模块1.原理图配置2.知识点3.底层代码底层代码(四⾏代码版本)底层代码(状态机版本) 七、LCD模块1.原理图配置2.知识点底层代码 五、Led模块 1.原理图配置 2. 知识点 链接: 上拉电阻的通俗解释 链接: 单⽚机怎么输出⾼电平!推挽输出和开

最好的超声波清洗机是哪款牌子?高颜值的超声波清洗机

超声波清洗机凭借其出色的洁净能力与简便的操作方式,正逐渐成为广受欢迎的清洁优选。它以深度而不伤材质的清洗效果著称,不过市面上品牌琳琅满目,型号多样,价格波动大,给消费者挑选造成了不小的挑战。作为一名眼镜爱好者,我对超声波清洗机颇有研究,并乐意在此为朋友们推荐几款品质卓越的机型,希望能对你选购超声波清洗机有所帮助! 超声波清洗机选购攻略 技巧1:优选专业实力强悍的品牌 在选择超声波清洗机时,偏

超声波清洗机哪个品牌比较好?耐用超声波清洗机推荐

经济技术高速发展,眼镜作为人们日常生活中常见的物品,很多人可能只做了表面的擦拭,但是在眼镜上还有许多肉眼所看不见的细菌,这个时候还需要专业工具去对付它们,很多人为了解决这个隐患便开始使用超声波清洗机,由于市面上超声波清洗机的品牌繁多,怎么样才能买到一款合适的超声波清洗机呢?想要购买的朋友们可以来看看这篇推荐。 超声波清洗机选购攻略 技巧1:优选专业实力强悍的品牌 选择专业实力强悍的超声波清洗

蓝桥杯:整数删除

// 蓝桥杯整数删除.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include<stdio.h>#define MAX 100void findmin(int a[],int n,int& pos){int min=a[0];pos=0;//pos=0我开始忘了,特别注意

第十五届蓝桥杯图形化省赛题目及解析

第十五届蓝桥杯图形化省赛题目及解析 一. 单选题 1. 运行以下程序,角色会说( )? A、29     B、31     C、33     D、35 正确答案:C 答案解析: 重复执行直到m>n不成立,即重复执行直到m<=n。所有当m小于或者 等于n时,循环结束。循环过程中变量m与变量n的变化如下表: 通过上述表格可知,循环到第五次循环结束。m的值为14,n的值为19