蓝桥杯嵌入式第十届省赛真题

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

蓝桥杯嵌入式第十届省赛真题

1.题目分析

总的来说这题考点特别的少,逻辑也比我之前发的12届的停车计费简单得多,还是一样 代码结尾自取。完全免费

相对来说能从这题学到的。对我来说我觉得是 封装一些“状态”数组。可以让代码的可读性和复用性高很多。

思路其实很简单,就是切换界面和获取adc的值,并和上下限比较进行对应操作。

蓝桥杯嵌入式第十届省赛真题](https://imgtu.com/i/IvVBp4)
蓝桥杯嵌入式第十届省赛真题
蓝桥杯嵌入式第十届省赛真题

蓝桥杯嵌入式第十届省赛真题

2.项目结构

变量设计:

u32 TimingDelay = 0;

//切换设置函数
void setting();
void Delay_Ms(u32 nTime);
//更新
void Upate_Data();
//渲染主界面
void Fflush_Main();
//渲染设置界面
void Fflush_Setting();
//Key_4,3的对应控制这里的flag我觉得用的挺好的
//后面大家会看到 
void Key4_Control(int flag);
void Key3_Control(int flag);
//高光展示
void DymaicShow(int flag);
//控制状态
void Status_Control()

//展示数组(个人习惯)
char MaxVolDisplay[24];
char MinVolDisplay[24];
char UpperDisplay[24];
char LowerDisplay[24];
char StatusDisplay[24];
char VolDisplay[24];
//状态数组
char *Status[8]={"Normal","Upper  ","Lower  "};
//LED灯数组 这里也非常有用,可以和后面的led灯编号对照
uint16_t LED_Arr[9]={0,LED1,LED2,LED3,LED4,LED5,LED6,LED7,LED8};
//电压
double Vol = 3.22;
double MaxVol = 2.4;
double MinVOl = 1.2;
//LED编号
int UpperLED = 1;
int LowerLED = 2;
//状态值 和状态数组比较
int Status_Flag = 0;

2.1数组思路

首先先来聊聊为什么这里的LED要利用编号 而不是规定死字符串 “LD1”,“LD2”这样的。因为如果规定死字符串的话,到时候报警灯点亮的时候,还需要解析字符串取出最后一位的数字,麻烦

我们不如换一种思路 规定字符串为“LD”而我们在后面动态的拼接LED的编号。也就是这样

sprintf(UpperDisplay," Upper:LD%d",UpperLED);

就做到了利用UpperDisplay动态展示对应的数据。并且UpperLED可以用来后面点亮灯。

这也是为什么我要把LED封装成数组。

我们可以轻易的做到 利用UpperLED作为LED数组的下标,点亮对应的LED 这样点亮就非常方便了,而不需要if判断。如下

(这里的flag是用来交替闪烁的,200ms的时候 flag会自己取反,做到亮灭交替)

LED_Control(LED_Arr[UpperLED],Led_Flag);

那么前面的Status_Flag和char *Status[8]也是同理了;

这里我们就可以引出我的第一个函数

Status_Control.c

void Status_Control()
{
	if(Vol>MaxVol)
	{
        //这里的标志位是到时中断里200ms取反一次的 做到间断闪烁
        LED_Control(LED_Arr[UpperLED],Led_Flag);
		Status_Flag=1;
		return;
	}
	if(Vol<MinVOl)
	{
        LED_Control(LED_Arr[LowerLED],Led_Flag);
		Status_Flag=2;
		return;
	}
	Status_Flag=0;
}

可以很清晰的通过代码看出。不同的Status_Flag 到时就会动态的控制char *Status[8]展示他对应的该有的变量

sprintf(StatusDisplay,"  Status:%s",Status[Status_Flag]);
LCD_DisplayStringLine(Line5,StatusDisplay);

2.2Key_Flag控制对应逻辑

重点就在这四个函数

void Key4_Control(int flag);
void Key3_Control(int flag);
void DymaicShow(int flag);

分析题目我们可以读出,在Setting界面修改的时候,需要在最大电压值,最小电压值,最大电压LED编号和最小电压LED编号。这

四个地方切换,并通过KEY3,KEY4控制他们的加减。

他们的共性就是 4 个位置 对应四个不同的操作模式和操作逻辑。

(高光+KEY4+KEY3)*4个位置 那么有12种情况,为此写12个函数未免太过麻烦了。

我们抽象的来想,可以是 3个操作,各自对应4个模式把三个操作抽象成函数

三个操作里面对应的四种情况其实是平行关系的。

这个平行关系我们就用Flag替代。例如flag为1,执行三个函数里各自的情况1,flag2执行三个函数里各自的情况2。

而按键2 就是我们用来触发Flag改变的,逻辑如下(14-30行)

如此我们的代码耦合性就会降低 ,函数各司其职。

//切屏函数
void setting()
{
	char key;
	int flag=0;
	LCD_Clear(White);
	Fflush_Setting();
	
	while(1)
	{
		key = KEY_Scan();
		Vol=Get_Adc();
		Status_Control();
		DymaicShow(flag);
		switch(key)
		{
            //返回主界面
			case '1':
				LCD_Clear(White);
				LCD_SetBackColor(White);
				return;
			case '2':
				flag++;
				if(flag>=4){  flag=0;   }
				break;
			case '3':
				Key3_Control(flag);
				break;
			case '4':
				Key4_Control(flag);
				break;
		}
	}
}

2.3KEY控制操作

利用前面的操作,这里我们就可以做按键在不同高亮位置时不同对应的情况了,其实我觉得应该用switch case会更加好一点,结构更加清晰,但是当时写完懒得改了。

void Key3_Control(int flag)
{
    //最大电压值
	if(flag==0)
	{
		//浮点数计算精度问题
		if(MaxVol+0.3<3.300000000000001)
		{
			MaxVol+=0.3;
			return;
		}
		MaxVol=3.3;
	}
    //最小电压值
	else if(flag==1)
	{
		if(MinVOl+0.3<3.300000000000001)
		{
			MinVOl+=0.3;
			return;
		}
		MinVOl=3.3;
	}
    //最大电压值LED编号
	else if(flag==2)
	{
        //这里要先关灯,不然警告闪灯的时候,假设LED1亮还没熄灭的时候,
        //我们按下Key3切换,那么LED2闪烁,LED1还在亮
		LED_Control(LEDALL,0);
        //最大编号
		if(UpperLED==8)
		{
			UpperLED=8;
			return;
		}
        //如果往上+1的时候,和最小电压编号的LED编号相等的时候
        //那么我们需要过这个编号,让两个编号不相等
		if(UpperLED+1==LowerLED)
		{
            //但是如果跨过LowerLED的编号后会超过8,那么也不行的哦
			if(UpperLED+1==8)
			{
				return;
			}
            //逻辑完成,直接跨越
			UpperLED+=2;
			return;
		}
        //其他情况正常+1,后续最小电压那些也是同理,我就不写那么多注释了
		UpperLED++;
	}
    //最小电压值LED编号
	else if(flag==3)
	{
		LED_Control(LEDALL,0);
		if(LowerLED==8)
		{
			LowerLED=8;
			return;
		}
		if(LowerLED+1==UpperLED)
		{
			if(LowerLED+1==8)
			{
				return;
			}
			LowerLED+=2;
			return;
		}
		LowerLED++;
	}
}

KEY4_Control也是这个道理。这里就不复制展示了,代码文章结尾自取

高亮部分我来求解一下,大家有没有更好的解法,我只会这种最笨的方式

void DymaicShow(int flag)
{
	LCD_SetBackColor(White);
	if(flag==0)
	{
		LCD_DisplayStringLine(Line1, "      Setting");
		LCD_DisplayStringLine(Line4,MinVolDisplay);
		LCD_DisplayStringLine(Line5,UpperDisplay);
		LCD_DisplayStringLine(Line6,LowerDisplay);
        //单独某一行刷新改色
		LCD_SetBackColor(Yellow);
		sprintf(MaxVolDisplay," Max Volt:%.2f    ",MaxVol);
		LCD_DisplayStringLine(Line3,MaxVolDisplay);
		return;
	}
	if(flag==1)
	{
		LCD_DisplayStringLine(Line1, "      Setting");
		LCD_DisplayStringLine(Line3,MaxVolDisplay);
		LCD_DisplayStringLine(Line5,UpperDisplay);
		LCD_DisplayStringLine(Line6,LowerDisplay);
		LCD_SetBackColor(Yellow);
		sprintf(MinVolDisplay," Min Volt:%.2f    ",MinVOl);
		LCD_DisplayStringLine(Line4,MinVolDisplay);
		return;
	}
	if(flag==2)
	{
		LCD_DisplayStringLine(Line1, "      Setting");
		LCD_DisplayStringLine(Line3,MaxVolDisplay);
		LCD_DisplayStringLine(Line4,MinVolDisplay);
		LCD_DisplayStringLine(Line6,LowerDisplay);
		LCD_SetBackColor(Yellow);
		sprintf(UpperDisplay," Upper:LD%d        ",UpperLED);
		LCD_DisplayStringLine(Line5,UpperDisplay);
		return;
	}
	if(flag==3)
	{
		LCD_DisplayStringLine(Line1, "      Setting");
		LCD_DisplayStringLine(Line3,MaxVolDisplay);
		LCD_DisplayStringLine(Line4,MinVolDisplay);
		LCD_DisplayStringLine(Line5,UpperDisplay);
		LCD_SetBackColor(Yellow);
		sprintf(LowerDisplay," Lower:LD%d        ",LowerLED);
		LCD_DisplayStringLine(Line6,LowerDisplay);
		return;
	}
}

最后就是这个中断里取反的操作 很简单的

void SysTick_Handler(void)
{
	TimingDelay--;
	//低于下限电压
	if(Status_Flag==2)
	{
		if(++Led_Dealy==200)
		{
			Led_Flag= !Led_Flag;
			Led_Dealy=0;
		}
	}
	//高于上限电压
	else if(Status_Flag==1)
	{
		if(++Led_Dealy==200)
		{
			Led_Flag= !Led_Flag;
			Led_Dealy=0;
		}
	}
}

整体和逻辑有关的代码大概就是这样了

我个人认为最好的地方就是我用了数组和对应的Flag标识,来和数组组成映射关系,在代码里的很多地方都因此受益。还是个小萌新哈,如果大家有更好的方式也欢迎大家提出
下载资源链接 链接:源码文章来源地址https://www.toymoban.com/news/detail-421290.html

到了这里,关于蓝桥杯嵌入式第十届省赛真题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索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

领红包