我是靠谱客的博主 开放绿草,最近开发中收集的这篇文章主要介绍突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题
一、题干
二、题目解析
配置任务:
1.ADC:测量R37电压
2.LED:配置锁存器
3.按键3个
变量声明
uint8_t str[21];
__IO uint32_t uwTick_KEY_Speed;
__IO uint32_t uwTick_LCD_Speed;
__IO uint32_t uwTick_Check_Speed;
uint8_t key_value;
uint8_t key_old;
uint8_t key_down;
uint8_t key_up;
uint8_t LCD_flag; //0:data 1:Para
float Dis_Vmin = 1;
float Dis_Vmax = 3;
float Vmin = 1;
float Vmax = 3;
float Volt;
uint8_t Stop_flag;
uint8_t Start_flag;
int time;
uint16_t T=0;
uint8_t Time_flag;
LED
void LED_Disp(uint8_t ucled)
{
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11|
GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC,ucled<<8,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
ADC
uint16_t get_r37_value()
{
static uint16_t value;
HAL_ADC_Start(&hadc2);
HAL_ADCEx_Calibration_GetValue(&hadc2,3);
HAL_ADC_PollForConversion(&hadc2,3);
value = HAL_ADC_GetValue(&hadc2);
HAL_ADC_Stop(&hadc2);
return value;
}
KEY
uint8_t Key_Scan()
{
static uint8_t value;
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0) == GPIO_PIN_RESET) value = 1;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET) value = 2;
else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2) == GPIO_PIN_RESET) value = 3;
else value = 0;
return value;
}
void Key_Proc()
{
if(uwTick - uwTick_KEY_Speed < 100) return;
else uwTick_KEY_Speed = uwTick;
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:
LCD_flag^=1;
if(LCD_flag == 0)
{
if(Dis_Vmax - Dis_Vmin >= 1 )
{
Vmax = Dis_Vmax;
Vmin = Dis_Vmin;
}
LED_Disp(0X00);
}
break;
case 2:
if(LCD_flag == 1)
{
Dis_Vmax += 0.1;
if(Dis_Vmax > 3.3)
{
Dis_Vmax = 0;
}
}
break;
case 3:
if(LCD_flag == 1)
{
Dis_Vmin += 0.1;
if(Dis_Vmin > 3.3)
{
Dis_Vmin = 0;
}
}
break;
}
}
LCD
void Data_Display()
{
T = time/10;
sprintf((char *)str," Data ");
LCD_DisplayStringLine(Line0,str);
sprintf((char *)str," V:%.2lfV ",(get_r37_value()*3.3)/4096);
LCD_DisplayStringLine(Line2,str);
sprintf((char *)str," T:%ds ",T);
LCD_DisplayStringLine(Line3,str);
}
void Para_Display()
{
sprintf((char *)str," Para ");
LCD_DisplayStringLine(Line0,str);
sprintf((char *)str," Vmax:%.1lfV ",Dis_Vmax);
LCD_DisplayStringLine(Line2,str);
sprintf((char *)str," Vmin:%.1lfV ",Dis_Vmin);
LCD_DisplayStringLine(Line3,str);
}
void LCD_Proc()
{
if(uwTick - uwTick_LCD_Speed < 100) return;
else uwTick_LCD_Speed = uwTick;
if(LCD_flag == 0)
{
Data_Display();
}
else if(LCD_flag == 1)
{
Para_Display();
}
}
检查函数
void Check_Proc()
{
if(uwTick - uwTick_Check_Speed < 100) return;
else uwTick_Check_Speed = uwTick;
Volt = (get_r37_value()*3.3)/4096;
if(Volt < Vmin)
{
Start_flag =1;
}
if(Start_flag == 1)
{
if(Volt*10 > Vmin*10)
{
Time_flag = 1;
Start_flag = 0;
time = 0;
}
}
if(Time_flag == 1)
{
time++;
LED_Disp(0x01);
}
if(Volt*10 > Vmax*10 )
{
Time_flag = 0;
LED_Disp(0x00);
}
if(LCD_flag == 1)
{
if(Dis_Vmax - Dis_Vmin < 1 )
{
LED_Disp(0x02);
}
}
}
注:笔者忘了加滤波部分且在进入参数页面时候,也会进行电压观察。
最后
以上就是开放绿草为你收集整理的突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题的全部内容,希望文章能够帮你解决突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题突击蓝桥杯嵌入式(十)——巩固训练,第十一届省赛第一场真题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复