蓝桥杯单片机快速开发笔记——AT24C02 E2PROM

一、原理分析

        此处考点分析:可能会在引用iic驱动文件时需要自己在头文件定义SCL/SDA

sbit sda = P2^1;
sbit scl = P2^0;
  1. 工作原理:24C02是一种电可擦除可编程只读存储器,通过I2C总线与微处理器或控制器通信。它可以通过电子方式对存储的数据进行读取、写入和擦除操作。

  2. 存储结构:24C02内部由若干存储单元组成,每个存储单元可以存储一个字节的数据。数据可以通过I2C总线按地址进行读写操作。

  3. 读写操作:通过I2C总线发送读写指令和地址,可以实现对24C02中存储数据的读取和写入。读取时,将地址发送给24C02,它会返回对应地址的数据;写入时,发送地址和数据给24C02,它会将数据写入指定地址。

二、应用

  1. 参数存储:24C02常用于存储系统参数、校准数据、配置信息等,如嵌入式系统中的设备参数存储。

  2. 日志记录:在一些应用中,24C02可用于记录事件日志、运行状态等信息,方便系统故障排查和数据分析。

  3. ID存储:在一些设备中,24C02可用于存储设备的唯一标识符或ID信息,用于识别设备身份。

  4. 密钥存储:在安全应用中,24C02可用于存储加密密钥、认证信息等敏感数据,保护系统安全。

  5. 参数调整:一些设备中,24C02可用于存储用户设置的参数、调整值,如显示器的亮度、音量等。

三、思维导图

四、示例框架

#include "e2prom.h"
#include "iic.h"

//24C02单字节写入
void Write_24C02(unsigned char addr, unsigned char dat)
{
	I2CStart();           //起始信号
  I2CSendByte(0xa0);    //EEPROM的写设备地址
  I2CWaitAck();         //等待从机应答
  I2CSendByte(addr);    //内存单元地址
  I2CWaitAck();         //等待从机应答
  I2CSendByte(dat);     //内存写入数据
  I2CWaitAck();         //等待从机应答
  I2CStop();            //停止信号
}

//24C02单字节读取
unsigned char Read_24C02(unsigned char addr)
{
	unsigned char tmp;
  //首先,进行一个伪写操作
  I2CStart();              //起始信号
  I2CSendByte(0xa0);       //EEPROM的写设备地址
  I2CWaitAck();            //等待从机应答
  I2CSendByte(addr);       //内存单元地址
  I2CWaitAck();            //等待从机应答
  //然后,开始字节读操作
  I2CStart();              //起始信号
  I2CSendByte(0xa1);       //EEPROM的读设备地址
  I2CWaitAck();            //等待从机应答
  tmp = I2CReceiveByte();  //读取内存中的数据
  I2CSendAck(1);           //产生非应答信号
  I2CStop();               //停止信号
  return tmp;
}

        通过I2C总线与24C02 EEPROM芯片进行通信,实现单字节数据的写入和读取操作。通过发送起始信号、设备地址、内存单元地址和数据,以及等待应答和停止信号,实现了对24C02的数据读写操作。

  1. void Write_24C02(unsigned char addr, unsigned char dat):定义了一个无返回值的函数Write_24C02(),用于向24C02 EEPROM芯片写入单个字节的数据。

  2. I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);I2CWaitAck();I2CSendByte(dat);I2CWaitAck();I2CStop();:通过I2C总线发送起始信号、设备地址、内存单元地址和数据,以及等待从机应答和停止信号,实现向24C02写入数据的操作。

  3. unsigned char Read_24C02(unsigned char addr, unsigned char dat):定义了一个返回无符号字符型数据的函数Read_24C02(),用于从24C02 EEPROM芯片读取单个字节的数据。

  4. unsigned char tmp;:定义了一个无符号字符型变量tmp,用于存储读取的数据。

  5. I2CStart();I2CSendByte(0xa0);I2CWaitAck();I2CSendByte(addr);:发送起始信号、设备地址和内存单元地址,进行伪写操作。

  6. I2CStart();I2CSendByte(0xa1);I2CWaitAck();tmp = I2CReceiveByte();I2CSendAck(1);I2CStop();:发送起始信号、读设备地址,读取内存中的数据,产生非应答信号并停止信号,实现从24C02读取数据的操作。

  7. return tmp;:返回读取的数据。

  • 41
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
AT24C08 E2PROM存储实验例程C51单片机KEIL工程源码文件4个合集: 24C08多花样流水等实验 24C08断电记忆功能的00-99计时器 将按键次数写入AT24C08,再读出并用1602LCD显示 将数据0x0f写入AT24C08再读出送P0口显示 /*****************************************************************/ void write_24c08(uchar address,uchar shuju) //给指定地址中写入数据 { start(); write_byte(0xa0); // 最低位为0写,1读 respons(); write_byte(address); respons(); write_byte(shuju); respons(); stop(); } /*****************************************************************/ uchar read_24c08(uchar address) //从24c08指定地址中读出数据 { uchar date; start(); write_byte(0xa0); respons(); write_byte(address); respons(); start(); write_byte(0xa1); respons(); date=read_byte(); stop(); return date; } /////////////24C02读写驱动程序完///////////////////// /***********************************************************/ void LEDshow() //LED显示函数 { P0=table[sec/10]; shiwei=0; delay1(40); shiwei=1; P0=table[sec%10]; gewei=0; delay1(40); gewei=1; } /***********************************************************/ void main(void) { TMOD=0x01; //定时器工作在方式1 ET0=1; EA=1; init_24c08(); //初始化24C08 sec=read_24c08(2);//读出保存的数据赋于sec TH0=(65536-50000)/256; //对TH0 TL0赋值 TL0=(65536-50000)%256; //使定时器0.05秒中断一次 TR0=1; //开始计时 while(1) { LEDshow(); if(write==1) //判断计时器是否计时一秒 { write=0; //清零 write_24c08(2,sec); //在24c08的地址2中写入数据sec } if(K5==0){ delay1(10); if(K5==0){ sec=0; } } } } /**************************************************************/ void t0(void) interrupt 1 using 0 //定时中断服务函数 { TH0=(65536-50000)/256; //对TH0 TL0赋值 TL0=(65536-50000)%256; //重装计数初值 count++; //每过50ms tcnt加一 if(count==20) //计满20次(1秒)时 { count=0; //重新再计 sec++; write=1; //1秒写一次24C08 if(sec==100) //定时100秒,在从零开始计时 {sec=0;} } }

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

木木不迷茫(˵¯͒¯͒˵)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值