【蓝桥杯嵌入式】记录一次模拟赛(中)

在上一章(【蓝桥杯嵌入式】记录一次模拟赛(上)-优快云博客)中,我们完成了B2、B3按键的第一功能:触发ADC采集。

七、B2按键第二功能:参数标准选项

又是熟悉的循环切换的模式,继续用求模的方法。首先,我们用一个数组来存储这些标准参数(上、下限),那么按键B2第二功能就是在切换数组的当前索引,这样就可以修改对应的参数。数组的类型选择用整型,原因同上一章中讲到的浮点型的精度问题,在整个做题过程中,大多数涉及显示为小数的数据存储、计算时都使用整型,显示格式化、串口信息格式化时才转化为浮点型。

unsigned int standard_goods[4] = {220, 120, 300, 140};   	// 产品标准参数数组:R37上限,R37下限,R38上限,R38下限
unsigned char standard_key = 0;                         	// 产品标准参数数组索引

按照选择的顺序,我们定义数组中元素对应R37上、下限,R38上下限

用变量standard_key作为数组索引,那么B2第二功能就是修改standard_key。

只需要在原来的基础上加上对standard_key求模的部分即可。

// 按键B2的功能实现
void function_B2()
{
  if (lcd_mode == 0)
  {
    // 采集R37电压
    
		unsigned int adc_dat; // ADC采集到的数据
		char line_disp[21]; // 存储LCD行显示内容的数组,每行最多显示20个字符

		// 启动ADC转换
		HAL_ADC_Start(&hadc2);

		// 等待ADC转换完成,超时时间为100毫秒
		if (HAL_ADC_PollForConversion(&hadc2, 100) == HAL_OK)
		{
			// 读取ADC转换后的数据
			adc_dat = HAL_ADC_GetValue(&hadc2);				
			
			// 计算R37电阻的电压值(0-3.3V)
			adc_R37 = (adc_dat / 4095.0) * 330;

			// 格式化R37电压值为字符串,保留两位小数
			sprintf(line_disp, "     R37:%.2fV      ", (float)(adc_R37 / 100.0));

			// 在LCD的第三行显示R37电压值
			LCD_DisplayStringLine(Line3, (unsigned char *)line_disp);

			// 增加总的R37检测量计数
			all_r37++;

			// 停止ADC转换
			HAL_ADC_Stop(&hadc2);
		}
  }
  else if (lcd_mode == 1)
  {
    standard_key = (standard_key + 1) % 4; // 切换标准参数索引
  }
}

八、B3、B4第二功能:修改标准上下限

这里的加减上下限同样也使用加一、求模的方法实现。只是需要注意区分出上下限(用不同的范围)。(索引0、2表示上限,索引1、3表示下限)

加减完的结果应当实时显示在界面上:

    case 1:
      // 标准设置界面
      //                                            "12345678901234567890"
      LCD_DisplayStringLine(Line1, (unsigned char *)"      STANDARD      "); // 第一行显示:标准设置标题
      sprintf(line_disp, "    SR37:%.1f-%.1f    ", (float)(standard_goods[1] / 100.0), (float)(standard_goods[0] / 100.0)); 
      LCD_DisplayStringLine(Line3, (unsigned char *)line_disp); // 第三行显示:R37标准范围
      sprintf(line_disp, "    SR38:%.1f-%.1f    ", (float)(standard_goods[3] / 100.0), (float)(standard_goods[2] / 100.0)); 
      LCD_DisplayStringLine(Line4, (unsigned char *)line_disp); // 第四行显示:R38标准范围
      break;

在lcd_disp()函数中补全标准设置界面的代码,记得将数组元素转为合适的浮点型,才能使用“%.1f”。

B3、B4第二功能部分的代码:

// 按键B3的功能实现
void function_B3()
{
  if (lcd_mode == 0)
  {
    // 采集R38电压
    unsigned int adc_dat;
    char line_disp[21];
    HAL_ADC_Start(&hadc1);
    if (HAL_ADC_PollForConversion(&hadc1, 100) == HAL_OK)
    {
      adc_dat 
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值