AT24C02---EEPROM 掉电存储(指定地址,指定字节数)


main.c


/************************头文件***********************/
#include<reg52.h>
#include<string.h>
#include <delay.h> 
#include <time0.h>
#include <uart.h>         
#include <IIC.h>        
#include <at24c02-e2prom.h>

#define  uchar  unsigned char
#define  uint unsigned int

#define SLAW    0x44
#define SLAR    0x45

/************************变量声明***********************/
uchar tem[7];//串口发送HEX数据的寄存器,【起始字节-地址字节-温度十位-温度个位-温度点位-校验字节-结束字节】
uchar T_num=20;
uchar Hex_num=0;
uchar UartSend_Fleg=0;
uchar AT24C02_rdata[]={0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x0f,0};
uchar AT24C02_wdata[]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0};
/************************函数声明***********************/
void UartSend(void);            //串口发送一帧数据函数
/**********************主函数***********************/
void main()
{
 uchar i;
 Led=0xff;
 
 init_uart();                     //初始化串口
 init_T0();
 I2C_Init();
 
 AT24C02_read(AT24C02, 0 , &AT24C02_wdata[0], 1);
 Hex_num=AT24C02_wdata[0];               //读取,并保存上次掉电存储在eeprom中的数据
 
 while(1)
 { 
  if(UartSend_Fleg==1)
  {
   UartSend_Fleg=0;
   
   AT24C02_wdata[0]=Hex_num++;            //处理后的数据放入数组---可以使用中间变量,或者不使用
   
   AT24C02_write(AT24C02, 0 , &AT24C02_wdata[0], 1); //处理后的数据放入数组,再次存储在eeprom中

   UartSend();
  }
 }
}

/*******************串口发送一帧数据函数********************/
void UartSend(void)
{
 
 TR1=1;                            //开启定时器T1 
/*******************发送HEX格式*******************/ 
 sendByte(AT24C02_wdata[0]); 
/************************************************/   
 TR1=0;                            //关闭定时器T1 
}

/*******************定时器T0中断程序*****************/
void senddat_T0(void) interrupt 1
{
 TH0=0x4c;            //重载定时器初值
 TL0=0x00;
 
 if(--T_num==0)
 {
  T_num=20;           //恢复计数值
  UartSend_Fleg=1;  
 }
}


at24c02-e2prom.c



/*******************************************************************
功能:     【从机地址sla】【子地址suba】【发送内容,s指向的内容】【发送字节数量】
返回值:   如果返回1表示操作成功,否则操作有误
********************************************************************/
bit AT24C02_write(uchar  sla,uchar  suba,uchar  *s,uchar  no)
{
   uchar i;

   I2C_Start()/*启动总线*/
 
   I2C_Write_Byte(sla);/*发送器件地址*/
   if(I2C_Wait_Ack()!=0)return(0);
 
   I2C_Write_Byte(suba);/*发送器件子地址*/
   if(I2C_Wait_Ack()!=0)return(0);

   for(i=0;i<no;i++)
   {  
     I2C_Write_Byte(*s);/*发送数据*/
   if(I2C_Wait_Ack()!=0)return(0);
  
     s++;
   }
 
   I2C_Stop();/*结束总线*/

   return(1);
}

/*******************************************************************
功能:     【从机地址sla】【子地址suba】【读出的内容放入s指向的存储区】【读字节数量】
返回值:   如果返回1表示操作成功,否则操作有误
********************************************************************/
bit AT24C02_read(uchar  sla,uchar  suba,uchar  *s,uchar  no)
{
   uchar i;

   I2C_Start();/*启动总线*/
 
   I2C_Write_Byte(sla);/*发送器件地址+写*/
   if(I2C_Wait_Ack()!=0)return(0);
 
   I2C_Write_Byte(suba);/*发送器件子地址*/
   if(I2C_Wait_Ack()!=0)return(0);

   I2C_Start();/*重新启动总线*/
 
   I2C_Write_Byte(sla+1);/*发送器件地址+读*/
   if(I2C_Wait_Ack()!=0)return(0);
 
   for(i=0;i<no-1;i++)
   {  
     *s=I2C_Read_Byte();/*发送数据*/
      I2C_Ack();/*发送就答位*/ 
     s++;
   }
 
   *s=I2C_Read_Byte();
   I2C_NAck();/*发送非应位*/
 
   I2C_Stop();/*结束总线*/
 
   return(1);
}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值