蓝桥杯备赛——第九届国赛(电子秤)


前言

考察的模块有:同一ADC的两路AD采集、长按、串口通信,AD键盘(ADC2_13)、EEPROM(存取小数)、电位器RP5(ADC2_17)


一、相关代码

1.同一ADC的两通道读取问题

Get_ADC2_RP5();
Weight = Get_ADC2_RP5(); / 4095. * 3.3 * 3.03;

若没有添加Get_ADC2_RP5();在前面,则读取出来的值不正确。(为同一ADC另一通道的值)

2.如何使用EEPROM存取小数

读取:

void Para_Read(void)
{
	I2C_24C02_Read(pucStr, 0, 8);
	if(pucStr[0] == 0xaa)
	{
		puiUw[0] = pucStr[2] * 100 + pucStr[1];
		puiUw[1] = pucStr[4] * 100 + pucStr[3];
		puiUw[2] = pucStr[6] * 100 + pucStr[5];
		Setting_Num = pucStr[7];
	}
	else
	{
		puiUw[0] = 100;
		puiUw[1] = 100;
		puiUw[2] = 100;
		Setting_Num = 0;
	}
}

存入:

void S1_Proc(void)
{
	if(!State)
	{
		State = 1;
		Flag_Led = 1;
		
		puiUw_Old[0] = puiUw[0];
		puiUw_Old[1] = puiUw[1];
		puiUw_Old[2] = puiUw[2];
	}
	else
	{
		State = 0;
		Flag_Led = 0;
		
		if((puiUw[0] != puiUw_Old[0]) || (puiUw[1] != puiUw_Old[1]) || (puiUw[2] != puiUw_Old[2]))
		{
			pucStr[0] = 0xaa;
			pucStr[1] = puiUw[0] % 100;
			pucStr[2] = puiUw[0] / 100;
			pucStr[3] = puiUw[1] % 100;
			pucStr[4] = puiUw[1] / 100;
			pucStr[5] = puiUw[2] % 100;
			pucStr[6] = puiUw[2] / 100;
			pucStr[7] = ++Setting_Num;
			
			I2C_24C02_Write(pucStr, 0, 8);
		}
		Flag_Usart1 = 1;
	}
}
  • EEPROM一次只能存入一字节,且只能存入整数。
  • 因此,我们需要将小数转换为整数后分成两个字节来存取。
  • 加入帧头0xaa来防止数据读取时出现错误。

3.如何使用同一个LED灯实现不同频率的闪烁

void Led1_Proc(void)
{
	if((uwTick - uwTick_Led1_Set_Point) <= 800)
		return;
	uwTick_Led1_Set_Point = uwTick;
	
	ucLed ^= 0x01;
}

void Led2_Proc(void)
{
	if((uwTick - uwTick_Led1_Set_Point) <= 400)
		return;
	uwTick_Led1_Set_Point = uwTick;
	
	ucLed ^= 0x01;
}

void Led_Proc(void)
{
	if(!Flag_Led)
		Led1_Proc();
	else
		Led2_Proc();
	
	Led_Disp(ucLed);
}

二、细节问题

  1. 对于浮点数型的变量进行连减(长按时)存在越界的情况。(减为负数,但代码中此操作限制在其大于0时进行)。
  2. 开两路AD时,RP5的电压值不稳定,需对其进行滤波处理。(中位数滤波)
    代码示例:
void ADC_Proc(void)
{
	int temp = 0;
	
	if((uwTick - uwTick_ADC_Set_Point) <= 10)
		return;
	uwTick_ADC_Set_Point = uwTick;
	
	for(int i = 0; i < 11; i++)
	{
		ADC_RP5[i] = Get_ADC2_RP5();
	}
	for(int i = 0; i < 5; i++)
	{
		for(int j = 0; j < 10 - i; j++)
		{
			if(ADC_RP5[j] > ADC_RP5[j + 1])
			{
				temp = ADC_RP5[j + 1];
				ADC_RP5[j + 1] = ADC_RP5[j];
				ADC_RP5[j] = temp;
			}
		}
	}
	Weight =  ADC_RP5[5] / 4095. * 3.3 * 3.03;
}
  1. 若某一按键的操作过于复杂,可单独对其进行函数化处理,这样可以使代码更加整洁易读。

总结

第九届国赛难度一般,有部分问题自己不会处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值