目录
题目
硬件框图
功能描述
题目分析
代码实现
adc模块
LCD与LED模块
按键模块
正文
题目
硬件框图
功能描述
1基本功能
1)测量竞赛板上电位器R37输出的模拟电压信号Via;,并通过液晶屏实时显示数据。
2)通过LED指示灯实现超出上限、低于下限的提醒功能。
3)通过按键实现阈值范围和输出提醒指示灯的设置功能。
2显示功能
1)数据显示界面
数据显示界面包含三个显示要素:界面名称、采集的实时电压数据和状态。
备注:
上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。
电压单位为伏特,数据保留小数点后两位有效数字。
状态(Status):超过上限(Upper)、低于下限(Lower)和正常(Normal)。
2)参数配置界面
参数配置界面包含五个显示要素:界面名称、电压的上限值、电压的下限值、电压超过上限的提醒指示灯、电压低于下限的提醒指示灯。
备注:
上述界面供设计参考,选手可根据试题要求对界面进行设计,界面需包含试题要求的全部显示要素。
电压上、下限值设置范围为0-3.3V,设备应具备错误设置的保护功能。
电压提醒指示灯设置范围为LD1到LD8,设备应禁止将上、下限指示灯设置为同一个指示灯。
3按键功能
1)B1:定义为“设置”按键,按下此按键,切换选择数据显示界面和参数设置界面,按键工作流程如下图所示:
2)B2:定义为“选择”按键,在参数设置界面按下此按键,切换选择参数项(电压的上限值、电压的下限值、电压超过上限的提醒指示灯、低于下限的提醒指示灯),被选择的参数项“高亮”显示。
按键工作流程如下图所示:
3)B3:定义为“加”按键。
进行电压参数设置时,当前选择的电压参数加0.3V。
进行LED提醒指示灯参数设置时,LED指示灯序号加1。
4)B4:定义为“减”按键。
进行电压参数设置时,当前选择的电压参数减0.3V。
进行LED提醒指示灯参数设置时,LED指示灯序号减1。
备注:
B2、B3、B4仅在设置界面下有效。
参数设置功能需保护数据边界,电压参数可设置范围0-3.3V,LED提醒指示灯可设置范围LD1—LD8。
4LED指示灯功能
1)R37输出电压值超过电压上限值时(>V的上限),上限提醒指示灯以0.2秒为间隔闪烁,下限指示灯熄灭。
2)R37输出电压值低于电压下限值时(<V的下限),下限提醒指示灯以0.2秒为间隔闪烁,上限指示灯熄灭。
3)R37输出电压值介于上限和下限电压之间时(V的下限≤≤V的上限),上限、下限提醒指示灯熄灭。
4)竞赛板上除当前用做超出上限、低于下限提醒功能的指示灯外,其它指示灯应处于熄灭状态。
5初始状态说明
1)默认输出提醒指示灯。
超过上限提醒指示灯:LD1
低于下限提醒指示灯:LD2
2)默认电压阈值参数。
电压的上限值:2.4V
电压的下限值:1.2V
题目分析
硬件框图分析
我们通过硬件框图可以看出本题需要哪些基础模块,如本题可看出涉及LCD,LED,按键,模拟电压(也就是模数转换),并因为LCD,LED,按键几乎每年都考,所以显而易见这一年的考试重点在于模拟电压。通过硬件框图知道这些信息后,来我们再来仔细看题。
功能描述分析
最主要的是测量R37输出的模拟信号,也就是模数转换的过程,然后其他的就是老三样,常见的LCD屏显示,设置了电压的上下限阈值,与阈值相关的功能有LCD屏显示与LED灯,然后就是按键控制,按键只要将条件判断语句写好就行了。其中有一个新点,就是屏幕高亮显示。
总体设计思路
先将R37的模拟信号获取,定义全局变量,方便其他.c文件使用。 根据按键功能将按键的逻辑实现好。LCD屏也是如此,注意变量的定义即可,实现好高亮显示。LED就是获取按键相关操作之后,判断电压值是否超过阈值,是则亮。
代码实现
adc模块
double getADC(ADC_HandleTypeDef *pin) { uint adc; HAL_ADC_Start(pin); adc = HAL_ADC_GetValue(pin); return adc*3.3/4096; }
LCD与LED模块
其中包含高亮显示,高亮显示原理也很简单,在要显示高亮的那一行之前,将LCD背景换成你想要的高亮颜色,这里换成了黄色,然后在显示这一行的信息,注意一行没满用空格填充,否则这一行后面部分会没有高亮显示。显示完成后,再将LCD的背景色改为黑色。
void disp_proc() { double V = getADC(&hadc2); if(view==0) { char text[30]; sprintf(text," Main "); LCD_DisplayStringLine(Line2, (uint8_t *)text); sprintf(text," Volt:%.2f",getADC(&hadc2)); LCD_DisplayStringLine(Line4, (uint8_t *)text); if(V > max_v) { sprintf(text," Status:Upper"); LCD_DisplayStringLine(Line5, (uint8_t *)text); } else if(V < min_v) { sprintf(text," Status:Lower"); LCD_DisplayStringLine(Line5, (uint8_t *)text); } else { sprintf(text," Status:Normal"); LCD_DisplayStringLine(Line5, (uint8_t *)text); } } else if(view==1) { char text[30]; //disp_clear(); sprintf(text," Setting "); LCD_DisplayStringLine(Line1, (uint8_t *)text); if(hang == 1) { LCD_SetBackColor(Yellow); sprintf(text," Max Volt:%.2f ",max_v); LCD_DisplayStringLine(Line3, (uint8_t *)text); LCD_SetBackColor(Black); } else { sprintf(text," Max Volt:%.2f ",max_v); LCD_DisplayStringLine(Line3, (uint8_t *)text); } if(hang == 2) { LCD_SetBackColor(Yellow); sprintf(text," Min Volt:%.2f ",min_v); LCD_DisplayStringLine(Line4, (uint8_t *)text); LCD_SetBackColor(Black); } else { sprintf(text," Min Volt:%.2f ",min_v); LCD_DisplayStringLine(Line4, (uint8_t *)text); } if(hang == 3) { LCD_SetBackColor(Yellow); sprintf(text," Upper:LD%d ",up_led); LCD_DisplayStringLine(Line6, (uint8_t *)text); LCD_SetBackColor(Black); } else { sprintf(text," Upper:LD%d ",up_led); LCD_DisplayStringLine(Line6, (uint8_t *)text); } if(hang == 4) { LCD_SetBackColor(Yellow); sprintf(text," Lower:LD%d ",lo_led); LCD_DisplayStringLine(Line7, (uint8_t *)text); LCD_SetBackColor(Black); } else { sprintf(text," Lower:LD%d ",lo_led); LCD_DisplayStringLine(Line7, (uint8_t *)text); } } LED_mie(); if(V < min_v) { TurnOn_LED(lo_led); } else { TurnOff_LED(lo_led); } if(V > max_v) { TurnOn_LED(up_led); } else { TurnOff_LED(up_led); } }
按键模块
void key_proc() { if(key[0].key_flag == 1) { view = !view; LCD_Clear(Black); key[0].key_flag = 0; } if(key[1].key_flag == 1) { if(view == 1) { hang++; if(hang == 5) { hang = 1; } } key[1].key_flag = 0; } if(key[2].key_flag == 1) { if(view == 1) { if(hang == 1 && max_v < 3.3) //不超过3.3 { max_v = max_v + 0.3; } else if(hang == 2 && min_v < 3.3 && min_v < max_v) //不超过3.3,并且不超过max_v { min_v = min_v + 0.3; } else if(hang == 3) { if(up_led+1 == lo_led) up_led++; if(++up_led >= 9) { up_led = 1; } if(up_led == lo_led) up_led++; } else if(hang == 4) { if(up_led == lo_led+1) lo_led++; if(++lo_led >= 9) { lo_led = 1; } if(up_led == lo_led) lo_led++; } } key[2].key_flag = 0; } if(key[3].key_flag == 1) { if(view == 1) { if(hang == 1 && max_v > 0 && max_v > min_v) { max_v = max_v - 0.3; } else if(hang == 2 && min_v > 0) { min_v = min_v - 0.3; } else if(hang == 3) { if(up_led-1 == lo_led) up_led--; if(--up_led <= 0) { up_led = 8; } if(up_led == lo_led) up_led--; } else if(hang == 4) { if(up_led == lo_led-1) lo_led--; if(--lo_led <= 0) { lo_led = 8; } if(up_led == lo_led) lo_led--; } } LED_mie(); key[3].key_flag = 0; } }