【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

这篇具有很好参考价值的文章主要介绍了【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏

🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题

🎏【蓝桥杯嵌入式】蓝桥杯第十三届省赛程序真题

🪔本系列专栏 -   蓝桥杯嵌入式_勾栏听曲_0的博客

🍻欢迎大家  🏹  点赞👍  评论📨  收藏⭐️

📌个人主页 -  勾栏听曲_0的博客📝

🔑希望本文能对你有所帮助,如有不足请指正,共同进步吧🏆

🎇君子欲讷于言而敏于行。📈

目录

题目

硬件框图

功能描述

题目分析

代码实现

adc模块

LCD与LED模块

按键模块


题目

硬件框图

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

功能描述

1基本功能
        1)测量竞赛板上电位器R37输出的模拟电压信号Via;,并通过液晶屏实时显示数据。

        2)通过LED指示灯实现超出上限、低于下限的提醒功能。

        3)通过按键实现阈值范围和输出提醒指示灯的设置功能。

 2显示功能
        1)数据显示界面
        数据显示界面包含三个显示要素:界面名称、采集的实时电压数据和状态。

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

 备注:
        上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。

        电压单位为伏特,数据保留小数点后两位有效数字。

        状态(Status):超过上限(Upper)、低于下限(Lower)和正常(Normal)。

        2)参数配置界面
        参数配置界面包含五个显示要素:界面名称、电压的上限值、电压的下限值、电压超过上限的提醒指示灯、电压低于下限的提醒指示灯。

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

        备注:

        上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。

        电压上、下限值设置范围为0-3.3V,设备应具备错误设置的保护功能。

        电压提醒指示灯设置范围为LD1到LD8,设备应禁止将上、下限指示灯设置为同一个指示灯。

3按键功能

        1)B1:定义为“设置”按键,按下此按键,切换选择数据显示界面和参数设置界面,按键工作流程如下图所示:

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

        2)B2:定义为“选择”按键,在参数设置界面按下此按键,切换选择参数项(电压的上限值、电压的下限值、电压超过上限的提醒指示灯、低于下限的提醒指示灯),被选择的参数项“高亮”显示。

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

        按键工作流程如下图所示:

【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)

        3)B3:定义为“加”按键。

        进行电压参数设置时,当前选择的电压参数加0.3V。

        进行LED提醒指示灯参数设置时,LED指示灯序号加1。

        4)B4:定义为“减”按键。

        进行电压参数设置时,当前选择的电压参数减0.3V。

        进行LED提醒指示灯参数设置时,LED指示灯序号减1。

        备注:
        B2、B3、B4仅在设置界面下有效。

        参数设置功能需保护数据边界,电压参数可设置范围0-3.3V,LED提醒指示灯可设置范围LD1—LD8。

        4LED指示灯功能
        1)R37输出电压值超过电压上限值时(​>V的上限),上限提醒指示灯以0.2秒为间隔闪烁,下限指示灯熄灭。
        2)R37输出电压值低于电压下限值时(​<V的下限),下限提醒指示灯以0.2秒为间隔闪烁,上限指示灯熄灭。
        3)R37输出电压值介于上限和下限电压之间时(V的下限≤​≤V的上限),上限、下限提醒指示灯熄灭。
        4)竞赛板上除当前用做超出上限、低于下限提醒功能的指示灯外,其它指示灯应处于熄灭状态。

        5初始状态说明
        1)默认输出提醒指示灯。
                超过上限提醒指示灯:LD1
                低于下限提醒指示灯:LD2

        2)默认电压阈值参数。
                电压的上限值:2.4V
                电压的下限值:1.2V


真题讲解系列文章重点关注顶层逻辑代码编写,各模块的代码编写大家可点击蓝桥杯嵌入式专题,里面有各个模块的详细解析与代码编写


题目分析

硬件框图分析

        我们通过硬件框图可以看出本题需要哪些基础模块,如本题可看出涉及LCD,LED,按键,模拟电压(也就是模数转换),并因为LCD,LED,按键几乎每年都考,所以显而易见这一年的考试重点在于模拟电压。通过硬件框图知道这些信息后,来我们再来仔细看题。

功能描述分析

        最主要的是测量R37输出的模拟信号,也就是模数转换的过程,然后其他的就是老三样,常见的LCD屏显示,设置了电压的上下限阈值,与阈值相关的功能有LCD屏显示与LED灯,然后就是按键控制,按键只要将条件判断语句写好就行了。其中有一个新点,就是屏幕高亮显示。

总体设计思路

        先将R37的模拟信号获取,定义全局变量,方便其他.c文件使用。 根据按键功能将按键的逻辑实现好。LCD屏也是如此,注意变量的定义即可,实现好高亮显示。LED就是获取按键相关操作之后,判断电压值是否超过阈值,是则亮。

代码实现

adc模块

double getADC(ADC_HandleTypeDef *pin)
{
	uint adc;
	HAL_ADC_Start(pin);
	adc = HAL_ADC_GetValue(pin);
	return adc*3.3/4096;
}

LCD与LED模块

        其中包含高亮显示,高亮显示原理也很简单,在要显示高亮的那一行之前,将LCD背景换成你想要的高亮颜色,这里换成了黄色,然后在显示这一行的信息,注意一行没满用空格填充,否则这一行后面部分会没有高亮显示。显示完成后,再将LCD的背景色改为黑色。文章来源地址https://www.toymoban.com/news/detail-414379.html

void disp_proc()
{
	
	double V = getADC(&hadc2);
	if(view==0)
	{
		char text[30];
		sprintf(text,"      Main   ");
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"   Volt:%.2f",getADC(&hadc2));
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		
		if(V > max_v)
		{
			sprintf(text,"   Status:Upper");
			LCD_DisplayStringLine(Line5, (uint8_t *)text);
		}
		else if(V < min_v)
		{
			sprintf(text,"   Status:Lower");
			LCD_DisplayStringLine(Line5, (uint8_t *)text);
		}
		else
		{
			sprintf(text,"   Status:Normal");
			LCD_DisplayStringLine(Line5, (uint8_t *)text);
		}
		
	}
	else if(view==1)
	{
		char text[30];
		
		//disp_clear();
		sprintf(text,"    Setting    ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		if(hang == 1)
		{
			LCD_SetBackColor(Yellow);
			sprintf(text,"   Max Volt:%.2f     ",max_v);
			LCD_DisplayStringLine(Line3, (uint8_t *)text);
			LCD_SetBackColor(Black);
		}
		else
		{
			sprintf(text,"   Max Volt:%.2f     ",max_v);
			LCD_DisplayStringLine(Line3, (uint8_t *)text);
		}
		if(hang == 2)
		{
			LCD_SetBackColor(Yellow);
			sprintf(text,"   Min Volt:%.2f     ",min_v);
			LCD_DisplayStringLine(Line4, (uint8_t *)text);
			LCD_SetBackColor(Black);
		}
		else
		{
			sprintf(text,"   Min Volt:%.2f     ",min_v);
			LCD_DisplayStringLine(Line4, (uint8_t *)text);
		}
		
		if(hang == 3)
		{
			LCD_SetBackColor(Yellow);
			sprintf(text,"   Upper:LD%d        ",up_led);
			LCD_DisplayStringLine(Line6, (uint8_t *)text);
			LCD_SetBackColor(Black);
		}
		else
		{
			sprintf(text,"   Upper:LD%d        ",up_led);
			LCD_DisplayStringLine(Line6, (uint8_t *)text);
		}
		if(hang == 4)
		{
			LCD_SetBackColor(Yellow);
			sprintf(text,"   Lower:LD%d        ",lo_led);
			LCD_DisplayStringLine(Line7, (uint8_t *)text);
			LCD_SetBackColor(Black);
		}
		else
		{
			sprintf(text,"   Lower:LD%d        ",lo_led);
			LCD_DisplayStringLine(Line7, (uint8_t *)text);
		}
		
	}
	
	LED_mie();
	
	if(V < min_v)
	{
		TurnOn_LED(lo_led);
	}
	else
	{
		TurnOff_LED(lo_led);
	}
	if(V > max_v)
	{
		TurnOn_LED(up_led);
	}
	else
	{
		TurnOff_LED(up_led);
	}
}

按键模块

void key_proc()
{
	if(key[0].key_flag == 1)
	{
		view = !view;
		LCD_Clear(Black);
		key[0].key_flag = 0;
	}
	if(key[1].key_flag == 1)
	{
		if(view == 1)
		{
			hang++;
			if(hang == 5)
			{
				hang = 1;
			}
		}
		key[1].key_flag = 0;
	}
	if(key[2].key_flag == 1)
	{
		if(view == 1)
		{
			if(hang == 1 && max_v < 3.3)		//不超过3.3
			{
				max_v = max_v + 0.3;
			}
			else if(hang == 2 && min_v < 3.3 && min_v < max_v)			//不超过3.3,并且不超过max_v
			{
				min_v = min_v + 0.3;
			}
			
			else if(hang == 3)
			{
				if(up_led+1 == lo_led)
						up_led++;
				if(++up_led >= 9)
				{
					up_led = 1;
				}
				if(up_led == lo_led)
						up_led++;
			}
			
			else if(hang == 4)
			{
				if(up_led == lo_led+1)
						lo_led++;
				if(++lo_led >= 9)
				{
					lo_led = 1;
				}
				if(up_led == lo_led)
						lo_led++;
			}
		}
		key[2].key_flag = 0;
	}
	if(key[3].key_flag == 1)
	{
		if(view == 1)
		{
			if(hang == 1 && max_v > 0 && max_v > min_v)
			{
				max_v = max_v - 0.3;
			}
			else if(hang == 2  && min_v > 0)
			{
				min_v = min_v - 0.3;
			}
			
			else if(hang == 3)
			{
				if(up_led-1 == lo_led)
						up_led--;
				if(--up_led <= 0)
				{
					up_led = 8;
				}
				if(up_led == lo_led)
						up_led--;
			}
			
			else if(hang == 4)
			{
				if(up_led == lo_led-1)
						lo_led--;
				if(--lo_led <= 0)
				{
					lo_led = 8;
				}
				if(up_led == lo_led)
						lo_led--;
			}
		}
		LED_mie();
		key[3].key_flag = 0;
	}
}

到了这里,关于【蓝桥杯嵌入式】蓝桥杯第十届省赛真题,程序题全解析(含代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【蓝桥杯 第十届省赛Java B组】真题训练(A - H)H待更新

    目录 A、组队 - 看图一眼出答案 B、不同子串 - 字符串模拟 + set去重 C、数列求值 - 模拟取余 D、数的分解 - 三重暴力 E、迷宫 - bfs 判断路径 F、特别数的和 - 弱智模拟 G、外卖店优先级 - map 暴力(90%通过率) H、人物相关性分析 -  思路:  没啥说的,注意不能重复选择同一编

    2024年02月05日
    浏览(30)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式省赛客观题以及详细题解

    题解:   概念题。 MCO引脚,是单片机对外提供时钟的引脚。 HSE,高速外部时钟信号,时钟源由外部晶体/陶瓷谐振器与外部时钟; HSI,高速的内部时钟,由内部8MHz的RC振荡器产生,可直接作为系统时钟或在2分频后作为PLL输入; SYSCLK,是系统时钟; HSE/2,对高速外部时钟进

    2023年04月16日
    浏览(43)
  • 【蓝桥杯嵌入式】第十二届蓝桥杯嵌入式省赛客观题及详细题解

    解析: 波特率,指 每秒钟传输码元符号的个数,对符号传输速率的一种度量,单位为1baud/s 。 由于串口只有高低电平之分,即1码元等于1bit,即波特单位1baud和1bit等效,因此,此时的波特单位可以是位/秒。 答案: B 解析: 放大电路的开环,是指未经反馈通路形成的独立放大电

    2023年04月17日
    浏览(57)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十四届省赛程序真题,真题分析与代码讲解

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都已更新完毕,欢迎大家前往订阅本专题🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省

    2023年04月15日
    浏览(53)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式省赛[第一场]程序设计题以及详细题解

      今年的第一场比赛绝对np,官方将串口直接省掉了,将其替换成很多小功能,如:切换计时、频率均匀变化、锁机制等等,总的来说本届赛题的难度提升了不少。   本届试题需要用到的功能模块有 LCD 、 LED 、 按键 、 定时器输入捕获 、 定时器PWM输出 、 ADC获取 ,虽然这

    2023年04月17日
    浏览(39)
  • 【蓝桥杯嵌入式】蓝桥杯嵌入式第十二届省赛题,考点:模拟电压,串口通信,计时器

     🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题 🎏【蓝桥杯嵌入式

    2023年04月09日
    浏览(42)
  • 蓝桥杯嵌入式第十四届省赛题目解析

    前几天刚刚参加完第十四届的省赛,这届题目比我想象中的要难,其实想一想这也是应该的,以前的知识点都被摸透了,也是需要加入新的知识点了,但是我还是想说能不能别在我参加的时候加大题目难度啊。 不过听说隔壁单片机的省赛都比往年的国赛还难,这就有点离谱了

    2024年02月06日
    浏览(31)
  • 【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

    🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏 🎏【蓝桥杯嵌入式】蓝桥杯第十届省赛真题 🎏【蓝桥杯嵌入式】蓝桥杯第十三届省赛程序真题 🪔本系列专栏 -  

    2023年04月15日
    浏览(36)
  • 第十二届蓝桥杯嵌入式省赛第一场真题(基于HAL库的巨简代码+超级详解)

    相关说明: 开发板:CT117E-M4(STM32G431RBT6) 开发环境: CubeMX+Keil5 涉及题目:第十二届蓝桥杯嵌入式省赛第一场真题 技巧:字符串比较 、字符串数组转移提取、for和return搭配使用、goto语句、利用%c和%s打印 CubeMX配置、主要函数代码及说明: 1.使能外部高速时钟: 2.配置时钟树:

    2023年04月11日
    浏览(35)
  • 第十三届蓝桥杯嵌入式省赛第二场真题(基于HAL库的巨简代码+超级详解)

    相关说明: 开发板:CT117E-M4(STM32G431RBT6) 开发环境: CubeMX+Keil5 涉及题目:第十三届蓝桥杯嵌入式省赛第二场真题 CubeMX配置、主要函数代码及说明: 1.使能外部高速时钟: 2.配置时钟树: 3.GPIO: 4.TIM2(通道2 PA1输出脉冲信号): 5.UART: 6.NVIC优先级配置    博主参加的是第一场

    2023年04月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包