【STM32G431RBTx】备战蓝桥杯嵌入式→决赛试题→第十二届

news2024/10/7 10:15:25

文章目录

    • 前言
    • 一、题目
    • 二、模块初始化
    • 三、代码实现
      • interrupt.h:
      • interrupt.c:
      • main.h:
      • main.c:
    • 四、完成效果
    • 五、总结

前言

一、题目

请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

二、模块初始化

1.LCD这里不用配置,直接使用提供的资源包就行
2.ADC:开启ADCsingle-ended
3.LED:开启PC8-15,PD2输出模式就行了。
4.定时器:TIM4(按键消抖定时器):PSC:80-1,ARR:10000-1,TIM3(输入捕获定时器):PSC:80,ARR:65535,TIM2(输入捕获定时器):PSC:80,ARR:65535
5.打开串口串行输出输入

三、代码实现

bsp组中共有:
在这里插入图片描述

interrupt.h:

#ifndef __INTERRUPT_H__
#define __INTERRUPT_H__

#include "main.h"
#include "stdbool.h"

struct keys
{
	bool key_sta;
	unsigned char key_judge;
	bool single_flag;
	unsigned int key_time;
	bool long_flag;
};

#endif

interrupt.c:

#include "interrupt.h"
#include "tim.h"

struct keys key[4] = {0, 0, 0, 0, 0};

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef * htim)
{
	if(htim->Instance == TIM4)
	{
		key[0].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
		key[1].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
		key[2].key_sta = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
		key[3].key_sta = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);
		for(unsigned char i = 0; i < 4; i++)
		{
			switch(key[i].key_judge)
			{
				case 0:
				{
					if(key[i].key_sta == 0)
					{
						key[i].key_judge = 1;
						key[i].key_time = 0;
					}
					break;
				}
				case 1:
				{
					if(key[i].key_sta == 0)
					{
						key[i].key_judge = 2;
					}
					else
					{
						key[i].key_judge = 0;
					}
					break;
				}
				case 2:
				{
					if(key[i].key_sta == 1)
					{
						key[i].key_judge = 0;
						if(key[i].key_time < 80)
						{
							key[i].single_flag = 1;
						}
					}
					else
					{
						key[i].key_time++;
						if(key[i].key_time >= 80)
						{
							key[i].long_flag = 1;
						}
					}
					break;
				}
			}
		}
	}
}

/* Captured Values */
uint32_t uwIC2Value1_T2CH2 = 0;
uint32_t uwIC2Value2_T2CH2 = 0;
uint32_t uwHighCapture_T2CH2 = 0;
uint32_t uwLowCapture_T2CH2 = 0;
/* Capture index */
uint16_t uhCaptureIndex_T2CH2 = 0;

/* Frequency Value */
uint32_t uwFrequency_T2CH2 = 0;
double uwDuty_T2CH2 = 0;



/* Captured Values */
uint32_t uwIC2Value1_T3CH2 = 0;
uint32_t uwIC2Value2_T3CH2 = 0;
uint32_t uwHighCapture_T3CH2 = 0;
uint32_t uwLowCapture_T3CH2 = 0;
/* Capture index */
uint16_t uhCaptureIndex_T3CH2 = 0;

/* Frequency Value */
uint32_t uwFrequency_T3CH2 = 0;
double uwDuty_T3CH2 = 0;



/* Captured Values */
uint32_t uwIC1Value1_T3CH1 = 0;
uint32_t uwIC1Value2_T3CH1 = 0;
uint32_t uwHighCapture_T3CH1 = 0;
uint32_t uwLowCapture_T3CH1 = 0;
/* Capture index */
uint16_t uhCaptureIndex_T3CH1 = 0;

/* Frequency Value */
uint32_t uwFrequency_T3CH1 = 0;
double uwDuty_T3CH1 = 0;





void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
	if(htim->Instance == TIM2)
	{
		if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			if(uhCaptureIndex_T2CH2 == 0)
			{
				/* Get the 1st Input Capture value */
				uwIC2Value1_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
				uhCaptureIndex_T2CH2 = 1;
			}
			else if(uhCaptureIndex_T2CH2 == 1)
			{
				/* Get the 2nd Input Capture value */
				uwIC2Value2_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
				/* Capture computation */
				if (uwIC2Value2_T2CH2 > uwIC2Value1_T2CH2)
				{
					uwHighCapture_T2CH2 = (uwIC2Value2_T2CH2 - uwIC2Value1_T2CH2); 
				}
				else if (uwIC2Value2_T2CH2 < uwIC2Value1_T2CH2)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwHighCapture_T2CH2 = ((0xFFFFFFFF - uwIC2Value1_T2CH2) + uwIC2Value2_T2CH2) + 1;
				}
				else
				{
					/* If capture values are equal, we have reached the limit of frequency
						 measures */
					Error_Handler();
				}
				uwIC2Value1_T2CH2 = uwIC2Value2_T2CH2;
				uhCaptureIndex_T2CH2 = 2;
				/* Frequency computation: for this example TIMx (TIM1) is clocked by
					 APB2Clk */      
			}
			else if(uhCaptureIndex_T2CH2 == 2)
			{
				uwIC2Value2_T2CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 
				if (uwIC2Value2_T2CH2 > uwIC2Value1_T2CH2)
				{
					uwLowCapture_T2CH2 = (uwIC2Value2_T2CH2 - uwIC2Value1_T2CH2); 
				}
				else if (uwIC2Value2_T2CH2 < uwIC2Value1_T2CH2)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwLowCapture_T2CH2 = ((0xFFFFFFFF - uwIC2Value1_T2CH2) + uwIC2Value2_T2CH2) + 1;
				}
				uwFrequency_T2CH2 = 1000000 / (uwLowCapture_T2CH2 + uwHighCapture_T2CH2);
				uwDuty_T2CH2 = uwHighCapture_T2CH2 * 100.0 / (uwLowCapture_T2CH2 + uwHighCapture_T2CH2);
				uhCaptureIndex_T2CH2 = 0;
			}
		}
	}
	if(htim->Instance == TIM3)
	{
		if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2)
		{
			if(uhCaptureIndex_T3CH2 == 0)
			{
				/* Get the 1st Input Capture value */
				uwIC2Value1_T3CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_FALLING);
				uhCaptureIndex_T3CH2 = 1;
			}
			else if(uhCaptureIndex_T3CH2 == 1)
			{
				/* Get the 2nd Input Capture value */
				uwIC2Value2_T3CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_2, TIM_INPUTCHANNELPOLARITY_RISING);
				/* Capture computation */
				if (uwIC2Value2_T3CH2 > uwIC2Value1_T3CH2)
				{
					uwHighCapture_T3CH2 = (uwIC2Value2_T3CH2 - uwIC2Value1_T3CH2); 
				}
				else if (uwIC2Value2_T3CH2 < uwIC2Value1_T3CH2)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwHighCapture_T3CH2 = ((0xFFFF - uwIC2Value1_T3CH2) + uwIC2Value2_T3CH2) + 1;
				}
				else
				{
					/* If capture values are equal, we have reached the limit of frequency
						 measures */
					Error_Handler();
				}
				uwIC2Value1_T3CH2 = uwIC2Value2_T3CH2;
				uhCaptureIndex_T3CH2 = 2;
				/* Frequency computation: for this example TIMx (TIM1) is clocked by
					 APB2Clk */      
			}
			else if(uhCaptureIndex_T3CH2 == 2)
			{
				uwIC2Value2_T3CH2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2); 
				if (uwIC2Value2_T3CH2 > uwIC2Value1_T3CH2)
				{
					uwLowCapture_T3CH2 = (uwIC2Value2_T3CH2 - uwIC2Value1_T3CH2); 
				}
				else if (uwIC2Value2_T3CH2 < uwIC2Value1_T3CH2)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwLowCapture_T3CH2 = ((0xFFFF - uwIC2Value1_T3CH2) + uwIC2Value2_T3CH2) + 1;
				}
				uwFrequency_T3CH2 = 1000000 / (uwLowCapture_T3CH2 + uwHighCapture_T3CH2);
				uwDuty_T3CH2 = uwHighCapture_T3CH2 * 100.0 / (uwLowCapture_T3CH2 + uwHighCapture_T3CH2);
				uhCaptureIndex_T3CH2 = 0;
				HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_2);
				HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
			}
		}
		else if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1)
		{
			if(uhCaptureIndex_T3CH1 == 0)
			{
				/* Get the 1st Input Capture value */
				uwIC1Value1_T3CH1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
				uhCaptureIndex_T3CH1 = 1;
			}
			else if(uhCaptureIndex_T3CH1 == 1)
			{
				/* Get the 2nd Input Capture value */
				uwIC1Value2_T3CH1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); 
				__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
				/* Capture computation */
				if (uwIC1Value2_T3CH1 > uwIC1Value1_T3CH1)
				{
					uwHighCapture_T3CH1 = (uwIC1Value2_T3CH1 - uwIC1Value1_T3CH1); 
				}
				else if (uwIC1Value2_T3CH1 < uwIC1Value1_T3CH1)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwHighCapture_T3CH1 = ((0xFFFF - uwIC1Value1_T3CH1) + uwIC1Value2_T3CH1) + 1;
				}
				else
				{
					/* If capture values are equal, we have reached the limit of frequency
						 measures */
					Error_Handler();
				}
				uwIC1Value1_T3CH1 = uwIC1Value2_T3CH1;
				uhCaptureIndex_T3CH1 = 2;
				/* Frequency computation: for this example TIMx (TIM1) is clocked by
					 APB2Clk */      
			}
			else if(uhCaptureIndex_T3CH1 == 2)
			{
				uwIC1Value2_T3CH1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); 
				if (uwIC1Value2_T3CH1 > uwIC1Value1_T3CH1)
				{
					uwLowCapture_T3CH1 = (uwIC1Value2_T3CH1 - uwIC1Value1_T3CH1); 
				}
				else if (uwIC1Value2_T3CH1 < uwIC1Value1_T3CH1)
				{
					/* 0xFFFF is max TIM1_CCRx value */
					uwLowCapture_T3CH1 = ((0xFFFF - uwIC1Value1_T3CH1) + uwIC1Value2_T3CH1) + 1;
				}
				uwFrequency_T3CH1 = 1000000 / (uwLowCapture_T3CH1 + uwHighCapture_T3CH1);
				uwDuty_T3CH1 = uwHighCapture_T3CH1 * 100.0 / (uwLowCapture_T3CH1 + uwHighCapture_T3CH1);
				uhCaptureIndex_T3CH1 = 0;
				HAL_TIM_IC_Stop_IT(&htim3, TIM_CHANNEL_1);
				HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
			}
		}
	}
}

char RxBuffer[30];
unsigned char BufIndex = 0;
unsigned char Rxdat;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef * huart)
{
	if(huart->Instance == USART1)
	{
		RxBuffer[BufIndex++] = Rxdat;
		HAL_UART_Receive_IT(huart, &Rxdat, 1);
	}
}

main.h:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.h
  * @brief          : Header for main.c file.
  *                   This file contains the common defines of the application.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __MAIN_H
#define __MAIN_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "stm32g4xx_hal.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

/* Exported types ------------------------------------------------------------*/
/* USER CODE BEGIN ET */

/* USER CODE END ET */

/* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */

/* USER CODE END EC */

/* Exported macro ------------------------------------------------------------*/
/* USER CODE BEGIN EM */

/* USER CODE END EM */

/* Exported functions prototypes ---------------------------------------------*/
void Error_Handler(void);

/* USER CODE BEGIN EFP */

/* USER CODE END EFP */

/* Private defines -----------------------------------------------------------*/

/* USER CODE BEGIN Private defines */
#define DATA 0
#define PARA 1
#define MODEA 0
#define MODEB 1
#define CHANNELA 0
#define CHANNELB 1
#define LIGHT 0
#define DARK 1
/* USER CODE END Private defines */

#ifdef __cplusplus
}
#endif

#endif /* __MAIN_H */

main.c:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "adc.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "interrupt.h"
#include "stdio.h"
#include "lcd.h"
#include "dadc.h"
#include "ldr.h"
#include "led.h"
#include "math.h"
#include "stdlib.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
extern uint32_t uwFrequency_T2CH2;
extern double uwDuty_T2CH2;
extern uint32_t uwFrequency_T3CH2;
extern double uwDuty_T3CH2;
extern uint32_t uwFrequency_T3CH1;
extern double uwDuty_T3CH1;
char text[30];
extern struct keys key[4];
double a;
double b;
double aTemp[5] = {0};
double bTemp[5] = {0};
unsigned char TrigMode;
unsigned char Duty_should_convert;
unsigned char DisplayMode;
unsigned int Pax = 20;
unsigned int Pbx = 20;
unsigned int Pf = 1000;//a - b > 80
unsigned char LDRType[2]; // 0ÊÇ×îÐÂ
unsigned char LED;
extern char RxBuffer[30];
extern unsigned char BufIndex;
extern unsigned char Rxdat;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void DisposeKey(void);
double Duty2Angle(double Duty, unsigned char channel);
void LCD_Disp(void);
void JudgeLDRTypeChange(void);
void LED_Control(void);
void Rx_Proc(void);
/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC2_Init();
  MX_TIM2_Init();
  MX_TIM3_Init();
  MX_TIM4_Init();
  MX_USART1_UART_Init();
  /* USER CODE BEGIN 2 */
//	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_1);
	HAL_TIM_IC_Start_IT(&htim3, TIM_CHANNEL_2);
	HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_2);
	getDualADC(&hadc2);
	HAL_Delay(2);
	getDualADC(&hadc2);
	LDR_ReadAODO();//´óÓÚ3000Ëã°µ
	if(trao > 3000)
		LDRType[1] = DARK;
	else
		LDRType[1] = LIGHT;
	getDualADC(&hadc2);
	LDR_ReadAODO();//´óÓÚ3000Ëã°µ
	if(trao > 3000)
		LDRType[0] = DARK;
	else
		LDRType[0] = LIGHT;
	HAL_TIM_Base_Start_IT(&htim4);
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	HAL_UART_Receive_IT(&huart1, &Rxdat, 1);
	LED_Disp(0x00);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		getDualADC(&hadc2);
		LDR_ReadAODO();//´óÓÚ3000Ëã°µ
		if(TrigMode == MODEB)
			JudgeLDRTypeChange();
//		sprintf(text, "T2CH2F:%05d D:%.2f%%", uwFrequency_T2CH2, uwDuty_T2CH2);
//		LCD_DisplayStringLine(Line0, text);
//		sprintf(text, "T3CH1F:%05d D:%.2f%%", uwFrequency_T3CH1, uwDuty_T3CH1);
//		LCD_DisplayStringLine(Line1, text);
//		sprintf(text, "T3CH2F:%05d D:%.2f%%", uwFrequency_T3CH2, uwDuty_T3CH2);
//		LCD_DisplayStringLine(Line2, text);
//		sprintf(text, "trao:%04d", trao);
//		LCD_DisplayStringLine(Line3, text);
		if(Duty_should_convert)
		{
			Duty_should_convert = 0;
			aTemp[4] = aTemp[3];
			aTemp[3] = aTemp[2];
			aTemp[2] = aTemp[1];
			aTemp[1] = aTemp[0];
			aTemp[0] = Duty2Angle(uwDuty_T3CH1, CHANNELA);
			bTemp[4] = bTemp[3];
			bTemp[3] = bTemp[2];
			bTemp[2] = bTemp[1];
			bTemp[1] = bTemp[0];
			bTemp[0] = Duty2Angle(uwDuty_T3CH2, CHANNELB);
		}
		if(BufIndex != 0)
		{
			unsigned char Temp = BufIndex;
			HAL_Delay(1);
			if(Temp == BufIndex)
			{
				Rx_Proc();
			}
		}
		DisposeKey();
		LCD_Disp();
		LED_Control();
		LED_Disp(LED);
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage
  */
  HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1);

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV3;
  RCC_OscInitStruct.PLL.PLLN = 20;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/* USER CODE BEGIN 4 */
void DisposeKey(void)
{
	if(key[0].single_flag)
	{
		LCD_Clear(Black);
		DisplayMode = !DisplayMode;
		key[0].single_flag = 0;
	}
	if(key[1].single_flag)
	{
		if(DisplayMode == PARA)
		{
			Pax += 10;
			Pbx += 10;
			if(Pax == 70)
				Pax = 10;
			if(Pbx == 70)
				Pbx = 10;
		}
		key[1].single_flag = 0;
	}
	if(key[2].single_flag)
	{
		if(DisplayMode == PARA)
		{
			Pf += 1000;
			if(Pf == 11000)
				Pf = 1000;
		}
		if(DisplayMode == DATA)
		{
			TrigMode = !TrigMode;
		}
		key[2].single_flag = 0;
	}
	if(key[3].single_flag)
	{
		if(TrigMode == MODEA)
		{
			Duty_should_convert = 1;
		}
		key[3].single_flag = 0;
	}
}

void LCD_Disp(void)
{
	if(DisplayMode == DATA)
	{
		LCD_DisplayStringLine(Line1, "        DATA");
		sprintf(text, "   a:%.1f", aTemp[0]);
		LCD_DisplayStringLine(Line2, text);
		sprintf(text, "   b:%.1f", bTemp[0]);
		LCD_DisplayStringLine(Line3, text);
		sprintf(text, "   f:%dHz     ", uwFrequency_T2CH2);
		LCD_DisplayStringLine(Line4, text);
//		sprintf(text, "aDuty%.2f", uwDuty_T3CH1);
//		LCD_DisplayStringLine(Line5, text);
		sprintf(text, "   ax:%d   ", (unsigned int)(fabs(aTemp[1] - aTemp[0])));
		LCD_DisplayStringLine(Line6, text);
		sprintf(text, "   bx:%d   ", (unsigned int)(fabs(bTemp[1] - bTemp[0])));
		LCD_DisplayStringLine(Line7, text);
		sprintf(text, "   mode:%c", 'A' + TrigMode);
		LCD_DisplayStringLine(Line8, text);
	}
	if(DisplayMode == PARA)
	{
		LCD_DisplayStringLine(Line1, "        PARA");
		sprintf(text, "   Pax:%d ", Pax);
		LCD_DisplayStringLine(Line2, text);
		sprintf(text, "   Pbx:%d ", Pbx);
		LCD_DisplayStringLine(Line3, text);
		sprintf(text, "   Pf:%d    ", Pf);
		LCD_DisplayStringLine(Line4, text);
	}
}

void Rx_Proc(void)
{
	if(BufIndex == 2)
	{
		if(RxBuffer[0] == 'a' && RxBuffer[1] == '?')
		{
			printf("a:%.1f\r\n", aTemp[0]);
		}
		else if(RxBuffer[0] == 'b' && RxBuffer[1] == '?')
		{
			printf("b:%.1f\r\n", bTemp[0]);
		}
		else
			printf("error\r\n");
	}
	else if(BufIndex == 3)
	{
		if(RxBuffer[0] == 'a' && RxBuffer[1] == 'a' && RxBuffer[2] == '?')
		{
			printf("aa:%.1f-%.1f-%.1f-%.1f-%.1f\r\n", aTemp[4], aTemp[3], aTemp[2], aTemp[1], aTemp[0]);
		}
		else if(RxBuffer[0] == 'b' && RxBuffer[1] == 'b' && RxBuffer[2] == '?')
		{
			printf("bb:%.1f-%.1f-%.1f-%.1f-%.1f\r\n", bTemp[4], bTemp[3], bTemp[2], bTemp[1], bTemp[0]);
		}
		else if(RxBuffer[0] == 'q' && RxBuffer[1] == 'a' && RxBuffer[2] == '?')
		{
			double temp[5];
			double _, __;
			temp[0] = aTemp[0];
			temp[1] = aTemp[1];
			temp[2] = aTemp[2];
			temp[3] = aTemp[3];
			temp[4] = aTemp[4];
//			temp[0] = 4;
//			temp[1] = 7;
//			temp[2] = 10;
//			temp[3] = 5;
//			temp[4] = 8;
			for(unsigned char i = 0; i < 5; i++)
			{
				for(unsigned char j = i+1; j < 5; j++)
				{
					if(temp[i] >= temp[j])
					{
						_ = temp[i];
						__ = temp[j];
						temp[i] = __;
						temp[j] = _;
					}
				}
			}
			printf("qa:%.1f-%.1f-%.1f-%.1f-%.1f\r\n", temp[0], temp[1], temp[2], temp[3], temp[4]);
		}
		else if(RxBuffer[0] == 'q' && RxBuffer[1] == 'b' && RxBuffer[2] == '?')
		{
			double temp[5];
			double _, __;
			temp[0] = bTemp[0];
			temp[1] = bTemp[1];
			temp[2] = bTemp[2];
			temp[3] = bTemp[3];
			temp[4] = bTemp[4];
//			temp[0] = 4;
//			temp[1] = 7;
//			temp[2] = 10;
//			temp[3] = 5;
//			temp[4] = 8;
			for(unsigned char i = 0; i < 5; i++)
			{
				for(unsigned char j = i+1; j < 5; j++)
				{
					if(temp[i] >= temp[j])
					{
						_ = temp[i];
						__ = temp[j];
						temp[i] = __;
						temp[j] = _;
					}
				}
			}
			printf("qb:%.1f-%.1f-%.1f-%.1f-%.1f\r\n", temp[0], temp[1], temp[2], temp[3], temp[4]);
		}
		else
			printf("error\r\n");
	}
	else
		printf("error\r\n");
	memset(RxBuffer, 0, 30);
	BufIndex = 0;
}

double Duty2Angle(double Duty, unsigned char channel)
{
	if(channel == CHANNELA)
	{
		if(Duty < 10.0)
		{
			return 0;
		}
		else if(Duty >= 10.0 && Duty <= 90.0) //(10, 0),(90, 180) k = (180.0 / 80.0) y1 = k * x1 + b ->b = y1 - k * x1 = 0 - (180.0 / 80.0) * 10 = -180.0 / 8.0
		{
			return ((180.0 / 80.0) * Duty - 180.0 / 8.0);
		}
		else if(Duty > 90.0)
		{
			return 180.0;
		}
		else
			return (-1);
	}
	else if(channel == CHANNELB)
	{
		if(Duty < 10.0)
		{
			return 0;
		}
		else if(Duty >= 10.0 && Duty <= 90.0) //(10, 0),(90, 90) k = (90.0 / 80.0) b = - 90.0 / 8.0
		{
			return ((90.0 / 80.0) * Duty - 90.0 / 8.0);
		}
		else if(Duty > 90.0)
		{
			return 90.0;
		}
		else
			return (-1);
	}
	else
		return (-1);
}

void JudgeLDRTypeChange(void)
{
	if(trao > 3000)
	{
		LDRType[1] = LDRType[0];
		LDRType[0] = DARK;
		if(LDRType[1] == LIGHT)
			Duty_should_convert = 1;
	}
	else
	{
		LDRType[1] = LDRType[0];
		LDRType[0] = LIGHT;
	}
}

void LED_Control(void)
{
	if((unsigned int)(fabs(aTemp[0] - aTemp[1])) > Pax)
	{
		LED = LED & 0xfe | 0x01;
	}
	else
	{
		LED = LED & 0xfe;
	}
	if((unsigned int)(fabs(bTemp[0] - bTemp[1])) > Pbx)
	{
		LED = LED & 0xfd | 0x02;
	}
	else
	{
		LED = LED & 0xfd;
	}
	if(uwFrequency_T2CH2 > Pf)
	{
		LED = LED & 0xfb | 0x04;
	}
	else
	{
		LED = LED & 0xfb;
	}
	if(TrigMode == MODEA)
	{
		LED = LED & 0xf7 | 0x08;
	}
	else
	{
		LED = LED & 0xf7;
	}
	if(aTemp[0] - bTemp[0] > 80.0 && aTemp[0] - bTemp[0] < 100.0)
	{
		LED = LED & 0xef | 0x10;
	}
	else
	{
		LED = LED & 0xef;
	}
}

int fputc(int ch, FILE *f)
{
	HAL_UART_Transmit(&huart1, (unsigned char *)&ch, 1, HAL_MAX_DELAY);
	return ch;
}
/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

四、完成效果

蓝桥杯嵌入式第十二届国赛试题实现效果

五、总结

本篇文章只是为了存放我的代码,所以看不懂很正常,如果需要代码可以找我私信。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552201.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL高级(InnoDB引擎)

&#xff08;一&#xff09;逻辑存储结构 表空间&#xff08;ibd文件&#xff09;&#xff0c;会生成ibd文件&#xff0c;一个mysql实例可以对应多个表空间&#xff0c;用于存储记录、索引等数据。 段&#xff0c;分为数据段&#xff08;Leaf node segment&#xff09;、索引段…

学弟研一,有几篇SCI论文,做过前端,读博 or 走开发进国企?

同学你好&#xff0c;在正面先抛开选择就业的方面的问题&#xff0c;其实我觉得生活种的很多选择&#xff0c;都可以从以下的几点进行斟酌与考虑&#xff1a; &#xff08;1&#xff09;你最擅长的是哪个方面&#xff1f;&#xff08;2&#xff09;你的兴趣爱好是在哪个方面&am…

从0开始搭建完整UVM工程(可直接用于实际的工程中)、含源码(包括makefile文件)、可直接运行,及详细注释

一、说明 网上的实现uvm工程代码都是抄自张强所著的《UVM实战》,都是讲所有文件放到一个文件夹,且不涉及到实际工程中的uvm结构,以及多文件层级结构,让人理解起来较为困难,本文则将会从0开始教大家如何搭建一个具有实际工程效果的UVM框架: 其对应的书中的框架图如下所示:…

chatgpt赋能Python-pythoncontinue

简介 Python是一种高级编程语言&#xff0c;受到越来越多的人们的欢迎。其中&#xff0c;continue是Python语言中的一个很重要的关键字&#xff0c;它的出现可以很好地帮助程序员们实现自己的编程目标。在本文中&#xff0c;我们将介绍continue关键字&#xff0c;并解释它在Py…

Fourier分析入门——第5章——连续函数

目录 第 5 章 连续函数 5.1 引言 5.2 内积和正交性(Inner products and orthogonality) 5.3 对称性(Symmetry) 5.4 复数值函数 第 5 章 连续函数 5.1 引言 在前面的章节中&#xff0c;我们只考虑了在有限区间 L 上定义的离散函数的Fourier级数模型。此类函数在实验科学…

spring 源码

bean的创建 获取类class 推断构造方法 Autoware 创建一个普通对象 依赖注入 populateBean 把一些属性注入 初始化之前 PostConstruct 注解 初始注入 实际可以用构造方法啊 初始化 initializationBean 1.判断是否有aware接口 invokeAwareMethods 2.执行 applyBeanP…

enq: TM - contention等待事件引起的数据库卡顿分析

用户的数据库系统在2022年5月31日下午17:25至17:45出现严重的锁等待&#xff0c;导致对应的应用程序出现卡顿等情况&#xff0c;业务系统的正常使用受到影响&#xff0c;无法正常办理业务&#xff1b;在此情况下需要排查出锁问题的深层原因&#xff0c;从而从根本上解决问题。 …

【Python psycopg2】零基础也能轻松掌握的学习路线与参考资料

Python psycopg2是一个Python库&#xff0c;在Python中提供了一个连接PostgreSQL数据库的接口。它可以让Python应用程序和PostgreSQL数据库之间进行通信和数据传输。学习Python psycopg2的路线和教程可以在查阅资料和实践中快速入门。 一、学习前置知识 学习Python psycopg2需…

23 memset 的调试

前言 同样是一个 很常用的 glibc 库函数 不管是 用户业务代码 还是 很多类库的代码, 基本上都会用到 内存数据的设置 不过 我们这里是从 具体的实现 来看一下 它的实现 主要是使用 汇编 来进行实现的, 因此 理解需要一定的基础 测试用例 就是简单的使用了一下 memcpy,…

去面试测试开发工程师要做哪些准备?大厂真实面试题汇总

目录 1.黑盒测试和白盒测试的区别特点和方法。 2.单元测试、集成测试、系统测试、验收测试、回归测试 3.集成测试和系统测试的区别和应用场景 4.α测试、β测试&#xff0c;以及它们的区别 5.给你一个字符串&#xff0c;你怎么判断是不是ip地址&#xff1f;手写这段代码&…

大数据之RDD的算子分类

文章目录 前言一、RDD的算子分类二、Transformation转换算子三、Action动作算子总结 前言 #博学谷IT学习技术支持# 上一篇文章主要讲述了两种RDD的创建方式&#xff0c;本篇文章接着讲RDD的算子及其分类。 一、RDD的算子分类 RDD的算子主要有两种类型&#xff0c;一种是Tran…

docker面试题:docker容器虚拟化与传统虚拟机比较

容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署。 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。容器化软件在任何环境中都能够始终如一地运行。容器赋予了软件独…

什么是强化学习?强化学习有哪些框架、算法、应用?

什么是强化学习&#xff1f; 强化学习是人工智能领域中的一种学习方式&#xff0c;其核心思想是通过一系列的试错过程&#xff0c;让智能体逐步学习如何在一个复杂的环境中进行最优的决策。这种学习方式的特点在于&#xff0c;智能体需要通过与环境的交互来获取奖励信号&#…

JAVA常用API - 正则表达式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 目录 文章目录 前言 一&#xff0c;正则表达式是什么&#xff1f; 二&#xff0c;正则表达式符号 三&#xff0c;常用正则表达式组合 四&#xff0c;正则表达…

利用MySQL的binlog恢复误删的数据库

1 查看当前数据库内容并备份数据库 查看数据库信息&#xff1a; 备份数据库&#xff1a; [rootlocalhost ~]# mysqldump -u root -p t > /mnt/t.sql Enter password: [rootlocalhost ~]# ll /mnt/t.sql -rw-r--r-- 1 root root 1771 Aug 25 11:56 /mnt/t.sql2 开启bin…

java-----web项目部署到新服务器以及服务器的部署

目录 一、服务器安装jdk1.8 二、安装mysql5.7 2.1下载mysql 2.2修改root账号密码 2.3设置远程登录 三、项目的部署 3.1导入数据库 3.2将项目打成jar包 3.3项目上传 服务器部署项目的方式&#xff0c;本次以打成jar包的形式讲解&#xff08;以springboot项目为例&#xf…

2023年贵工程团体程序设计赛--部分题解

作者&#xff1a;杨书瑶 单位&#xff1a;贵州工程应用技术学院 本次比赛由大学生程序设计协会(cpa)举办,共计17道题&#xff0c;295分。其中5分题三道&#xff0c;10分题三道&#xff0c;15分题两道&#xff0c;20分题三道&#xff0c;25分题两道&#xff0c;30分题两道…

chatgpt赋能Python-pythonbus

PythonBus: 为Python 开发者量身打造的社区 对于所有Python 开发者而言&#xff0c;PythonBus 是一个非常值得加入的社区平台。该平台汇聚了全球最顶尖的Python 开发者&#xff0c;同时也是一站式排除各种问题并交流经验的平台。在PythonBus&#xff0c;无论你是初学者还是专家…

【模电实验】基本放大电路的研究实验

实验四 基本放大电路的研究实验&#xff08;2小时&#xff09; —、实验目的 &#xff08;1&#xff09;充分认识分压式偏置放大电路的电压放大作用&#xff0c;了解其静态工作点的调节、测量&#xff0c;认识截止失真和饱和失真现象&#xff0c;了解消除截止失真和饱和失真…

华为OD机试真题 Java 实现【计算网络信号】【2023Q2 200分】

一、题目描述 网络信号经过传递会逐层衰减&#xff0c;且遇到阻隔物无法直接穿透&#xff0c;在此情况下需要计算某个位置的网络信号值。 注意&#xff1a; 网络信号可以绕过阻隔物array[m][n]的二维数组代表网格地图&#xff0c;array[i][j]0代表i行j列是空旷位置&#xff…