蓝桥杯单片机定时器不够用?PCA大力助你测距超声波!

news2024/11/23 21:14:31

在国赛的练习中遇到了定时器不够用的问题,也在网上有查阅到许多蓝桥杯单片机的用PCA定时器测距超声波的例子,但在移植实践运用了几个人的代码后总是各种各样的的问题不好用,因此深感有必要自己好好研究下,终于在一番摸爬中写出了用PCA计时的比较稳定准确的测距程序。

本文会简要讲解我的代码与配置步骤,最后会把整个能使用的测试代码与实验效果图全部贴上,复制编译了就能直接用!

本文研究实战问题不容易,希望看了得以解决问题的读友也大力三连支持一下!

发现BOSS问题——定时器不够用了!

在练习做第十三届国赛的时候遇到了一个比较大的问题:定时器不够用了!

第十三届国赛的题目乍一看用到的模块不是特别多,刚有几分侥幸,以为其十分简单~~

但仔细推敲发现:

NE555频率测量必定占用定时器0(因为SIGNEL要与定时器0引脚P3^4短接),

另外还需要俩个定时器分别进行PWM输出超声波测距

而我们蓝桥杯单片机开发板外部晶振定时器只有0、1、2这三个。

这样就貌似没有多余的外部定时器来给程序安排函数运行时序了!

问题通关思路——PCA定时器分担超声波测距-

但别忘了,外部晶振定时器确实只有三个了,但我们还有板载的CCP/PCA/PWM模块,其中的PCA (Programmable Counter Array可编程计数器阵列)终于有了它的用武之地了!

其实PCA的16位定时器模式与外部晶振定时器没有区别,中断优先级可能比较低,因此在使用的时候大部分操作习惯与步骤原理都是十分类似于 定时器0、1、2这类外部晶振定时器的。

因此我们可以根据定时器1 的 超声波测距程序对其进行改造,编程PCA的测距程序。

 想了解PCA的可以看我这篇文章:

蓝桥杯STC15F2K60S2单片机 CCP/PCA/PWM模块的学习与使用_NULL指向我的博客-CSDN博客

武器打磨——定时器1示例讲解超声波代码的编写原理:

由于我们文章主题是用PCA实现超声波测距,此处提到定时器1,是为了回归基础,

再之PCA定时器测距程序也是由定时器1测距程序修改而来的,因此有比对方面的需要,

但关于定时器1测距的代码,我就值贴出核心部分,就不贴出整个测试工程了(PCA会贴出整个测试工程!)

超声波的驱动我们一般分为下面俩个函数编写步骤:

1.40KHz启动信号函数

 在PCA定时器测距超声波时这个启动函数是不需要改动的

//超声波发送信号必要的10us延时
void Delay10us()
{
	unsigned char i;

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

void Send_Wave()//超声波 产生40KHx启动信号
{
	unsigned char i;
	for(i = 0; i < 10; i++)
	{
		TX = 1;
		Delay10us();	
		TX = 0;
		Delay10us();
	}
}

2.发送启动信号,开启定时器计时,计算距离函数

 这个距离计算函数的格式也是基本不需要改动的

u8 get_distance() //超声波收发计算距离函数
{
	u8 dis;
	Send_Wave();
	TR1=1;
	while(RX && !TF1);
	TR1=0;
	if(TF1){
		TF1=0;
		dis=255;
	}
	else
		dis = (TH1*256+TL1)*17/1000;
	
	TH1=0;
	TL1=0;
	return dis;
}	

武器升级——PCA定时器测距超声波:

 

在了解了定时器1的有关测距超声波的函数之后,

我们便可以在此基础上改写成PCA测距超声波了,具体步骤如下:

 1.定义返回变量

 2.清空PCA寄存器计数值

 3.初始化PCA控制寄存器/PCA定时器停止/清除CF/

 4.关闭总中断

 5.发送超声波驱动信号

 6.开启总中断

 7.PCA开始计数

 8.等待接收

 9.PCA停止计数

 10.计数器溢出处理


u8 get_distance()      //超声波收发计算距离函数
{
	u8 dis;               //定义返回变量
	CH=CL=0;				      //清空PCA寄存器计数值
	CCON=0;               //初始化PCA控制寄存器/PCA定时器停止/清除CF/
	
	EA=0;						      //关闭总中断
	Send_Wave();		      //发送超声波驱动信号
	EA=1;						      //开启总中断
	CR=1;						      //PCA开始计数
	while(RX && !CF);     //等待接收
	CR=0;									//PCA停止计数
	if(CF){CF=0;dis=255;} // 计数器溢出处理
	else dis = (CH*256+CL)*17/1000;               
	return dis;
}

通关秘籍——整体工程代码:

 全部复制编译通过下载即可:

/*  利用PCA计时驱动超声波测距
    定时器0用来450ms 驱动一次超声波
    用串口1发送手机的数据发送给上位机    
    根据定时器1测超声波改造的,比较准确好用,
    可能最终值需要 加上2~3cm 的误差*/ 

/*
	利用PCA计时驱动超声波测距
	定时器0用来450ms 驱动一次超声波
	用串口1发送手机的数据发送给上位机	
	根据定时器1测超声波改造的,比较准确好用,
	可能最终值需要 加上2~3cm 的误差
*/

#include "stc15f2k60s2.h"
#include "stdio.h"
#include "intrins.h"

typedef unsigned char u8;
typedef unsigned int u16; 
typedef int u32;

bit LCM_flag=0;
u16 LCM_cnt=0;

u32 distance=0;

//频率引脚
sbit MOTOR=P0^5;
//蜂鸣器继电器引脚:
sbit buzz=P0^6;
sbit RELAY=P0^4;
//超声波
sbit TX=P1^0;
sbit RX=P1^1;

void Timer0_Init(void);  //定时器0
void UartInit(void);		 //9600bps@11.0592MHz
void inint_port(u8 i);   //初始化74hc573芯片
u8 get_distance();       //超声波收发计算距离函数

void main()
{
	inint_port(5);buzz=0;  //关闭外设
	inint_port(5);RELAY=1;	
	inint_port(4);P0=0XFF;
	Timer0_Init();UartInit();
	
	while(1)
	{
	if(LCM_flag==1)
	{ LCM_flag=0;distance=get_distance();
		printf("distance=%d\r\n",distance);}
	}
}

void inint_port(u8 i)//初始化74hc573芯片
{
	switch(i)
	{
		case 4:P2=(P2&0X1F)|0X80;break; //LED
		case 5:P2=(P2&0X1F)|0XA0;break; //BUZZ RELAY
		case 6:P2=(P2&0X1F)|0XC0;break; //数码管位选 
		case 7:P2=(P2&0X1F)|0XE0;break;	//数码管段选	
	}
}	

void Timer0_Init(void)//定时器0
{	
	AUXR &= 0x7F;TMOD &= 0xF0;
	TL0 = 0x18;TH0 = 0xFC;
	TF0 = 0;TR0 = 1;
	EA=1;ET0=1;	
}

void timer0_serv() interrupt 1
{
	if(++LCM_cnt==450)          //450ms一次超声波
	{LCM_cnt=0;LCM_flag=1;}
}

void UartInit(void)	 //9600bps@11.0592MHz
{
	SCON = 0x50;		   //8位数据,可变波特率
	AUXR |= 0x01;		   //串口1选择定时器2为波特率发生器
	AUXR |= 0x04;		   //定时器时钟1T模式
	T2L = 0xE0;		     //设置定时初始值
	T2H = 0xFE;		     //设置定时初始值
	AUXR |= 0x10;		   //定时器2开始计时
	REN=1;ES=1;EA=1;
}

//重定向printf();
void send_date(unsigned char date)  {SBUF = date; while(!TI); TI = 0;}
char putchar (char ch){send_date(ch);return ch;}

//串口中断服务函数
void Uart_1_serv() interrupt 4
{if(RI){RI=0;	}}

//超声波发送信号必要的10us延时
void Delay10us()
{
	unsigned char i;
	_nop_();_nop_();i = 27;
	while (--i);
}
void Send_Wave()//超声波 40KHx启动信号
{
	unsigned char i;
	for(i = 0; i < 10; i++)
	{
	 TX = 1;Delay10us();
	 TX = 0;Delay10us();
	}
}

u8 get_distance()      //超声波收发计算距离函数
{
	u8 dis;               //定义返回变量
	CH=CL=0;				      //清空PCA寄存器计数值
	CCON=0;               //初始化PCA控制寄存器/PCA定时器停止/清除CF/
	
	EA=0;						      //关闭总中断
	Send_Wave();		      //发送超声波驱动信号
	EA=1;						      //开启总中断
	CR=1;						      //PCA开始计数
	while(RX && !CF);     //等待接收
	CR=0;									//PCA停止计数
	if(CF){CF=0;dis=255;} // 计数器溢出处理
	else dis = (CH*256+CL)*17/1000;               
	return dis;
}

实验结果串口截图:

最后不知我的文章是否有解决大家的问题,解决了请大方给个三连

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

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

相关文章

Shapr3d建模制图软件大学生教育优惠免费1年申请教程

前言介绍 shapr3d是iOS系统上一款专业的3D建模App&#xff0c;目前已经有window版本&#xff0c;主要搭配iPad Pro与Apple Pencil使用&#xff0c;它的特点是易学、方便与专业。我们可以使用它可以在几分钟内就可以把草图上的想法变成设计图。 从工程项目到珠宝设计&#xff…

ADAudit Plus:保护企业信息安全的强大内部审计解决方案

内部安全审计在现代企业中扮演着至关重要的角色。它是确保组织网络和系统安全的关键步骤&#xff0c;帮助企业发现和解决潜在的安全风险和漏洞。在这个信息技术高度发达的时代&#xff0c;保护企业的敏感数据和防范内部和外部威胁变得尤为重要。 内部安全审计 ADAudit Plus是一…

Windows本地账号数据迁移工具,可迁移本地账号数据到域账号,包括配置文件,桌面文件,浏览器收藏,聊天记录等。

Transwiz可以很容易地将您的个人数据和设置转移到新计算机: 用于备份和恢复用户配置文件的简单向导界面 下载链接 链接:https://pan.baidu.com/s/1LWmplUgHYg9ut3QLMnFslg?pwd=ogpx 提取码:ogpx 以下为Transwiz工具的使用教程实录: 创建一台虚拟机,我在上面简单模拟…

基于STL的 演讲比赛流程管理系统

目录 一、演讲比赛程序要求 1、比赛规则 2、程序功能 二、创建管理类 三、菜单功能 四、退出功能 五、演讲比赛功能 1、功能分析 2、创建选手类 3、进行比赛 4、保存分数 六、查看比赛记录 1、读取记录分数 2、查看记录功能 3、bug解决 七、清空功能 一、演讲比赛…

【Linux】信号(上)

文章目录 &#x1f4d5; 信号入门生活角度的信号技术角度的信号 &#x1f4d5; 信号产生认识 signal 函数键盘产生信号通过系统调用产生信号软件条件产生信号硬件异常产生信号 &#x1f4d5; 核心转储&#x1f4d5; 信号保存信号集函数 &#x1f4d5; 信号处理用户态与内核态处…

如何通过桥接模式重构代码?

文章目录 什么是桥接模式&#xff1f;UML结构图通用代码实现适用场景案例场景分析⽤⼀坨坨代码实现桥接模式重构代码代码实现⽀付类型桥接抽象类⽀付类型的实现定义⽀付模式接⼝测试 总结 同类的业务、同样的功能&#xff0c;怎么就你能写出来那么多if else。 很多时候你写出来…

【Web服务器】Tomcat的部署

文章目录 前言一、Tomcat 的概念1. Tomcat 核心组件1.1 什么是 servlet1.2 什么是 JSP 2. Tomcat 功能组件结构2.1 Container 结构分析 3. Tomcat 请求过程4. 配置文件4.1 安装目录4.2 conf 子目录 二、Tomcat 服务部署1. 下载并安装 JDK1.1 关闭防火墙&#xff0c;将安装 Tomc…

Milvus Lite 已交卷!轻量版 Milvus,主打就是一个轻便、无负担

想要体验世界上最快的向量数据库&#xff1f;缺少专业的工程师团队作为支撑&#xff1f;Milvus 安装环境受限&#xff1f; 别担心&#xff0c;轻量版 Milvus 来啦&#xff01; 在正式介绍 Milvus Lite 之前&#xff0c;先简单回顾一下 Milvus。Milvus 是一款开源的向量数据库&a…

logstash启动时默认连接本机节点elasticsearch问题

背景 今天在排查处理一个logstash读取kafka数据写入到hdfs的问题时候&#xff0c;发现在启动日志中多了个 logstash.outputs.elasticsearch 连接的地址是localhost:9200 部分日志如下&#xff1a; 排查过程说明 1、首先确认 logstash 启动的配置文件中的 output 配置&#x…

SonarQube Data Center Edition 10.0 Crack

使用{SonarQube}为团队和企业提供干净的代码 SonarQube Data Center Edition为开发团队提供深度集成到企业环境中的代码质量和安全解决方案;使您能够一致且可靠地部署干净的代码。 灵活性和治理&#xff1a;完美的企业代码质量工具 与您的企业环境深度集成 自我管理&#xff0…

【软件测试】软件测试的基本概念和开发模型

1. 前言 在进行软件测试的学习之前,我们要了解软件测试一些基本概念. 这些基本概念将帮助我们更加明确工作的目标以及软件测试到底要做什么. 2. 软件测试的基本概念 软件测试的基本概念有3个,分别是需求,测试用例和BUG. 2.1 需求 这里的需求还可以分为 用户需求和软件需求,用户…

【博客646】将消息队列放在Prometheus前以提高可靠性并不总是“好主意“

将队列放在Prometheus前以提高可靠性并不总是"好主意" 为了防止突发流量&#xff0c;而在prometheus前加上消息队列以达到削峰填谷的目的 架构如下&#xff1a; 应用程序将指标推送到某种形式的队列&#xff08;通常是 Kafka&#xff09;&#xff0c;暴露器二进制…

超详细IDEA创建Maven项目

文章目录 一、Maven概述二、创建Maven项目三、Maven项目简单介绍3.1 标准化的项目结构3.2 标准化的构建流程3.3 方便的依赖管理 一、Maven概述 Maven是一个专门用于管理和构建Java项目的工具。我们之所以要使用Maven&#xff0c;是因为Maven可以为我们提供一套标准化的项目结构…

Python单元测试框架《python 自动化框架 pytest》

​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; Pytest 简介 pytest 是python 的一种单元测试框架&#xff0c;不python 自带的unittest 测试框架类似&#xff0c;但是比 unittest 框架使用起来更简洁&#xff0c;效率更高。根据pyt…

智警杯半决赛知识点

hive&#xff1a; 启动hadoop 启动本地连接&#xff0c;连接外网 主机就是外网IP 1.修改云主机host文件&#xff0c;添加内网ip&#xff0c;对应映射名为hadoop000&#xff0c;实现云主机自身使用root用户ssh访问hadoop000免密登录 改host文件 vim/etc/hosts 比赛时会提…

【论文阅读】(2023.05.10-2023.06.03)论文阅读简单记录和汇总

(2023.05.10-2023.06.08)论文阅读简单记录和汇总 2023/05/10&#xff1a;今天状态&#xff0c;复阳大残&#xff0c;下午淋了点雨吹了点风&#xff0c;直接躺了四个小时还是头晕- -应该是阳了没跑了。 2023/06/03&#xff1a;前两周出差复阳&#xff0c;这两周调整作息把自己又…

第十三届蓝桥杯c++b组国赛题解(还在持续更新中...)

第十三届蓝桥杯Cb组国赛真题pdf自取 试题A&#xff1a;2022 解题思路&#xff1a; 有2022个物品&#xff0c;它们的编号分别是1到2022&#xff0c;它们的价值分别等于它们的编号。也就是说&#xff0c;有2022种物品&#xff0c;物品价值等于物品编号。 从2022个物品种选取10个…

虹科案例 | 虹科Dimetix激光测距传感器可实现无接触式监测采矿设备健康状况!

Part.01 行业挑战 采矿业机器的环境条件通常非常恶劣&#xff0c;损坏的设备会导致生产力和利润下降。虹科虹科Dimetix激光测距传感器为采矿设备和危险区域机器的机器健康监测提供了非接触式解决方案。 采矿操作中的处理设备通常包括分离、混合和粉碎矿石的机械设备。许多重型…

客户线上反馈:从信息搜集到疑难 bug 排查全流程经验分享

写在前面&#xff1a;本文是我在前端团队的第三次分享&#xff0c;应该很少会有开发者写客户反馈处理流程以及 bug 排查的心得技巧&#xff0c;全文比较长&#xff0c;写了一个多星期大概1W多字&#xff08;也是我曾经2年工作的总结&#xff09;&#xff0c;如果你有耐心阅读&a…

因数据库字段可存储长度设置的小了,已达到设置字符类型的存储上限,导致数据存储时报错 及 常用的数据类型

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 使用MySQL数据库&#xff0c;因数据库字段可存储长度设置的小了&#xff0c;已达到设置字符类型的存储上限&#xff0c;导致数据存储时报错 问题描述 提示&#xff1a;这里描述项目中遇到的问题&am…