蓝桥杯嵌入式STM32G431——第十三届模拟题及代码

第十三届模拟题及代码

1、第十三届模拟题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、主函数代码

#include "main.h"
#include "rcc.h"
#include "led_key.h"
#include "lcd.h"
#include "adc.h"
#include "tim.h"

//***执行速度控制变量***//
__IO uint32_t uwTick_LED_Speed_Ctrl;
__IO uint32_t uwTick_KEY_Speed_Ctrl;
__IO uint32_t uwTick_LCD_Speed_Ctrl;


//***全局变量区***//
uint8_t ucLED;
uint8_t key_value,key_up,key_down;
static uint8_t key_old;
uint8_t LCD_String_Disp[21];

uint8_t PA7_freq_setting_para = 1; //默认为1-1kzh 范围1-10 --> 1kzh-10khz
uint8_t PA7_duty_setting_para = 20;
_Bool Locked = 0; //默认为0-解锁 1-锁住
uint16_t Autoreload_para; //用于设置PWM频率和占空比的参数
uint16_t Duty_min_para; //占空比下限值参数
uint16_t Duty_max_para; //占空比上限值参数
uint16_t Duty_mid_para; //1V-2V之间的占空比参数

float ADC_Value;
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
void LED_Proc(void);
void KEY_Proc(void);
void LCD_Proc(void);
void PWM_Proc(void);


/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  
  HAL_Init();

  SystemClock_Config();

	LED_KEY_Init();
	
	LCD_Init();
	LCD_Clear(Black);
	LCD_SetBackColor(Black);
	LCD_SetTextColor(White);
	
	ADC2_Init();
	
	TIM17_Init();

  while (1)
  {
		KEY_Proc();
		LCD_Proc();
		LED_Proc();
  }
  
}

//***LED处理子函数
void LED_Proc(void)
{
	if((uwTick - uwTick_LED_Speed_Ctrl)<100) return;
		uwTick_LED_Speed_Ctrl = uwTick; //100ms执行一次
	
	if(Locked) //锁定状态
	{
		ucLED |= 0x01;
	}
	else
	{
		ucLED &= 0x02;
	}
	
	if(ADC_Value > 1)
	{
		ucLED ^= 0x02;
	}
	else
	{
		ucLED &= 0x01;
	}
	
	LED_Disp(ucLED);
}

//***按键处理子函数
void KEY_Proc(void)
{
	if((uwTick - uwTick_KEY_Speed_Ctrl)<50) return;
		uwTick_KEY_Speed_Ctrl = uwTick; //50ms执行一次
	
	//***按键三行代码***//
	key_value = KEY_Scan();
	key_down = key_value & (key_value ^ key_old);
	key_up= ~key_value & (key_value ^ key_old);
	key_old = key_value;
	
	switch(key_down)
	{
		case 1: //B1按键有效 PA7输出信号频率加1khz 上限10K
			//__HAL_TIM_SET_AUTORELOAD(__HANDLE__, __AUTORELOAD__)
		if(!Locked) //解锁状态下
		{
			PA7_freq_setting_para += 1; //默认输出1000hz 1*1000
			if(PA7_freq_setting_para == 11)
				PA7_freq_setting_para = 10;
		}
		break;
		
		case 2: //B1按键有效 PA7输出信号频率减1khz
			if(!Locked) //解锁状态下
			{
				PA7_freq_setting_para -= 1;
				if(PA7_freq_setting_para == 0)
					PA7_freq_setting_para = 1;
			}
		break;
			
		case 3: //切换锁定与解锁状态
			Locked ^= 1;
		break;

	}
}

void PWM_Proc(void)
{
	HAL_TIM_PWM_Stop(&htim17 , TIM_CHANNEL_1);
	Autoreload_para = 1000000/(PA7_freq_setting_para*1000); //对应频率的设置参数
	Duty_min_para = Autoreload_para*40/100; //最低占空比
	Duty_max_para = Autoreload_para*80/100;	//最大占空比
	
	__HAL_TIM_SET_AUTORELOAD(&htim17, Autoreload_para-1); //设置频率
	if(ADC_Value <= 1)
	{
		PA7_duty_setting_para = 40; //小于2V的占空比显示
		__HAL_TIM_SET_COMPARE(&htim17 , TIM_CHANNEL_1 , Duty_min_para); //小于1V的占空比设置
	}
	else if(ADC_Value >= 2)
	{
		PA7_duty_setting_para = 80; //大于2V的占空比显示
		__HAL_TIM_SET_COMPARE(&htim17 , TIM_CHANNEL_1 , Duty_max_para); //大于2V的占空比设置
	}
	else
	{
		Duty_mid_para = (uint16_t)((Duty_max_para - Duty_min_para)*ADC_Value); //1V-2V之间的占空比设置对应参数转换
		PA7_duty_setting_para = (Duty_mid_para*100)/Autoreload_para; //1V-2V之间的占空比显示
		__HAL_TIM_SET_COMPARE(&htim17 , TIM_CHANNEL_1 , Duty_mid_para); //1V-2V之间的占空比设置
	}
	HAL_TIM_PWM_Start(&htim17 , TIM_CHANNEL_1);

}

//***LCD处理子函数
void LCD_Proc(void)
{
	if((uwTick - uwTick_LCD_Speed_Ctrl)<300) return;
		uwTick_LCD_Speed_Ctrl = uwTick;	
	
	ADC_Value = (3.3*Get_ADC2_Value())/4096; //采集ADC电压值
	
	PWM_Proc();

	memset(LCD_String_Disp , 0 ,sizeof(LCD_String_Disp));
	sprintf((char*)LCD_String_Disp , "         DATA  ");
	LCD_DisplayStringLine(Line1 , LCD_String_Disp);	
	
	memset(LCD_String_Disp , 0 ,sizeof(LCD_String_Disp));
	sprintf((char*)LCD_String_Disp , "      Volt:%4.2fV  ",ADC_Value);
	LCD_DisplayStringLine(Line3 , LCD_String_Disp);	
	
	memset(LCD_String_Disp , 0 ,sizeof(LCD_String_Disp));
	sprintf((char*)LCD_String_Disp , "      D:%02d%%  ",PA7_duty_setting_para);
	LCD_DisplayStringLine(Line5 , LCD_String_Disp);	
	
	memset(LCD_String_Disp , 0 ,sizeof(LCD_String_Disp));
	sprintf((char*)LCD_String_Disp , "      F:%04dHz  ",PA7_freq_setting_para*1000);
	LCD_DisplayStringLine(Line7 , LCD_String_Disp);	
	
}


  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lzya.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值