蓝桥杯嵌入式 eeprom初次上电判断

蓝桥杯嵌入式 eeprom初次上电判断,第1张

问题:

比赛往往要求初值确定如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);
	}
}

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/741845.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存