【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

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

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

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

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

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

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

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

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

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

题目

硬件框图

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解​ 

功能要求

功能概述

        1)设计一个停车计费系统,能够完成费率设置、费用计算等功能。

        2)使用串口获取车辆进、出停车场信息和时间,并能够输出计费信息。

        3)使用按键完成费率设置、调整功能。

        4)按照显示要求,通过LCD显示停车状态、费率参数。

        5)通过PA7输出固定频率和占空比的脉冲信号或持续低电平。

        6)使用LED指示灯完成相关指示功能。

性能要求

        1)计费信息输出响应时间:≤0.1秒;

        2)按键响应时间:≤0.2秒;

        3)车位数量:8个。

LED显示界面

        1)车位显示界面
        在车位显示界面下,通过LCD显示界面名称(Data)、停车场内目前的停车数量和空闲车位,CNBR和VNBR代表两类不同的停车类型。

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

        上图所示停车数量共6辆,CNBR类2辆,VNBR类4辆,空闲车位2个。

        2)费率设置界面
        在费率设置界面下,通过LCD显示界面名称(Para)、CNBR类型和VNBR类型停车的费率,单位为元/小时,保留小数点后2位有效数字。

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

        上图所示CNBR类停车费率位3.50元/小时,VNBR类型停车费率位2.00元/小时。

        3)LCD通用显示要求
        显示背景色(BackColor):黑色显示前景色(TextColor):白色
        请严格按照图示2、3要求设计各个信息项的名称(区分字母大小写)和行列位置。

按键功能

        1)B1:定义为“界面切换”按键,切换LCD显示“车位显示界面”和“费率设置界面”。

        2)B2:定义为“加”按键,每次按下B2按键,CNBR、VNBR费率增加0.5元。

        3)B3:定义为“减”按键,每次按下B3按键,CNBR、VNBR费率减少0.5元。

        4)B4:定义为“控制”按键,按下后,切换PA7端口输出状态(2KHz,20%占空比的脉冲信号或持续低电平),切换要求如下图所示。

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

        5)通用按键设计要求
        按键应进行有效的防抖处理,避免出现一次按下、多次触发等情形。
        按键B2、B3仅在费率设置界面有效。

串口功能
        1)使用竞赛平台上的USB转串口完成相关功能设计。

        2)串口通信波特率设置为9600bps。

        3)使用4个任意ASCII字符组成的字符串标识车辆,作为车辆编号。

        4)串口接收车辆出入信息
        入停车场
                停车类型:车辆编号:进入时间(YYMMDDHHmmSs)举例:
                        CNBR:A392:200202120000
                        表示停车类型CNBR,编号为A392的车辆,进入停车场时间为2020年2月2日12时整。
        出停车场
                停车类型:车辆编号:退出时间举例:
                        VNBR: D583:200202132500
                        表示停车类型 VNBR,编号为D583的车辆,退出停车场时间为2020年2月2日13时25分。

        5)串口输出计费信息
        停车类型:车辆编号:停车时长:费用举例:
        串口接收车辆入停车场信息        VNBR: D583:200202120000

        串口接收车辆出停车场信息        VNBR: D583:200202213205

        串口输出计费信息                      VNBR:D583:10:20.00
        表示停车类型VNBR,编号为D583的车辆,停车时长为10小时,停车费用为20.00元。

        6)说明
        车辆出入信息通过“资源数据包”中提供的串口助手向竞赛平台发送字符串,格式需要严格按照示例要求。

        停车时长:整数,单位为小时,不足1小时,按1小时统计。

        停车费用:以元为单位,按小时计费,保留小数点后2位有效数字。

        系统收到入停车场信息后,不需要回复;接收到出停车场信息后,解析、计算并通过串口回复计费信息。
        当接收到的字符串格式不正确或存在逻辑错误,系统通过串口输出固定提示信息字符串 Error 。
LED指示灯功能
        1)若停车场内存在空闲车位,指示灯LD1点亮,否则熄灭。

        2)PA7输出2KHz,20%占空比脉冲信号期间,指示灯LD2点亮,否则熄灭。

初始状态说明
        1)上电默认PA7处于低电平状态。

        2)上电默认处于车位显示界面。

        3)上电默认参数,CNBR费率3.50元/小时,VNBR费率2.00元/小时。

        4)每次重新上电后,默认空闲车位为8个。


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

 赛题分析

        拿到赛题,第一件事就是看硬件框图,因为可以看出本届赛题的重点考点。除了老三样(LED,按键,LCD)以外,就是我们的重点考点了。很显然,本次赛题的考点是串口通信与脉冲频率的设置。

        然后我们再来理解具体要实现的功能。看到功能概述,可以知道串口通信对应着停车计费系统,而脉冲频率对应着改变PA7的占空比。其他细节方面我们通过代码来进一步了解。

代码实现

串口模块

        最重要的功能就是完整接收串口传来的出入车库的车辆信息。然后判断是接收的信息车牌是否已经存在,已经存在就代表是出库 ,不存在就代表入库,出库就要进行计费计算,并通过串口将结果按赛题要求打印出来。期间出入库是,改变相应的变量值,如空闲车位等。

void uart_rx_proc()
{
	if(rx_pointer>0)
	{
		if(rx_pointer==22 && i < 8)	//如果接收到的是22个字符
		{
			sscanf(rxdata,"%4s:%4s:%12s",car_type,car_data,car_time);	//将字符串拆分
			int j = 0;
			for( j=0;j < 8;j++)
			{
				if ((strcmp(car_data, Car[j].car_data) == 0) && (strcmp(car_type, Car[j].car_type) == 0))	//如果与之前数据的DATA相同,则代表这次是出库,计算费用,并通过串口发送
				{
					char tyear[4],tm[2],td[2],th[2],tf[2],ts[2], tyear1[4],tm1[2],td1[2],th1[2],tf1[2],ts1[2];
					int year,m,d,h,f,s,year1,m1,d1,h1,f1,s1;
					int time = 0;
					double fee;
					sscanf(car_time,"%2s%2s%2s%2s%2s%2s",tyear,tm,td,th,tf,ts);		//将表示时间的字符串分割
					sscanf(Car[j].car_time,"%2s%2s%2s%2s%2s%2s",tyear1,tm1,td1,th1,tf1,ts1);
					year=atoi(tyear);			//将字符串转为整形变量
					m = atoi(tm);
					d = atoi(td);
					h = atoi(th);
					f = atoi(tf);
					s = atoi(ts);
					
					year1=atoi(tyear1);	
					m1 = atoi(tm1);
					d1 = atoi(td1);
					h1 = atoi(th1);
					f1 = atoi(tf1);
					s1 = atoi(ts1);
					
					if(year1 == year)		//计算时间
					{
						if(m == m1)
						{
							time = ceil( ( ((d*24+h)*60+f)*60+s - ((d1*24+h1)*60+f1)*60+s1 ) / 3600);		//ceil向下取整,计算出停车多少小时
						}
					}
					if(strcmp(car_type,"CNBR") == 0)	//判断车型
					{
						fee = time * CNBR_fee;
						CNBR_sum--;
					}
					else
					{
						fee = time * VNBR_fee;
						VNBR_sum--;
					}
					
					char temp[20];
					sprintf(temp,"%s:%s:%d:%.2f",car_type,car_data,time,fee);
					HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);	//串口发送计费信息
					
					if(i != j)		//如果匹配的不是已入库的最后一个,就将最后一个入库的信息复制到这个位置上
					{
						sprintf(Car[j].car_type,"%s",Car[i].car_type);		//将最后入库的信息复制到当前出库的位置
						sprintf(Car[j].car_data,"%s",Car[i].car_data);
						sprintf(Car[j].car_time,"%s",Car[i].car_time);
					}
					
					i--;		//i--后,下次有新入库的车辆就直接覆盖这次最后入库的信息
					
					break;
				}
				else
				{
					if(j >= 7)		//说明未匹配成功
					{
						sscanf(rxdata,"%4s:%4s:%12s",Car[i].car_type,Car[i].car_data,Car[i].car_time);	//将字符串拆分
						char temp[20];
						sprintf(temp,"%s:%s:%s",Car[i].car_type,Car[i].car_data,Car[i].car_time);
						HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);	//串口发送入库信息
						i++;
						if(strcmp(Car[i].car_type,"VNBR") == 0)
						{
							VNBR_sum++;
						}
						else
						{
							CNBR_sum++;
						}
					}
				}
			}
		}
		else
		{
			char temp[20];
			sprintf(temp,"Error");
			HAL_UART_Transmit(&huart1,(uint8_t *)temp,strlen(temp),50);	//串口发送一个错误提示
		}
		rx_pointer=0;
		memset(rxdata,0,30);
		
		
		LDLE_sum = 8-i;
		if(i == 8)
		{
			TurnOff_LED(1);
		}
		else
		{
			TurnOn_LED(1);
		}
	}
}

        在串口调试工具中的实现效果 (第一次黑色信息为串口发送给开发板的让车库信息,第二次为出车库信息)

【蓝桥杯嵌入式】蓝桥杯第十二届省赛程序真题,真题分析与代码讲解

按键模块

        按键模块就是简单的界面切换,费率的加减。要注意的是第四个按键被设置为改变PA7频率的按键。

void key_proc()
{
	if(key[0].key_flag == 1)
	{
		view++;
		if(view==2) view=0;
		LCD_Clear(Black);		//清屏
		key[0].key_flag = 0;
	}
	if(view==1 && key[1].key_flag == 1)
	{
		CNBR_fee += 0.5;
		VNBR_fee += 0.5;
		key[1].key_flag = 0;
		LCD_Clear(Black);
	}
	else if(view==1 && key[2].key_flag == 1)
	{
		CNBR_fee -= 0.5;
		VNBR_fee -= 0.5;
		key[2].key_flag = 0;
		LCD_Clear(Black);
	}
	
	if(key[3].key_flag == 1)
	{
		if(pa7_duty == 0)
		{
			pa7_duty = 20;
			TurnOn_LED(2);
		}
		else
		{
			pa7_duty = 0;
			TurnOff_LED(2);
		}
		__HAL_TIM_SetCompare(&htim17,TIM_CHANNEL_1,pa7_duty);		//设置占空比pa7_duty
		key[2].key_flag = 0;
	}
}

LCD模块

        LCD就是按赛题要求显示相应内容即可。注意:从第11届开始,已经要求LCD显示必须完全按照赛题上的格式来显示,每一行每一列显示什么一定要注意。文章来源地址https://www.toymoban.com/news/detail-414096.html

void disp_proc()
{
	if(view==0)
	{
		char text[30];
		sprintf(text,"      Data   ");
		LCD_DisplayStringLine(Line1, (uint8_t *)text);
		sprintf(text,"   CNBR:%d",CNBR_sum);
		LCD_DisplayStringLine(Line3, (uint8_t *)text);
		sprintf(text,"   VNBR:%d",VNBR_sum);
		LCD_DisplayStringLine(Line5, (uint8_t *)text);
		sprintf(text,"   IDLE:%d",LDLE_sum);
		LCD_DisplayStringLine(Line7, (uint8_t *)text);
	}
	else if(view==1)
	{
		char text[30];
		sprintf(text,"    Para    ");
		LCD_DisplayStringLine(Line2, (uint8_t *)text);
		sprintf(text,"   CNBR:%.2f",CNBR_fee);
		LCD_DisplayStringLine(Line4, (uint8_t *)text);
		sprintf(text,"   VNBR:%.2f",VNBR_fee);
		LCD_DisplayStringLine(Line6, (uint8_t *)text);
	}
}

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

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

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

相关文章

  • [蓝桥杯嵌入式]STM32G431——第十二届第一场省赛停车计费系统真题及程序设计代码详解

    最近,我报名了今年的蓝桥杯嵌入式比赛,为此刷了一下以往的真题。以下是我对十二届蓝桥杯省赛真题的一些思路和心得,还有一些具体代码的实现。 1、相关模块 第十二届比赛主要用到的模块包括:LED、KEY、LCD、TIM、USART 2、重难点分析 这道题主要目的是做一个停车管理

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

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

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

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

    2024年02月06日
    浏览(58)
  • 蓝桥杯单片机学习15——第十二届省赛题

    书接上文,上期我们基本完成了十三届省赛题,但还是存在一些问题,本期我将对上期存在的一些问题,提出一些解决方案,并加以实践验证可行性,废话少说,让我们往下看。 上期我们提到,数码管和LED在使用的时候会存在外设之间相互干扰的问题,在我们不断的探索之下

    2024年01月25日
    浏览(61)
  • 【蓝桥杯单片机】第十二届省赛(含题目和解答代码)

    main.c  iic.c iic.h onewire.c onewire.h      

    2024年02月04日
    浏览(72)
  • 蓝桥杯第十四届省赛完整题解 C/C++ B组

    没有测评,不知道对不对,仅仅过样例而已 本题总分:5 分 【问题描述】 小蓝现在有一个长度为 100 的数组,数组中的每个元素的值都在 0 到 9 的 范围之内。数组中的元素从左至右如下所示: 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9

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

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

    2023年04月16日
    浏览(165)
  • 【蓝桥杯嵌入式】第十三届蓝桥杯嵌入式国赛程序设计试题以及详细题解

      本届国赛试题主要包含 LCD 、 LED 、 按键 、 EEPROM 、 串口 、 模拟电压输入 、 脉冲输入输出 七大部分,其中前面三个部分是蓝桥杯嵌入式的“亲儿子”(必考部分),而剩下的四个部分都为“干儿子”(考频相对较高)。   相对于本届省赛两套试题:   本套试题 串口数

    2024年02月02日
    浏览(89)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛2]客观题及详细题解

    解析 USART_CR1:控制寄存器1,其中的M位定义了数据字的长度,由软件对其设置和清零。 USART_CR2:控制寄存器2。 USART_BRR:波特率寄存器。 USART_DR:数据寄存器。 (如果现场不记得,可以查阅芯片手册) 答案: A 解析 在STM32微控制器中,DMA可编程的数据传送数目:最大为65535。(如果现场不

    2023年04月10日
    浏览(67)
  • 【蓝桥杯嵌入式】第十四届蓝桥杯嵌入式[模拟赛1]程序设计试题及详细题解

    模拟赛1的题目中需要的准备的知识点不多,其中只用到了 串口 、 LCD 、 LED 、 按键 、 定时器的PWM输出 、以及 ADC 等几个模块,题目要求也简单详细并且数量不多,非常适合入门比赛,以及整合自己比赛的模块。 与模拟赛2相比,当然是模拟赛2的试题比较难啦,虽然需要的模

    2023年04月13日
    浏览(147)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包