文章目录
- 前言
- 一、相关代码
-
- 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);
}
二、细节问题
- 对于浮点数型的变量进行连减(长按时)存在越界的情况。(减为负数,但代码中此操作限制在其大于0时进行)。
- 开两路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;
}
- 若某一按键的操作过于复杂,可单独对其进行函数化处理,这样可以使代码更加整洁易读。
总结
第九届国赛难度一般,有部分问题自己不会处理。