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

蓝桥杯单片机设计与开发(蓝桥杯单片机设计与开发如何比赛)svg xmlns http www w3 org 2000 svg style display none svg

大家好,我是讯享网,很高兴认识大家。



 <svg xmlns="http://www.w3.org/2000/svg" style="display: none;"> <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path> </svg> <p>BSP_LED_Lock();<br /> LED_DATA_SAVE &#61; LED_data;<br /> }</p> 

讯享网

讯享网

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 &lt;&lt; (LED_num + 7), GPIO_PIN_RESET);
}
else if (state == LED_OFF)
{
HAL_GPIO_WritePin(GPIOC, 0x0001 &lt;&lt; (LED_num + 7), GPIO_PIN_SET);
}
else if (state == LED_TOGGLE)
{
HAL_GPIO_TogglePin(GPIOC, 0x0001 &lt;&lt; (LED_num + 7));
}

 
讯享网
 

/* USER CODE BEGIN Init /
LCD_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();
/
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);

讯享网

#ifndef __INTERRUPTH
#define __INTERRUPTH

#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-&gt;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 &lt;stdio.h&gt;

#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——————————————————–/

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

/ USER CODE BEGIN Init /
LCD_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_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 */
}


讯享网

 

#ifndef __INTERRUPTH
#define __INTERRUPTH

#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-&gt;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);

 

}

讯享网

#ifndef __INTERRUPTH
#define INTERRUPTH

#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-&gt;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);

 

/* USER CODE BEGIN PV /
uint8_t interface_num = 0; // interface number, 0 for first interface, 1 for another

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 &gt; 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 &gt; 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 &gt; 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-&gt;Instance == TIM2) // IC signal from TIM2_CH1 (PA15, controlled by R40)
{
if (htim-&gt;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-&gt;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-&gt;Instance == TIM3) // IC signal from TIM3_CH1 (PB4, controlled by R39)
{
if (htim-&gt;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-&gt;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);
}
}

 

#ifndef __BSP_ADCH
#define __BSP_ADCH

#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 &lt;string.h&gt;

/ 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 */

讯享网

小讯
上一篇 2025-05-14 07:06
下一篇 2025-05-14 23:46

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/139414.html