蓝桥杯嵌入式第六届省赛真题(代查)

本人提供代查服务,检测题目是否按要求编写功能以及修改代码纠正错误。

目录

一、题目

二、程序代码

1. RTC实时时钟

2. ADC测量功能

3. 串行功能

4.  LCD显示

 5. 按键功能

总结


一、题目


二、程序代码

1. RTC实时时钟

合并写入到 LCD显示 内。

2. ADC测量功能

此返回的数据需要处理,ADC*3.3f/4096。

因为:

ADC的范围值为:0-4096

IO口输出的电压为:0-3V

float ADC_R37(void)
{
	float ADC;
	HAL_ADC_Start(&hadc2);
	ADC = HAL_ADC_GetValue(&hadc2);
	return ADC;
}

3. 串行功能

实现串口接收上报和定时上报数据功能。

void Usart1_Proc(void)
{
	if((uwTick -  uwTick_Usart_Set_Point)<30)	return;//减速函数
	uwTick_Usart_Set_Point = uwTick;
	//串行功能一
	if(((uwTick - Uart_Rev_Data_Delay_Time)<=250)&&(uwTick - Uart_Rev_Data_Delay_Time)>=200)//200ms~250ms之内处理数据--会影响发送的次数*****
	{
		if( (Usart1_Rx_buf[0]==0X6B)&&(Usart1_Rx_buf[1]==0X30)&&(Usart1_Rx_buf[2]==0X2E)&&(Usart1_Rx_buf[4]==0X5C)&&(Usart1_Rx_buf[5]==0X6E) )
		{
			if( (Usart1_Rx_buf[3]>=0X31)&&(Usart1_Rx_buf[3]<=0X39) )
			{
				k=Usart1_Rx_buf[3]-0x30;
				sprintf((char *)Usart1_Str,"ok\n");
				HAL_UART_Transmit(&huart1,Usart1_Str,strlen((const char *)Usart1_Str),50);
				K_W[0]=k;
				IIC_24C02_Write(K_W,0,1);
			}
			Usart1_Rx_Start_Sign=0;//接收标志位清零*****
			Rx_index=0;//数据位数清零*****
		}
	}
	//串行功能二:定时上报电压
	if( (RTC_sTime.Hours==RTC_Dis[0])&&(RTC_sTime.Minutes==RTC_Dis[1])&&(RTC_sTime.Seconds==RTC_Dis[2]) )
	{
		if(Usart1_Tx_Times==0)//使数据只发送一次的标志*****
		{
			sprintf((char *)Usart1_Str,"%3.2f+0.%d+%d%d%d\n",ADC_R37()*3.3f/4096,k,RTC_Dis[0],RTC_Dis[1],RTC_Dis[2]);
			HAL_UART_Transmit(&huart1,Usart1_Str,strlen((const char *)Usart1_Str),50);
			Usart1_Tx_Times=1;
		}
	}
	else 
	{
		Usart1_Tx_Times=0;
	}
}

 串口接收中断函数

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if( (Usart1_Rx=='k') && (Rx_index==0) )//接收条件
	{
		Uart_Rev_Data_Delay_Time = uwTick;//接收到第一个数据启动计时*****
		Usart1_Rx_Start_Sign=1;//接收标志位*****
	}
	if(Usart1_Rx_Start_Sign==1)
	{
		Usart1_Rx_buf[Rx_index]=Usart1_Rx;//将数据一个一个存入数组
		Rx_index++;//数据位数增加
	}
	HAL_UART_Receive_IT(&huart1,(uint8_t *)(&Usart1_Rx),1);
}

4.  LCD显示

void LCD_Proc(void)
{
	HAL_RTC_GetTime(&hrtc,&RTC_sTime,RTC_FORMAT_BIN);
	HAL_RTC_GetDate(&hrtc,&RTC_sDate,RTC_FORMAT_BIN);
	if(LCD_Pag==1)
	{
		sprintf((char *)LCD_Str,"     V1:%3.2f",ADC_R37()*3.3f/4096);
		LCD_DisplayStringLine(Line3,LCD_Str);
		sprintf((char *)LCD_Str,"     k:0.%d",k);
		LCD_DisplayStringLine(Line4,LCD_Str);
		if(LED_Flicker==1)
		{
			sprintf((char *)LCD_Str,"     LED:ON        ");
			LCD_DisplayStringLine(Line5,LCD_Str);
		}
		else
		{
			sprintf((char *)LCD_Str,"     LED:OFF       ");
			LCD_DisplayStringLine(Line5,LCD_Str);
		}
		sprintf((char *)LCD_Str,"     T:%02d-%02d-%02d",RTC_sTime.Hours,RTC_sTime.Minutes,RTC_sTime.Seconds);
		LCD_DisplayStringLine(Line6,LCD_Str);
	}
	else if(LCD_Pag==2)
	{
		sprintf((char *)LCD_Str,"     Setting");
		LCD_DisplayStringLine(Line3,LCD_Str);
		sprintf((char *)LCD_Str,"             ");
		LCD_DisplayStringLine(Line4,LCD_Str);
		sprintf((char *)LCD_Str,"     T:%02d-%02d-%02d",RTC_Con[0],RTC_Con[1],RTC_Con[2]);
		if( (uwTick-uwTick_Lcd) < 500) {return;}
		uwTick_Lcd=uwTick;
		LCD_Time_Sign_Flicker^=0x01;
		if(LCD_Time_Sign_Flicker==0x01)
		{
			if(LCD_Time_Sign==1)
			{
				LCD_Str[8] = ' ';
				LCD_Str[7] = ' ';
			}
			else if(LCD_Time_Sign==2)
			{
				LCD_Str[11] = ' ';
				LCD_Str[10] = ' ';
			}
			else if(LCD_Time_Sign==3)
			{
				LCD_Str[14] = ' ';
				LCD_Str[13] = ' ';
			}
		}
		LCD_DisplayStringLine(Line5,LCD_Str);
		sprintf((char *)LCD_Str,"               ");
		LCD_DisplayStringLine(Line6,LCD_Str);
	}
}

 5. 按键功能

void Key_Proc(void)
{
	if( (uwTick-uwTick_Key) < 100) {return;}
	uwTick_Key=uwTick;
	
	Key_Val=Key_Scan();
	Key_Down=Key_Val & (Key_Old ^ Key_Val);
	Key_Up=~Key_Val & (Key_Old ^ Key_Val);
	Key_Old=Key_Val;

	if(Key_Down==1)
	{
			LED_Flicker^= 0x01;
	}
	if(Key_Down==2)
	{
		if(LCD_Pag==1)
		{	
			LCD_Pag=2;
		}
		else if(LCD_Pag==2)
		{
			LCD_Pag=1;
			RTC_Dis[0]=RTC_Con[0];
			RTC_Dis[1]=RTC_Con[1];
			RTC_Dis[2]=RTC_Con[2];
		}
	}
	if( (Key_Down==3)&&(LCD_Pag==2) )
	{
		LCD_Time_Sign+=1;
		if(LCD_Time_Sign==4)
		{
			LCD_Time_Sign=1;
		}
	}
	if( (Key_Down==4)&&(LCD_Pag==2) )
	{
		if(LCD_Time_Sign==1)
		{
			RTC_Con[0]+=1;
			if(RTC_Con[0]==24)
			{
				RTC_Con[0]=0;
			}
		}
		if(LCD_Time_Sign==2)
		{
			RTC_Con[1]+=1;
			if(RTC_Con[1]==60)
			{
				RTC_Con[1]=0;
			}
		}
		if(LCD_Time_Sign==3)
		{
			RTC_Con[2]+=1;
			if(RTC_Con[2]==60)
			{
				RTC_Con[2]=0;
			}
		}
	}
}

总结

第六届的内容相对来说比较简单,只需要细心的去编写基本都可以完成。

CubeMX的初始化因为图片过多在这省略了,需要的可以私信我。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DDKevin19

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值