资讯详情

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

文章目录

  • 前言
  • 一、相关代码
    • 1.同一ADC两通道读取问题
    • 2.如何使用EEPROM存取小数
    • 3.如何使用同一个LED灯实现不同频率的闪烁
  • 二、细节
  • 总结


前言

调查模块包括:相同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. 若某一按键的操作过于复杂,可单独对其进行函数化处理,这样可以使代码更加整洁易读。

总结

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

标签: rp5n连接电缆

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台