【STM32G4】备战蓝桥杯嵌入式---实战---第十二届嵌入式模拟赛

   日期:2021-03-22     浏览:294    评论:0    
核心提示:文章目录前言一、题目功能简述二、模块初始化以及功能分析1.模块的初始化2.模块功能分析三、函数实现1.void Display(void);2.uint8_t KEY_Scan(uint8_t mode);3.void KEY_Handle(uint8_t key);4.uint16_t Get_ADC(void);5.EEPROM_Write(void);EEPROM_Read(void);6.HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);7.HA

文章目录

  • 前言
  • 一、题目
    • 功能简述
  • 二、模块初始化以及功能分析
    • 1.模块的初始化
    • 2.模块功能分析
  • 三、函数实现
      • 1.void Display(void);
      • 2.uint8_t KEY_Scan(uint8_t mode);
      • 3.void KEY_Handle(uint8_t key);
      • 4.uint16_t Get_ADC(void);
      • 5.int main(void);
        • 初始化;
        • while(1);
  • 总结

前言

为了减少篇幅,各模块的初始化均在模块配置中,可以随时去翻看博客,还有function里面的函数,将不再罗列出来,只是截图展示。

一、题目

总的来说此次模拟赛十分简单,可能预示着今年考题简单(纯属猜测)
大家还是要认真备考哦

功能简述



二、模块初始化以及功能分析

1.模块的初始化

需要用的模块:LCD、四个按键、LED、ADC(PB15)、TIM

2.模块功能分析

LCD:显示-----》Display();
按键:对参数进行调整-----》KEY_Handle();KEY_Scan();
LED:提示作用-----》LED();
ADC(PB15):读取温度传感器输出的信号-----》Get_ADC();
TIM(PA1): 输出不同频率的方波

三、函数实现

1.void Display(void);

void Display(void)
{ 
	
	if(mode == 0)
	{ 
		LCD_DisplayStringLine(Line1," Data");
		sprintf((char *)arr, " V:%.2fV",Volt);
		LCD_DisplayStringLine(Line3,arr);
		sprintf((char *)arr, " A:%d",Condition);
		LCD_DisplayStringLine(Line4,arr);
	}
	else if(mode == 1)
	{ 
		LCD_DisplayStringLine(Line1," Para");
		sprintf((char *)arr, " Vmax:%.1fV",Volt_Range[1]);
		LCD_DisplayStringLine(Line3,arr);
		sprintf((char *)arr, " Vmin:%.1fV",Volt_Range[0]);
		LCD_DisplayStringLine(Line4,arr);
	}
}

2.uint8_t KEY_Scan(uint8_t mode);

uint8_t KEY_Scan(uint8_t mode)
{ 
	static uint8_t flag=1;
	if(mode)	flag = 1;
	if(flag &&(KEY_B1 == 0 || KEY_B2	== 0 || KEY_B3 == 0 ||	KEY_B4== 0 ))
	{ 
		HAL_Delay(10);
		flag = 0;
		if (KEY_B1 == 0)	return B1_Press;
		else if (KEY_B2 == 0) return B2_Press;
		else if (KEY_B3 == 0) return B3_Press;
		else if (KEY_B4 == 0) return B4_Press;
	}else if(KEY_B1 == KEY_B2 == KEY_B3 == KEY_B4 == 1)	flag = 1;
	return 0;
}

3.void KEY_Handle(uint8_t key);

对于三个按键,不同的按键对应不同的操作
本次模拟题,仅有一个防误操作,只需要记录B1按下时的电压范围即可

void KEY_Handle(uint8_t key)
{ 
	static float i, j;
	if(key == B1_Press)
	{ 
		if(mode == 0)
		{ 
			i = Volt_Range[0];
			j = Volt_Range[1];
			mode = 1;
		}
		else
		{ 
			if(Volt_Range[1] - Volt_Range[0] < 0.5f)
			{ 
				Volt_Range[0] = i;
				Volt_Range[1] = j;
			}
			mode = 0;
		}
		LCD_Clear(White);
	}
	else if(key == B2_Press && mode == 1)
	{ 
		if(Volt_Range[1] == 0)
			Volt_Range[1] = 3.3f;
		else
			Volt_Range[1] = Volt_Range[1] - 0.1f;
		
	}
	else if(key == B3_Press && mode == 1)
	{ 
		if(Volt_Range[0] == 3.3f)
			Volt_Range[0] = 0;
		else
			Volt_Range[0] = Volt_Range[0] + 0.1f;
	}
}

4.uint16_t Get_ADC(void);

读取电压值,电压值为Get_ADC()*3.3/4096;

uint16_t Get_ADC(void)
{ 
	uint16_t temp = 0 ;
	HAL_ADC_Start(&hadc2);
	temp = HAL_ADC_GetValue(&hadc2);
	HAL_ADC_Stop(&hadc2);
	
	return temp;
}

5.int main(void);

初始化;

	LCD_Init();
	LCD_Clear(White);
	LCD_SetTextColor(Black);

	HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
	HAL_ADC_Init(&hadc2);

	Volt_Range[0] = 1;
	Volt_Range[1] = 3;
	Condition = 1;
	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|GPIO_PIN_8|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);

while(1);


这里对定时器输出PWM波做一些讲解
ARR即是加载的数值,PSC是预分频系数,CCR1是通道1的比较值,
即计数到CCR1输出高(低),CCR1到ARR是低(高),这里要看配置的模式

		Display();
		key = KEY_Scan(0);
		KEY_Handle(key);
		Volt = Get_ADC()*3.3/4096;
		
		if(Volt < Volt_Range[0])
			Condition_Stay = 1;
		else if(Volt > Volt_Range[1])
			Condition_Stay = 3;
		else
			Condition_Stay = 2;
    

    
		
		if(Condition_Stay == 1 && Condition_Stay != Condition)
		{ 
			Condition = Condition_Stay;
			TIM2->ARR = 1000-1;
			TIM2->PSC = 800-1;
			TIM2->CCR2 = 500;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_8, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_10
                          |GPIO_PIN_9|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);
		}
		else if(Condition_Stay == 2 && Condition_Stay != Condition)
		{ 
			Condition = Condition_Stay;
			TIM2->ARR = 1000-1;
			TIM2->PSC = 80-1;
			TIM2->CCR2 = 800;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_9, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |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);
		}
		else if(Condition_Stay == 3 && Condition_Stay != Condition)
		{ 
			Condition = Condition_Stay; 
			TIM2->ARR = 1000-1;
			TIM2->PSC = 8-1;
			TIM2->CCR2 = 200;
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_10, GPIO_PIN_RESET);
			HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15|GPIO_PIN_8
                          |GPIO_PIN_9|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);
		}
  }

总结

第一次参加模拟赛,嘿嘿,感jio还是不一样。
昨天完成了,一直没时间写,见谅,嘿嘿。
点个赞吧,最近都没赞了,心头拔凉拔凉的。┭┮﹏┭┮

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服