第十四届蓝桥杯单片机省赛真题(巨简代码+超级详解)

news2024/12/22 17:13:26

文章目录

  • 前言
  • 一、陷阱分析
  • 二、代码相关定义、声明
    • 1.变量声明
    • 2.函数声明
  • 三、主要函数
    • 1.函数初始化 :关闭蜂鸣器、定时器初始化、设置时间、消除85℃影响、开启总中断
    • 2.按键扫描:长按松开清除数据,短按切换界面,加减参数
    • 3.数据采集与处理:有效性判断、禁止连续采集、3s返回界面、储存数据、比较最大值、求平均值
    • 4.数码管显示:无效字符、位不足补0、采集次数为0时要求位熄灭
    • 6.LED显示:点亮、熄灭、闪烁
    • 7.中断服务函数
    • 8.延时函数
  • 四、经验与感受 细节剖析(后续补充)
  • 五、链接
    • 1.第十四届蓝桥杯单片机省赛真题PDF
    • 2.第十三届蓝桥杯嵌入式国赛真题(基于HAL库的巨简代码+超级详解)
    • 3.第十三届蓝桥杯嵌入式省赛第一场真题(基于HAL库的巨简代码+超级详解)
    • 4.第十三届蓝桥杯嵌入式省赛第二场真题(基于HAL库的巨简代码+超级详解)
    • 5.第十二届蓝桥杯嵌入式省赛第一场真题(基于HAL库的巨简代码+超级详解)


前言

相关说明:

开发板:CT107D——IAP15F2K61S2
开发环境: Keil5
涉及题目:第十四届蓝桥杯单片机省赛真题
在这里插入图片描述


一、陷阱分析

数码管忘记不足2位左侧补0;采集的湿度无效时,温湿度、采集次数、采集时间不统计,更不参与计算平均值;温度参数有边界条件;在时间回显子界面长按松开后才能清零,不松开不能清零,且采集时间、次数、平均值、最大值、储存的数据都需清零;采集湿度无效时,温度需正常显示,但不能储存;L4闪烁时,如果长按清零数据,此时无采集的温度,L4应停止闪烁;L6点亮时,如果长按清零数据,由于采集次数变为0,题目要求为≥2,L6应熄灭;触发采集后经历3s应返回原来的界面,不能返回到固定的任意界面,且3s不能内重复采集,按键操作无效;进入温湿度界面时,L1、L2应熄灭,L3点亮。


二、代码相关定义、声明

1.变量声明

xdata unsigned long uwTick,cjTick,kTick;//单片机上电后每1ms uwTick+1,cjTick用于记录采集时间,kTick记录按键长按时间。
xdata unsigned int Key_Slow_Down,Seg_Slow_Down,Led_Slow_Down;//减速变量,Led_Slow_Down也可用于led的0.1s闪烁
xdata unsigned char seg_buf[8] = {0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};//数码管缓存数组,用于记录段选值
xdata unsigned char wd,cjwd[255]={0},cjsd[255];//wd为当前采集的温度,后两个数组用来储存采集的数据
unsigned char uled;//Led显示的参数
unsigned char rtc[3]={13,03,05};//时间数组
unsigned char cjsj[2]={0,0};//记录发生采集的时间
unsigned char jiemian;//界面参数 0为时间界面 1为回显界面 2为参数界面
unsigned char hxjm;//回显界面参数 0为温度回显界面 1为湿度回显界面 2为时间回显界面
unsigned char flag;//采集标志位  0为未进行采集,按键操作无效 1为正在进行采集,按键操作无效
unsigned char sjwx;//数据无效标志位 0为数据有效,将采集的温度湿度写入数组 1为数据无效,不进行操作
unsigned char tmax,hmax,n;//分别为采集温度的最大值,采集湿度的最大值,采集次数
unsigned char wdcs=30;//温度参数,初始化为30
unsigned char gmdz;//AD光敏通道读取值
unsigned int freq;//当前测量555信号发生器的频率
unsigned int wd_sum,sd_sum;//已测所有温度(湿度)数据的总和
float wdpj,sdpj;//已测所有温度(湿度)数据的平均值

2.函数声明

void Key_Proc();
void Data_Proc();
void Seg_Proc();
void Led_Proc();

三、主要函数

1.函数初始化 :关闭蜂鸣器、定时器初始化、设置时间、消除85℃影响、开启总中断

void main(void)
{

	close();//关闭蜂鸣器,熄灭数码管
	Timer1Init();//定时器1初始化
	EA = 1;//开启总中断
	
	Set_Rtc(rtc);//设置时间
  	Freqinit();//测频初始化
	
	rd_temperature();//消除85℃影响
	Delay750ms();
	
	while(1)
	{
		Key_Proc();
		Data_Proc();
		Seg_Proc();
		Led_Proc();
	}
}

2.按键扫描:长按松开清除数据,短按切换界面,加减参数

void Key_Proc(void)
{
	static unsigned char key_old;
	unsigned char key_value, key_down,key_up;
	unsigned char i;
	
	if(Key_Slow_Down) return;
	Key_Slow_Down = 1;
	
	key_value = Key_Read();
	key_down = key_value & (key_old ^ key_value);
	key_up = ~key_value & (key_old ^ key_value);
	key_old = key_value;
	
	if(flag==0)//采集标志位为0,处于未采集状态,按键操作有效
	{
		if(key_down)
			kTick=uwTick;//有按键按下开始计时
		
		if(uwTick-kTick>2000)//长按超过2s
		{
			switch(key_up)//松开
			{
				case 9:
						if((jiemian==1)&&(hxjm==2))//时间回显子界面
						{
							for(i=0;i<=n;i++)//采集数据清零
							{
								cjwd[i]=0;
								cjsd[i]=0;
							}
							tmax=0;hmax=0;//最大值清零
							wdpj=0;sdpj=0;//平均值清零
							cjsj[0]=cjsj[1]=0;//采集时间清零
							n=0;//采集次数清零
						}
				break;
			}
		}
		else//短按
		{
			switch(key_up)
			{
				case 4:
						if(++jiemian==3)//切换界面
							jiemian=0;
						if(jiemian==1)//时间界面切换到回显界面
								hxjm=0;//处于温度回显子界面
				break;
						
				case 5:
						if(jiemian==1)//回显界面
							if(++hxjm==3)//回显子界面切换
								hxjm=0;
				break;
						
				case 8:
						if(jiemian==2)//参数界面
							if(++wdcs==100)//钳制在99
								wdcs=99;
				break;
						
				case 9:
						if(jiemian==2)//参数界面
							if(--wdcs>200)//钳制在0
								wdcs=0;
				break;
			}
		}
	}
}

3.数据采集与处理:有效性判断、禁止连续采集、3s返回界面、储存数据、比较最大值、求平均值

void Data_Proc(void)
{
	unsigned char i;
	
	if(Data_Slow_Down) return;
	Data_Slow_Down = 1;
	
	Read_Rtc(rtc);//读取时间
	gmdz=Pcf8591_Adc(0x41);//读取光敏通道值
	
	if((gmdz<30)&&(flag==0))//采集标志位为0,处于未采集状态,且光敏值较小,由明变暗
	{
		flag=1;//采集标志位设1,处于采集状态,3秒内无法再触发采集
		cjTick=uwTick;//开始计时
		wd=rd_temperature()/16;//读取当前温度
		if((freq>=200)&&(freq<=2000))//频率有效,湿度数据有效
		{
			n++;//采集次数+1
			cjsd[n]=(unsigned char)(80/1800.0*(freq-200)+10);//湿度换算并储存
			cjwd[n]=wd;//储存温度
			cjsj[0]=rtc[0];cjsj[1]=rtc[1];//储存触发时间
			sjwx=0;//数据无效标志位设0
		}
		else//频率无效,湿度数据无效
			sjwx=1;//数据无效标志位设1
	}
	if(uwTick-cjTick>3000)//超过3秒
		flag=0;//采集标志位设0,处于未采集状态,可以进行下一次采集
	
	for(i=1;i<=n;i++)
	{
		if(cjwd[i]>tmax)//比较出温度最大值
			tmax=cjwd[i];
		wd_sum+=cjwd[i];//求出温度数据总和
		
		if(cjsd[i]>hmax)//比较出湿度最大值
			hmax=cjsd[i];
		sd_sum+=cjsd[i];//求出湿度数据总和
	}
	wdpj=1.0*wd_sum/n;//求出温度平均值
	sdpj=1.0*sd_sum/n;//求出湿度平均值
	wd_sum=0;sd_sum=0;//数据总和清零,否则影响下一次计算
}

4.数码管显示:无效字符、位不足补0、采集次数为0时要求位熄灭

void Seg_Proc(void)
{
	unsigned char seg_string[10];//储存显示的字符
	
	if(Seg_Slow_Down) return;
	Seg_Slow_Down = 1;
	
	if(flag==1)//触发采集进入温湿度界面
	{
		if(sjwx)//数据无效
			sprintf(seg_string,"E  %2d-AA",(unsigned int)wd);//显示暂存的当前温度和无效字符AA
		else//数据有效
			sprintf(seg_string,"E  %2d-%2d",(unsigned int)cjwd[n],(unsigned int)cjsd[n]);//显示储存的数据
	}
	else//时间界面、回显界面、参数界面
	{
		if(jiemian==0)//时间界面
			sprintf(seg_string,"%02d-%02d-%02d",(unsigned int)rtc[0],(unsigned int)rtc[1],(unsigned int)rtc[2]);//不足2位左侧补0	
		else if(jiemian==1)//回显界面
		{
			if(hxjm==0)//温度回显界面
			{
				if(n==0)//采集次数为0
					sprintf(seg_string,"C       ");//除标识符外其他位熄灭
				else//采集次数不为0
					sprintf(seg_string,"C %2d-%4.1f",(unsigned int)tmax,wdpj);
			}
			else if(hxjm==1)//湿度回显界面
			{
				if(n==0)//采集次数为0
					sprintf(seg_string,"H       ");//除标识符外其他位熄灭
				else//采集次数不为0
					sprintf(seg_string,"H %2d-%4.1f",(unsigned int)hmax,sdpj);
			}
			else//时间回显界面
			{
				if(n==0)//采集次数为0
					sprintf(seg_string,"F%02d     ",(unsigned int)n);//时、间隔、分位置熄灭,采集次数不足2位左侧补0
				else//采集次数不为0
					sprintf(seg_string,"F%02d%02d-%02d",(unsigned int)n,(unsigned int)cjsj[0],(unsigned int)cjsj[1]);//采集次数不足2位左侧补0
			}
		}
		else//参数界面
			sprintf(seg_string,"P     %2d",(unsigned int)wdcs);
	}
	Seg_Tran(seg_string, seg_buf);
}

6.LED显示:点亮、熄灭、闪烁

void Led_Proc(void)
{
	if(Led_Slow_Down) return;
	Led_Slow_Down = 1;
	
	if((jiemian==0)&&(flag==0))//时间界面,且未进入温湿度界面
		uled|=0x01;
	else//其他界面
		uled&=~0x01;
	if((jiemian==1)&&(flag==0))//回显界面,且未进入温湿度界面
		uled|=0x02;
	else//其他界面
		uled&=~0x02;
	if(flag)//温湿度界面
		uled|=0x04;
	else//其他界面
		uled&=~0x04;
	
	if(cjwd[n]>wdcs)//当前采集温度大于温度参数
		uled^=0x08;//L4 0.1秒闪烁
	else//不满足条件
		uled&=~0x08;//L4熄灭
	
	if(sjwx)//湿度数据无效
		uled|=0x10;
	else//下一次湿度数据有效
		uled&=~0x10;
	
	if(n>=2)//采集次数大于2时
	{
		if((cjwd[n]>cjwd[n-1])&&(cjsd[n]>cjsd[n-1]))//本次采集的温度、湿度相比上一次均升高
			uled|=0x20;
		else//不满足条件
			uled&=~0x20;
	}
	else
		uled&=~0x20;
}

7.中断服务函数

void tm1_isr() interrupt 3
{
	static unsigned char pos;//位选变量
	
	uwTick++;//按ms++
	
	if(++Key_Slow_Down == 10) Key_Slow_Down = 0;
	if(++Data_Slow_Down == 200) Data_Slow_Down = 0;
	if(++Seg_Slow_Down == 200) Seg_Slow_Down = 0;	
	if(++Led_Slow_Down == 100) Led_Slow_Down = 0;
		
	if((uwTick%1000) == 0)//每1s进入一次
	{
 		freq = ((TH0<<8)|TL0);//计算出555信号频率
 		TH0 = 0;//重置计数高8位
 		TL0 = 0;//重置计数低8位
	}
	
  	Seg_Disp(seg_buf, pos);//数码管位选函数
	if(++pos == 8) pos = 0;
	
	Led_Disp(uled);//LED显示函数
}

8.延时函数

void Delay750ms()		//@12.000MHz
{
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 35;
	j = 51;
	k = 182;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

四、经验与感受 细节剖析(后续补充)


五、链接

1.第十四届蓝桥杯单片机省赛真题PDF

2.第十三届蓝桥杯嵌入式国赛真题(基于HAL库的巨简代码+超级详解)

3.第十三届蓝桥杯嵌入式省赛第一场真题(基于HAL库的巨简代码+超级详解)

4.第十三届蓝桥杯嵌入式省赛第二场真题(基于HAL库的巨简代码+超级详解)

5.第十二届蓝桥杯嵌入式省赛第一场真题(基于HAL库的巨简代码+超级详解)

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

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

相关文章

视频提取gif如何操作?教你用gif制作工具快速截取gif

从视频中提取gif动画就是将电影、电视剧中的某一段视频提取出来做成gif格式的动态图片。那么&#xff0c;如何使用电脑或是手机来将视频转换成gif动图呢&#xff1f; 一、使用什么工具能够完成视频转gif制作呢&#xff1f; 通过使用GIF中文网的视频转gif&#xff08;https://…

S型加减速速度给定功能块(SCL+梯形图)

S型加减速详细算法公式请参看下面博客文章,这里不再赘述: 博途PLC1200/1500PLC S型速度曲线变频器控制应用(SCL完整源代码)_RXXW_Dor的博客-CSDN博客PLC运动控制基础系列之梯形速度曲线,可以参看下面这篇博客:PLC运动控制基础系列之梯形速度曲线_RXXW_Dor的博客-CSDN博客运…

前段开发:配置VSCode像IDEA一样调试VUE项目

如果不配置VSCode调试&#xff0c;那么我们的前段项目一般都是在浏览器中的开发者工具中调试&#xff0c;这样对于使用习惯了IDEA开发调试的人特别不习惯&#xff0c;这几天个人研究了下VSCode中的代码调试功能&#xff0c;做以下记录&#xff1a; 1、使用插件调试&#xff1a…

应用DAP-seq技术鉴定百脉根中一个NAC转录因子在全基因上的靶基因,揭示硝酸盐诱导根瘤衰老的新机制

豆科植物通过与根瘤菌共生&#xff0c;形成能够固氮的根瘤。硝酸盐能够影响根瘤共生的过程&#xff0c;适宜浓度的硝酸盐促进结瘤固氮&#xff0c;而高浓度的硝酸盐抑制菌根共生&#xff0c;并且会促进根瘤衰老。NLP (NIN-Like Protein)转录因子调控硝酸盐信号转导&#xff0c;…

CSS实现三角形的四种方法

方法一&#xff1a;使用 border (常见) 【解释】不设置宽高&#xff0c;用边框大小控制三角型大小 【分解步骤】 设置一个div不设宽高 【示例】 <style>#triangle{width: 0;height: 0;border: 100px solid;border-color: orangered skyblue gold yellowgreen;} </s…

3.8——友元

类的主要特点之一是信息隐藏和封装&#xff0c;即类的私有成员和保护成员只能在定义的范围内使用&#xff0c;也就是说私有成员和保护成员只能通过类的成员函数来访问。但是&#xff0c;有时候我们在类外也需要访问私有成员数据或保护成员数据怎么办。这时我们就要通过友元函数…

gru 串联LLm

单纯是为了降低大LLM 设计的结构 当前如果transformers 可以 输出一个状态也是可以的 这样串联的好处是每次运行知识一个小模型的计算量 时间换空间的概念 可以训练100个模型而后根据需要进行微调 从100 个中选择一个预测比较接近的进行微调预测 预测后继续进行从100中选择 而后…

Linux内核之网络协议栈以及套接字sk_buff分析

网络协议栈以及套接字sk_buff分析一、Linux 内核网络协议栈构架二、网络协议栈常见的数据结构2.1、TCP/IP 参考模型及 ISO/OSI 参考模型2.2、套接字 sk_buff 分析2.3、套接字缓冲区管理数据2.4、Linux 内核提供套接字缓冲区标准 API 函数2.5、使用一个表头来实现套接字缓冲区的…

java StringBuffer和StringBuilder

目录一、概述二、StringBuffer和StringBuilder区别三、StringBuffer使用一、概述 String类是字符串常量&#xff0c;是不可更改的常量。而StringBuffer是字符串变量&#xff0c;它的对象是可以扩充和修改的。 StringBuffer是使用缓冲区的&#xff0c;本身也是操作字符串的&…

工作2年,连接口自动化测试用例怎么设计都不知道?你好意思吗

目录 前言 接口信息来源 单接口测试 场景逻辑验证 异常测试 尽量自动化 独立性 可重复性 合理的断言 公共参数 数据集合 数据模板 前言 说到自动化测试&#xff0c;或者说接口自动化测试&#xff0c;多数人的第一反应是该用什么工具&#xff0c;比如&#xff1a;Py…

FTP-----局域网内部传输文件(1)

在日常工作中&#xff0c;如果需要跨设备的传输文件&#xff0c;您需要借助USB数据线或者借助应用实现无线互联&#xff0c;将所需文件传输到对应设备&#xff0c;这一来一去&#xff0c;花费的时间与精力变多了&#xff0c;那么&#xff0c;怎么实现不使用第三方软件来实现跨设…

【MySQL】表的操作和数据类型

前言 大家好呀~&#xff0c;今天继续我们的mysql学习&#xff01; 本篇博客主要记录Mysql创建完数据库后&#xff0c;要在数据库中创建表&#xff0c;那么首先需要定义表的结构约束&#xff08;SQL-DDL&#xff09;等&#xff0c;这篇主要介绍基础定义表的结构&#xff08;创建…

学习React与Next.js过程中的疑惑

学习React与Next.js过程中的疑惑1、为什么React中函数作为props的时候&#xff0c;会出现无限调用的情况&#xff0c;而把函数放在箭头函数中就可以解决呢&#xff1f;2、next.js与node.js有什么区别&#xff1f;3、什么是快速刷新&#xff1f;4、Hooks出现的原因是什么&#x…

2020年11月信息系统项目管理师真题(综合+案例)

请点击↑关注、收藏&#xff0c;本博客免费为你获取精彩知识分享&#xff01;有惊喜哟&#xff01;&#xff01; 1、&#xff08; &#xff09;使系统的描述及信息模型的表示与客观实体相对应&#xff0c;符合人们的思维习惯&#xff0c;有利于系统开发过程中用户与开发人员的…

【从零开始学Skynet】实战篇《球球大作战》(十二):场景代码设计(上)

场景服务会处理绝大部分的游戏逻辑。新建service/scene/init.lua&#xff0c;开始编写相关代码。1、Ball类 场景中包含小球和食物这两种对象&#xff0c;先看看小球的实现。代码如下所示&#xff1a;--球 local balls {} --[playerid] ballfunction ball()local m {playerid…

项目打包记录提交id

某天上午正在摸鱼的小邓&#xff0c;突然被领导拉倒一个2年前项目的现场问题沟通群&#xff0c;说是现场数据无法入库&#xff0c;需要排查&#xff0c;奈何不知道版本&#xff0c;无奈的小邓值得用时间记录一个点一个点的从gitlab中查找&#xff0c;为了防止后续提供到现场的版…

【蓝桥杯嵌入式】蓝桥杯嵌入式2023年第十四届省赛真题解答

目录 0 题目介绍 1 题目分析 2 Cubemx配置 4 代码 5 效果显示 0 题目介绍 具体要求如下图 1 题目分析 拿到题目咋一看&#xff0c;就是基本操作&#xff0c;实际做起来一堆定时器操作&#xff0c;很容易把人绕晕。 首先看看需要用到的外设 1. GPIO(key/led) 2.LCD 3…

SpringCloud:ElasticSearch之RestClient查询文档

文档的查询同样适用RestHighLevelClient对象&#xff0c;基本步骤包括&#xff1a; 1&#xff09;准备Request对象2&#xff09;准备请求参数3&#xff09;发起请求4&#xff09;解析响应 1.快速入门 我们以match_all查询为例 1.1.发起查询请求 代码解读&#xff1a; 第一步…

Downie4如何使用?Downie4最常用的几种下载方法

Downie 4是一款流行的 Mac 视频下载工具&#xff0c;可让您从各种网站下载视频&#xff0c;包括 YouTube、Vimeo、Twitter 等。但是Downie有多少种下载视频的方法你知道吗&#xff1f;接下来为大家带来最常用的几种下载方法&#xff0c;欢迎大家点赞收藏&#xff01; 拖链接下载…

〖Python网络爬虫实战①〗- HTTP原理

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 说明&#xff1a;本专栏持续更新中&#xff0c;目前专栏免费订阅&#xff0c;在转为付费专栏前订阅本专栏的&#xff0c;可以免费订阅付费…