蓝桥杯嵌入式第十届省赛程序设计题

目录

系列文章目录

前言

一、题目介绍

二、模块实现

1.LED+LCD

2.key+adc

3.自定义函数

总结


系列文章目录

  第六届省赛

http://t.csdnimg.cn/5Zcq7

第十一届省赛

http://t.csdnimg.cn/JcQMH

第十三届省赛第一场

http://t.csdnimg.cn/cBrmc

第十三届省赛第二场

http://t.csdnimg.cn/XYVTg

第十四届省赛

http://t.csdnimg.cn/qYWXw

第十五届4T模拟赛 加部分更新

http://t.csdnimg.cn/abvcg

http://t.csdnimg.cn/dXx9w


前言

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。

一、题目介绍

二、模块实现

1.LED+LCD

//定义变量

char str[4][30];
char led[8][4]={"LD1","LD2","LD3","LD4","LD5","LD6","LD7","LD8"};	//用于后面LCD的显示

/**************************LED************************************/

//全部LED灯初始化
void Led_Init()
{
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8 
                          |GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

//控制单个LED灯亮灭
void Control_Single_Led(unsigned char location,unsigned char state)
{
	HAL_GPIO_WritePin(GPIOC,location<<8,state);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}

//LED处理函数避免与LCD显示冲突
void Invoid_Complict()
{
	HAL_GPIO_WritePin(GPIOC,0xff00, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}


void Display_led()
{
	//Invoid_Complict();
	
	//超过上限
	if(v_37>v_max)
	{
		led_sta=0;
		Control_Single_Led(led_upper,led_sta);
		HAL_TIM_Base_Start_IT(&htim3);
	}
	
	//超过下限
	else if(v_37<v_min)
	{
		led_sta=0;
		Control_Single_Led(led_lower,led_sta);
		HAL_TIM_Base_Start_IT(&htim3);
	}
	
	//正常值
	else
	{
		Led_Init();
		HAL_TIM_Base_Stop(&htim3);
	}
}
/*******************************LCD************************************/


//数据显示界面显示
void Data_Show()
{
		char st[30];
		sprintf(st,"       Main         ");
		LCD_DisplayStringLine(Line1,(u8*)st);
		sprintf(st,"    Volt:%.2fV         ",v_37);
		LCD_ClearLine(Line2);
		LCD_DisplayStringLine(Line3,(u8*)st);
		LCD_ClearLine(Line4);
		if(v_37>v_max)
			sprintf(st,"    Status:Upper         ");
		else if(v_37<v_min)
			sprintf(st,"    Status:Lower         ");
		else
			sprintf(st,"    Status:Normal         ");
		LCD_DisplayStringLine(Line5,(u8*)st);
}

//参数显示界面显示
void Para_Show()
{
		char st[30];
		sprintf(st,"       Setting         ");
		LCD_DisplayStringLine(Line1,(u8*)st);
		sprintf(str[0],"  Max Volt:%.1fV       ",v_max);
		sprintf(str[1],"  Min Volt:%.1fV       ",v_min);
		sprintf(str[2],"  Upper:%s       ",led[upper_led%8]);
		sprintf(str[3],"  Lower:%s       ",led[low_led]);
		
		//实现对于当前调整的参数对象高亮
		if(change_type%4==0)
			{
				LCD_SetBackColor(Blue);
				LCD_DisplayStringLine(Line2,(u8*)str[0]);
				LCD_SetBackColor(Black);
			}
		else
			LCD_DisplayStringLine(Line2,(u8*)str[0]);
		
		if(change_type%4==1)
			{
				LCD_SetBackColor(Blue);
				LCD_DisplayStringLine(Line3,(u8*)str[1]);
				LCD_SetBackColor(Black);
			}
		else
			LCD_DisplayStringLine(Line3,(u8*)str[1]);
			
		if(change_type%4==2)
			{
				LCD_SetBackColor(Blue);
				LCD_DisplayStringLine(Line4,(u8*)str[2]);
				LCD_SetBackColor(Black);
			}
		else
			LCD_DisplayStringLine(Line4,(u8*)str[2]);
			
		if(change_type%4==3)
			{
				LCD_SetBackColor(Blue);
				LCD_DisplayStringLine(Line5,(u8*)str[3]);
				LCD_SetBackColor(Black);
			}
		else
			LCD_DisplayStringLine(Line5,(u8*)str[3]);
}
void Display_lcd()
{
	if(menu%2==0)
		Data_Show();
	else
		Para_Show();
}

2.key+adc

/************************************ADC模块*************************/
void Get_adc()
{
	int adc;
	HAL_ADC_Start(&hadc2);
	adc=HAL_ADC_GetValue(&hadc2);
	HAL_ADC_Stop(&hadc2);
	v_37= adc*3.3/4096;
}


/************************************按键功能实现***********************/
void Key_Function()
{
	//切换显示界面
	if(keys[0].key_flg==1)
	{
		menu++;
		keys[0].key_flg=0;
	}
	//选择调整的参数项
	if(keys[1].key_flg==1)
	{
		change_type++;
		keys[1].key_flg=0;
	}
	
	//增加当前选择的电压参数或LED提醒指示灯参数
	if(keys[2].key_flg==1)
	{
		//电压上限
		if(change_type%4==0)
		{
			v_max+=0.3;
		}
		
		//电压下限
		else if(change_type%4==1)
		{
			v_min+=0.3;
		}
		
		//上限LED灯
		else if(change_type%4==2)
		{
			if((upper_led+1)%8!=low_led)
			{
				//改变LED的位置
				if(led_upper==0x80)
					led_upper=0x01;
				else
					led_upper<<=1;
				upper_led++;
				upper_led%=8;
			}
			else
				{
					//改变LED的位置
				if(led_upper==0x80)
					led_upper=0x02;
				else
					led_upper<<=2;
				upper_led+=2;
				upper_led%=8;
				}
		}
		
		//下限LED灯
		else
		{
			if((low_led+1)%8!=upper_led)
			{
				if(led_lower==0x80)
					led_lower=0x01;
				else
					led_lower<<=1;
				low_led++;
				low_led%=8;
			}
			else
			{
				if(led_lower==0x80)
					led_lower=0x02;
				else
					led_lower<<=2;
				low_led+=2;
				low_led%=8;
			}
		}
		keys[2].key_flg=0;
	}
	
	//减少当前选择的电压参数或LED提醒指示灯参数
	if(keys[3].key_flg==1)
	{
		//电压上限
		if(change_type%4==0)
		{
			v_max-=0.3;
		}
		
		//电压下限
		else if(change_type%4==1)
		{
			v_min-=0.3;
		}
		
		
		//上限LED灯
		else if(change_type%4==2)
		{
			
			if(upper_led==0 && low_led==7)
			{
				upper_led=6;
				led_upper=0x40;
			}
			else if(upper_led==0 && low_led!=7)
			{
				upper_led=7;
				led_upper=0x80;
			}
			else if(upper_led!=0 && upper_led-1==low_led)
			{
				upper_led-=2;
				led_upper>>=2;
			}
			else
			{
				upper_led--;
				led_upper>>=1;
			}
		}
		

		//下限LED灯
		else
		{
			
			if(low_led==0 && upper_led==7)
			{
				low_led=6;
				led_lower=0x40;
			}
			else if(low_led==0 && upper_led!=7)
			{
				low_led=7;
				led_lower=0x80;
			}
			else if(low_led!=0 && low_led-1==upper_led)
			{
				low_led-=2;
				led_lower>>=2;
			}
			else
			{
				low_led--;
				led_lower>>=1;
			}
		}
		keys[3].key_flg=0;
	}
	
	Display_led();
}

3.自定义系统函数

/********************************自定义系统函数****************/
void sys_init()
{
	HAL_TIM_Base_Start_IT(&htim2);
	
	//lcd 初始化
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetTextColor(White);
	LCD_SetBackColor(Black);

	//LED初始化
	Invoid_Complict();
	Led_Init();
	
	
}

void sys_work()
{
	Get_adc();
	Display_lcd();
	Invoid_Complict();
	Key_Function();
}

总结

好了,本次的记录到此结束,总体来说,是非常简单的一套,因为用到的模块都只有三四个,都是常驻的

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值