蓝桥杯嵌入式第十一届省赛第一场
·
1.题目要求







2.main中
#include "user.h"
int main(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC2_Init();
MX_TIM2_Init();
LCD_Init();
LCD_Clear(Black);
LCD_SetBackColor(Black);
LCD_SetTextColor(White);
HAL_TIM_Base_Start_IT(&htim2);
while (1)
{
key_proc();
R37_proc();
lcd_proc();
led_proc();
}
}
3.user.c中
#include "user.h"
extern ADC_HandleTypeDef hadc2;
extern TIM_HandleTypeDef htim2;
uint8_t key_value,key_down,key_up,key_old = 0;
void key_scan(void)
{
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == RESET)
key_value = 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == RESET)
key_value = 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == RESET)
key_value = 3;
else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0) == RESET)
key_value = 4;
else key_value = 0;
key_down = key_value & (key_value ^ key_old);
key_up = ~key_value & (key_value ^ key_old);
key_old = key_value;
}
#define Data 1
#define Para 2
double Vmax = 3.0,Vmax_valid = 3.0;
double Vmin = 1.0,Vmin_valid = 1.0;
uint8_t led2_flag = 0;
uint8_t page_index = 1;
uint32_t key_tick = 0;
void key_proc(void)
{
if(uwTick - key_tick < 20)
return;
key_tick = uwTick;
key_scan();
if(key_down == 1)
{
page_index ++;
LCD_Clear(Black);
if(Vmax >= Vmin + 1.0) //符合条件生效
{
Vmax_valid = Vmax;
Vmin_valid = Vmin;
led2_flag = 0;
}
else led2_flag = 1;
if(page_index > 2)page_index = 1;
}
if(page_index == Para)
{
if(key_down == 2)
{
if(Vmax < 3.30)Vmax += 0.1;
else if(Vmax > 3.30)Vmax = 0;
}
else if(key_down == 3)
{
if(Vmin < 3.30)Vmin += 0.1;
else if(Vmin > 3.30)Vmin = 0;
}
}
}
uint32_t time_ms = 0;
uint32_t time_s = 0;
double R37_vlot_Av = 0;
uint32_t adc_tick = 0;
uint8_t start_flag = 0; //0为不开始不记时,1为开始计时
uint8_t time_flag = 0; //0为不记时,1为计时
void R37_proc(void)
{
static uint16_t ADC_Value_Sum = 0;
HAL_ADC_Start(&hadc2);
if(uwTick - adc_tick < 300)
return;
adc_tick = uwTick;
for(int i = 0;i < 10;i ++)
{
ADC_Value_Sum = ADC_Value_Sum + HAL_ADC_GetValue(&hadc2);
}
R37_vlot_Av = (3.3f * (ADC_Value_Sum / 10.0)) / 4095.0f;
ADC_Value_Sum = 0;
if(R37_vlot_Av < Vmin_valid)
{
time_ms = 0;
time_s = 0;
start_flag = 1;
time_flag = 0;
}
if(start_flag == 1)
{
if(R37_vlot_Av >= Vmin_valid)
{
start_flag = 0;
time_flag = 1;
}
}
if(R37_vlot_Av >= Vmax_valid)
{
start_flag = 0;
time_flag = 0;
}
}
char buf[30];
uint32_t lcd_tick = 0;
void lcd_proc(void)
{
if(uwTick - lcd_tick < 150)
return;
lcd_tick = uwTick;
if(page_index == Data)
{
LCD_DisplayStringLine(Line0,(u8 *)" Data ");
sprintf(buf," V:%.2lfV ",R37_vlot_Av);
LCD_DisplayStringLine(Line2,(u8 *)buf);
sprintf(buf," T:%ds ",time_s);
LCD_DisplayStringLine(Line3,(u8 *)buf);
}
else if(page_index == Para)
{
LCD_DisplayStringLine(Line0,(u8 *)" Para ");
sprintf(buf," Vmax:%.1lfV ",Vmax);
LCD_DisplayStringLine(Line2,(u8 *)buf);
sprintf(buf," Vmin:%.1lfV ",Vmin);
LCD_DisplayStringLine(Line3,(u8 *)buf);
}
}
void led_proc(void)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
if(time_flag == 1)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8,GPIO_PIN_SET);
if(led2_flag == 1)
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_9,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim -> Instance == TIM2)
{
if(time_flag == 1)
{
time_ms ++;
if(time_ms % 1000 == 0) //将ms转换成s
{
time_s ++;
}
}
}
}
4.user.h中
#ifndef __USER_H
#define __USER_H
#include "stdio.h"
#include "main.h"
void key_proc(void);
void R37_proc(void);
void lcd_proc(void);
void led_proc(void);
#endif
5.总结
1.注意ADC要有个滤波处理(求平均即可),不要看漏
2.按照图像处理计时,这个点还是挺好玩的,但是也不难
3.配置了一个定时器,1ms中断,到time_ms到1000时转换成time_s
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐


所有评论(0)