问题:
比赛往往要求初值确定如k=0.1,运行过程中改变k的值,再次上电k的值保存
若直接
Write_at24c02(0,u8(k*10));
初始化时
k=0.1*Read_at24c02(0);
第一次上电不一定0地址内存中的值为1,所以不可取
解决:
上电时检查特定内存(如0x30)中的内容是否为自己设定的id(如3713).
若是,则不是初次上电,可以读取存入指定内存的值,
若否,则是初次上电,0x30存入3713.
上电时检查id
union My_ID
{
u16 id;
u8 str[4];
}My_id;
void id_check(void)
{
u8 i;
for(i=0;i<4;i++)
{
My_id.str[i]=Read_AT24c02(0x30+i);//多写入几个内存避免id恰巧与内存中的值相同
}
if(My_id.id==3713)
{
k=0.1*Read_AT24c02(0);
}
else
{
My_id.id=3713;
for(i=0;i<4;i++)
{
Write_AT24c02(0x30+i,My_id.str[i]);
Delay_Ms(5);
}
Write_AT24c02(0,1);
Delay_Ms(5);
}
}
解释一下union类似结构体
但又很不一样,其中的变量公用一个内存 ,改变其中一个,则另一个也改变
k改变时写入 at24c02
void eeprom_proc(void)
{
if((u8)(k*10)!=k_eeprom)
{
Write_AT24c02(0,(u8)(k*10));
Delay_Ms(5);
k_eeprom = (u8)(k*10);
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)