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);
}