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

问题:

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

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值