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

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐