当前位置:网站首页 > API设计与开发 > 正文

蓝桥杯单片机设计与开发(蓝桥杯单片机设计与开发如何比赛)



BSP_LED_Lock();
LED_DATA_SAVE = LED_data;
}

 

typedef enum
{
LED_ON = 1,
LED_OFF = 0,
LED_TOGGLE = 2
} LED_State;

void BSP_LED_SigleLED(uint8_t LED_num, LED_State state)
{
BSP_LED_Unlock();

if (state == LED_ON)
{
HAL_GPIO_WritePin(GPIOC, 0x0001 << (LED_num + 7), GPIO_PIN_RESET);
}
else if (state == LED_OFF)
{
HAL_GPIO_WritePin(GPIOC, 0x0001 << (LED_num + 7), GPIO_PIN_SET);
}
else if (state == LED_TOGGLE)
{
HAL_GPIO_TogglePin(GPIOC, 0x0001 << (LED_num + 7));
}

 
 
 

/* USER CODE BEGIN Init */
LCD_Init();
/* USER CODE END Init */

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
/* USER CODE BEGIN 2 */
LCD_Clear(Black);
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_DisplayStringLine(Line1, (unsigned char*)" DATA ");
/* USER CODE END 2 */

 

char text[30];
sprintf(text, “%d %.2f”, i, f);
LCD_DisplayStringLine(Line2, (unsigned char*)text);

 

/ @defgroup TIM_Exported_Functions_Group9 TIM Callbacks functions
* @brief TIM Callbacks functions
* @{
*/
/* Callback in non blocking modes (Interrupt and DMA) */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_PeriodElapsedHalfCpltCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_OC_DelayElapsedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_IC_CaptureHalfCpltCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_PulseFinishedCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_PWM_PulseFinishedHalfCpltCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_TriggerCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_TriggerHalfCpltCallback(TIM_HandleTypeDef *htim);
void HAL_TIM_ErrorCallback(TIM_HandleTypeDef *htim);

 

#include “main.h”

/
* @brief 按键状态结构体
*/
struct keys
{
uint8_t judge_state; // 状态机标志,0: 检测一个低电平;1:确实被按下;2:等待抬起
uint8_t key_state; // 按键是否被按下(信号来自GPIO输入
uint8_t key_isPressed; // 按键被按下标志位
};

extern struct keys key[];

// void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

#endif

 

#include “interrupt.h”

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

/
* @brief TIM定时器定时中断回调函数
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3)
{
key[0].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
key[1].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
key[2].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
key[3].key_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

 
 

/* 部分自动生成代码 -----------------------------------------------------------*/

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include “main.h”
#include “tim.h”
#include “gpio.h”

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>

#include “led.h”
#include “lcd.h”
#include “interrupt.h”
/* USER CODE END Includes */

/* 部分自动生成代码 -----------------------------------------------------------*/

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

/* USER CODE END 1 */

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

/* USER CODE BEGIN Init */
LCD_Init();
/* USER CODE END Init */

/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3);

LCD_Clear(Black);
LCD_SetTextColor(White);
LCD_SetBackColor(Black);
LCD_DisplayStringLine(Line1, (unsigned char*)" DATA ");
/* USER CODE END 2 */

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

 

}
/* USER CODE END 3 */
}

 

#include “main.h”

/
* @brief 按键状态结构体
*/
struct keys
{
uint8_t judge_state; // 状态机标志,0: 检测到一个低电平;1:确实被按下;2:等待抬起
uint8_t key_state; // 按键是否被按下(信号来自GPIO输入)
uint8_t key_isPressed; // 按键短按标志位

uint8_t key_long_flag; // 按键长按标志位
uint32_t key_time; // 按键计时
};

extern struct keys key[];

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

#endif

 

#include “interrupt.h”

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

/
* @brief TIM定时器定时中断回调函数
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3)
{
key[0].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
key[1].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
key[2].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
key[3].key_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

 
 

if (key[i].key_long_flag == 1)
{
sprintf(text, “B%d long down.”, i + 1);
LCD_DisplayStringLine(Line4, (unsigned char*)text);

 

}

 

#include “main.h”

/
* @brief 按键状态结构体
*/
struct keys
{
uint8_t judge_state; // 状态机标志,0: 检测到一个低电平;1:确实被按下;2:等待抬起
uint8_t key_state; // 按键是否被按下(信号来自GPIO输入)
uint8_t key_isPressed; // 按键短按标志位

uint32_t key_double_click_time; // 双击计时器
uint8_t key_double_click_EN; // 双击计时器使能
uint8_t key_double_click_flag; // 双击标志位
};

extern struct keys key[];

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim);

#endif

 

#include “interrupt.h”

struct keys key[4] = {0};

/
* @brief TIM定时器定时中断回调函数
*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM3)
{
key[0].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0);
key[1].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1);
key[2].key_state = HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_2);
key[3].key_state = HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0);

 
 

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM3_Init();
MX_TIM16_Init();
MX_TIM17_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim3); // Key Detect

 

uint8_t PWM_PA6_Duty = 20;

__HAL_TIM_SetCompare(&htim16, TIM_CHANNEL_1, PWM_PA6_Duty);

 

uint8_t PWM_PA6_Duty = 20;
uint8_t PWM_PA7_Duty = 20;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Key_Proc(void);
void Display_Proc(void);
/* USER CODE END PFP */

/* Some Code… */

/* USER CODE BEGIN 4 */
void Key_Proc(void)
{
if (key[0].key_isPressed == 1) // PB1
{
LCD_Clear(Black);
interface_num ++;
if (interface_num > 1)
{
interface_num = 0;
}
key[0].key_isPressed = 0;
}
if (key[1].key_isPressed == 1 && interface_num == 1) // PB2, Display Interface 1
{
LCD_Clear(Black);
PWM_PA6_Duty += 10;
if (PWM_PA6_Duty > 90)
{
PWM_PA6_Duty = 0;
}

 

}
if (key[2].key_isPressed == 1 && interface_num == 1) // PB3, Display Interface 1
{
LCD_Clear(Black);
PWM_PA7_Duty += 10;
if (PWM_PA7_Duty > 90)
{
PWM_PA7_Duty = 0;
}

 

void Display_Proc(void)
{
char text[20];
if (interface_num == 0) // Display Interface 1
{
// LCD_Clear(Black);
sprintf(text, " DATA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
if (interface_num == 1) // Display Interface 2
{
// LCD_Clear(Black);
sprintf(text, " PARA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text, " PA6:%d%% ", PWM_PA6_Duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " PA7:%d%% ", PWM_PA7_Duty);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
}
/* USER CODE END 4 */

 
 
 

/
* @brief 输入捕获中断回调函数
*/
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM2) // IC signal from TIM2_CH1 (PA15, controlled by R40)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
TIM2_CCR2_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
HAL_TIM_IC_Start(htim, TIM_CHANNEL_2); // Restart CH2 IC
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {
TIM2_CCR1_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);
__HAL_TIM_SetCounter(htim, 0); // Can be done by TRGO Reset?
Freq_PA15 = ( / 80) / TIM2_CCR1_val;
Duty_PA15 = (double)TIM2_CCR2_val / (double)TIM2_CCR1_val * 100;
HAL_TIM_IC_Start(htim, TIM_CHANNEL_1); // Restart CH1 IC
}
}
if (htim->Instance == TIM3) // IC signal from TIM3_CH1 (PB4, controlled by R39)
{
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_2) {
TIM3_CCR2_val = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_2);
HAL_TIM_IC_Start(htim, TIM_CHANNEL_2); // Restart CH2 IC
}
if (htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) {

 

}

 

void Display_Proc(void)
{
char text[20];
if (interface_num == 0) // Display Interface 1
{
// LCD_Clear(Black);
sprintf(text, " DATA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text, " Freq1:%dHz ", Freq_PA15);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " Duty1:%.1lf%% ", Duty_PA15);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
sprintf(text, " Freq2:%dHz ", Freq_PB4);
LCD_DisplayStringLine(Line5, (uint8_t *)text);
sprintf(text, " Duty2:%.1lf%% ", Duty_PB4);
LCD_DisplayStringLine(Line6, (uint8_t *)text);
}
if (interface_num == 1) // Display Interface 2
{
// LCD_Clear(Black);
sprintf(text, " PARA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
sprintf(text, " PA6:%d%% ", PWM_PA6_Duty);
LCD_DisplayStringLine(Line3, (uint8_t *)text);
sprintf(text, " PA7:%d%% ", PWM_PA7_Duty);
LCD_DisplayStringLine(Line4, (uint8_t *)text);
}
}

 

#include “main.h”

double BSP_ADC_GetValue(ADC_HandleTypeDef *hadc);

#endif

 

#include “BSP_adc.h”

double BSP_ADC_GetValue(ADC_HandleTypeDef *hadc)
{
uint16_t adc_value;
HAL_ADC_Start(hadc);
adc_value = HAL_ADC_GetValue(hadc);

 

}

 

void BSP_ADC_GetValue(void)
{
HAL_ADC_Start(&hadc2);

// 获取IN13的值
HAL_ADC_PollForConversion(&hadc2, 50);
PA4_adc_value = HAL_ADC_GetValue(&hadc2);

// 获取IN17的值
HAL_ADC_PollForConversion(&hadc2, 50);
PA5_adc_value = HAL_ADC_GetValue(&hadc2);

HAL_ADC_Stop(&hadc2);

PA4_Voltage = (double)PA4_adc_value / 4096 * 3.3;
PA5_Voltage = (double)PA5_adc_value / 4096 * 3.3;
}

 

void EEPROM_WriteByte(uint8_t addr, uint8_t data)
{
I2CStart();
I2CSendByte(0xA0); // slave device address, write command
I2CWaitAck();
I2CSendByte(addr); // byte address
I2CWaitAck();
I2CSendByte(data);
I2CWaitAck();
I2CStop();
}

uint8_t EEPROM_ReadByte(uint8_t addr)
{
uint8_t data_temp;

 

}

 

if (key[3].key_isPressed == 1)
{
LCD_Clear(Black);

 

}

 

/* some code… */

void UART_Send(void)
{
char send_data[20];
sprintf(send_data, “Freq = %d ”, Freq_PA15);
HAL_UART_Transmit(&huart1, (uint8_t *)send_data, strlen(send_data), 50);
}

 

char ReceiveString[22];
uint8_t RxByte;
uint8_t RxIndex;
uint8_t RxDoneFlag;

/
* @brief 串口中断回调函数
*/
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
ReceiveString[RxIndex ++] = RxByte; // RxIndex plus after assignment, first Receive is in main function

BSP_LED_Disp(0x01);
if (RxByte == ‘ ’ || RxIndex == 22)
{
RxDoneFlag = 1;
}

 

#include <string.h>

/* Some code… */

/* USER CODE BEGIN PV */
char car_type[5];
char car_data[5];
char car_time[13];
/* USER CODE END PV */

/* Some code… */

void UART_Receive_Proc(void)
{
if (RxDoneFlag == 1)
{
if (RxIndex == 22)
{
sscanf(ReceiveString, “%4s:%4s:%12s”, car_type, car_data, car_time);
}
else
{
char send_data[20];
sprintf(send_data, “Error ”);
HAL_UART_Transmit(&huart1, (uint8_t *)send_data, strlen(send_data), 50);
}
RxIndex = 0;
memset(ReceiveString, 0, 22);
RxDoneFlag = 0;
}
}

 

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
void Key_Proc(void);
void Display_Proc(void);
/* USER CODE END PFP */

/* Some Code… */

/* USER CODE BEGIN 4 */
void Key_Proc(void)
{
if (key[0].key_isPressed == 1) // PB1
{
LCD_Clear(Black);

 

}
if (key[1].key_isPressed == 1 && interface_num == 1) // PB2, Display Interface 2
{
LCD_Clear(Black);

 

}
if (key[2].key_isPressed == 1 && interface_num == 1) // PB3, Display Interface 2
{
LCD_Clear(Black);

 

void Display_Proc(void)
{
char text[20];
if (interface_num == 0) // Display Interface 1
{
// LCD_Clear(Black);
sprintf(text, " DATA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);
}
if (interface_num == 1) // Display Interface 2
{
// LCD_Clear(Black);
sprintf(text, " PARA ");
LCD_DisplayStringLine(Line1, (uint8_t *)text);

}
}
/* USER CODE END 4 */

到此这篇蓝桥杯单片机设计与开发(蓝桥杯单片机设计与开发如何比赛)的文章就介绍到这了,更多相关内容请继续浏览下面的相关 
推荐文章,希望大家都能在编程的领域有一番成就!
                            

版权声明


相关文章:

  • 51单片机设计100例(51单片机作品)2025-05-03 07:27:06
  • 单片机设计与开发大学组(单片机设计与开发大学组一等奖份量怎么样)2025-05-03 07:27:06
  • 单片机设计实例(单片机设计实例代码)2025-05-03 07:27:06
  • 嵌入式设计与开发和单片机设计与开发(嵌入式设计与开发和单片机设计与开发哪个好)2025-05-03 07:27:06
  • 网页设计与制作代码模板(网页设计制作与代码整体素材)2025-05-03 07:27:06
  • 单片机设计报告怎么写(单片机设计报告怎么写范文)2025-05-03 07:27:06
  • 单片机设计与开发大学组(单片机设计与开发大学组2024)2025-05-03 07:27:06
  • 免费的海报在线(免费海报在线设计生成器)2025-05-03 07:27:06
  • 单片机设计报告目的怎么写(单片机设计报告目的怎么写的)2025-05-03 07:27:06
  • 51单片机设计篮球计时计分器(51单片机设计篮球计时计分器实验报告)2025-05-03 07:27:06
  • 全屏图片