详解数据存储芯片AT24C02的应用及编程

详解数据存储芯片AT24C02的应用及编程一 芯片简介 AT24C02 是一个 2K 位串行 CMOSE2PROM 内部含有 256 个 8 位字节 采用先进 CMOS 技术实质上减少了器件的功耗 AT24C02 有一个 8 字节页写缓冲器 该器件通过 IIC 总线接口进行操作 有一个专门的写保护功能 二 芯片参数 1 特点工作电压 1 8V 5 5V 低功耗 CMOS 技术 工作电流 1mA 待机电流 1uA 应用在内部结构 128×8 1K 256×8 2K

一.芯片简介

AT24C02是一个2K位串行CMOS E2PROM,内部含有256个8位字节,采用先进CMOS技术实质上减少了器件的功耗。AT24C02有一个8字节页写缓冲器,该器件通过IIC总线接口进行操作,有一个专门的写保护功能。

二.芯片参数

1.特点
  • 工作电压:1.8V~5.5V;
  • 低功耗CMOS技术,工作电流1mA,待机电流1uA;
  • 应用在内部结构:128×8(1K),256×8(2K),512×8(4K),1024×8(8K),2048×8(16K);
  • 二线串行接口,支持标准IIC通信协议;
  • 双向数据传输协议;
  • 兼容 400KHz传输速率(1.8V,2.5V,2.7V,3.6V);
  • 支持硬件写保护功能;
  • 擦出次数可达10000次;
  • 存储数据时间超过100年;
2.引脚定义

在这里插入图片描述
A0-A2引脚为芯片地址,用于多器件工作模式;SDA、SCL分别为IIC通信的数据线和时钟线;WP为写保护引脚,当该引脚接 GND 时,允许正常的读/写操作。当该引脚接 VCC 时,芯片启动写保护功能;

3.参考电路

在这里插入图片描述
A0-A2接到GND上,地址固定为0;SCL、SDA引脚内部为开漏输出,所以需接上拉电阻;WP引脚接GND,表示芯片可读可写。

三.通信接口

1.芯片读写地址
2.IIC通信

由于51单片机内部无集成IIC控制硬件资源,所以需要软件模拟IIC通信。函数有四个,分别为IIC起始信号、IIC停止信号、IIC读取字节、IIC写入字节等函数。

/*IIC.h*/ //--定义使用的IO口--// sbit I2C_SCL = P2^1; sbit I2C_SDA = P2^0; //--声明全局变量--// void I2C_Delay10us(); void I2C_Start(); //起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿 void I2C_Stop(); //终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿 uchar I2C_SendByte(uchar dat, uchar ack);//使用I2c读取一个字节 uchar I2C_ReadByte(); //通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间,保持发送信号I2C_SDA保持稳定 /*IIC.c*/ //延时:1us void I2C_Delay10us() { uchar a, b; for(b=1; b>0; b--) { for(a=2; a>0; a--); } } // 起始信号:在I2C_SCL时钟信号在高电平期间I2C_SDA信号产生一个下降沿 void I2C_Start() { I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间是I2C_SDA保持时间>4.7us I2C_SDA = 0; I2C_Delay10us();//保持时间是>4us I2C_SCL = 0; I2C_Delay10us(); } //终止信号:在I2C_SCL时钟信号高电平期间I2C_SDA信号产生一个上升沿 void I2C_Stop() { I2C_SDA = 0; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间大于4.7us I2C_SDA = 1; I2C_Delay10us(); } //通过I2C发送一个字节。在I2C_SCL时钟信号高电平期间, 保持发送信号I2C_SDA保持稳定 uchar I2C_SendByte(uchar dat, uchar ack) { uchar a = 0,b = 0;//最大255,一个机器周期为1us,最大延时255us。 for(a=0; a<8; a++)//要发送8位,从最高位开始 { I2C_SDA = dat >> 7; //起始信号之后I2C_SCL=0,所以可以直接改变I2C_SDA信号 dat = dat << 1; I2C_Delay10us(); I2C_SCL = 1; I2C_Delay10us();//建立时间>4.7us I2C_SCL = 0; I2C_Delay10us();//时间大于4us } I2C_SDA = 1; I2C_Delay10us(); I2C_SCL = 1; while(I2C_SDA && (ack == 1))//等待应答,也就是等待从设备把I2C_SDA拉低 { b++; if(b > 200) //如果超过200us没有应答发送失败,或者为非应答,表示接收结束 { I2C_SCL = 0; I2C_Delay10us(); return 0; } } I2C_SCL = 0; I2C_Delay10us(); return 1; } // 使用I2c读取一个字节 uchar I2C_ReadByte() { uchar a = 0,dat = 0; I2C_SDA = 1; //起始和发送一个字节之后I2C_SCL都是0 I2C_Delay10us(); for(a=0; a<8; a++)//接收8个字节 { I2C_SCL = 1; I2C_Delay10us(); dat <<= 1; dat |= I2C_SDA; I2C_Delay10us(); I2C_SCL = 0; I2C_Delay10us(); } return dat; } 

三.控制程序

1.AT24C02写入数据

时序顺序为:发送开始信号,IIC启动->发送器件地址,其中读写标志位为写->发送器件内部存储地址->向器件中写入数据->发送停止信号,IIC停止;

//函数功能 : 往24c02的一个地址写入一个数据 void At24c02Write(unsigned char addr,unsigned char dat) { I2C_Start(); I2C_SendByte(0xa0, 1);//发送写器件地址 I2C_SendByte(addr, 1);//发送要写入内存地址 I2C_SendByte(dat, 0); //发送数据 I2C_Stop(); } 
2.AT24C02读取数据

时序顺序为:发送开始信号,IIC启动->发送器件地址,其中读写标志位为写->发送器件内部->发送开始信号,IIC再次启动->发送器件地址,其中读写标志位为读->从器件读出数据->返回所读取的数据;

// 读取24c02的一个地址的一个数据 unsigned char At24c02Read(unsigned char addr) { unsigned char num; I2C_Start(); I2C_SendByte(0xa0, 1); //发送写器件地址 I2C_SendByte(addr, 1); //发送要读取的地址 I2C_Start(); I2C_SendByte(0xa1, 1); //发送读器件地址 num=I2C_ReadByte(); //读取数据 I2C_Stop(); return num; } 
3.AT24C02读写数据

实现以上的读写功能,就可以使用AT24C02来实现我们需要的功能。功能为:使用按键1,写入num0;按键2,读取num0;按键3,使num0加1;按键4,清零num0;

void main() { unsigned int num0 = 0,num1 = 0,num2 = 0,n; LcdInit(); while(1) { if(K1 == 0) //按键1按下,将num0写入eeprom { Delay10ms(1); if(K1 == 0) {At24c02Write(2,num0); At24c02Write(3,num0);} while((n < 20)&&(K3==0)) { n++; Delay10ms(1); } n=0; n=0; } if(K2 == 0) //按键2按下,读取eeprom数据 { Delay10ms(1); if(K2 == 0) {num1 = At24c02Read(2); num2 = At24c02Read(3); } while((n < 20)&&(K2 == 0)) { n++; Delay10ms(1); } n=0; } if(K3 == 0) //按键3按下,使num0自加1 { Delay10ms(1); if(K3 == 0) num0++; while((n < 50)&&(K3 == 0)) { n++; Delay10ms(1); } n=0; if(num0==256) num0=0; } if(K4 == 0) //按键4按下,清零 { Delay10ms(1); if(K4 == 0) num0 = 0; while((n < 50) && (K4 == 0)) { n++; Delay10ms(1); } n=0; } LCD_Display(); } } 

如需AT24C02相关资料及例程, 请关注公众号,首页回复AT24C02获取资料
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/202460.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午7:05
下一篇 2026年3月20日 上午7:05


相关推荐

  • java break continue用法_list和set的区别

    java break continue用法_list和set的区别1break用于完全结束一个循环,跳出循环体,执行循环后面的语句。2continue是跳过当次循环中剩下的语句,执行下一次循环。但其实这两句话看不出什么明显的意思,还是要通过写循环才能明白。先自己运算答案,然后分别对照正确答案。(一)执行continueMethod1(),结果应当是分析如下:i=0开始,i=7结束。(1)当i=0,接着条件判断false,执行“i=i+1”代码后,i=1,所以最后控制台输出1.第一轮循环结束(2)然后因为是for循环.

    2025年11月9日
    3
  • php面试题目2020_php算法面试题及答案

    php面试题目2020_php算法面试题及答案2019最新整理PHP面试题附答案1、什么事面向对象?主要特征是什么?面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。2、SESSION与COOKIE的区别是什么,请从协议,产生的原因与作用说明?A、http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。B、SESSION存储在服…

    2022年8月26日
    10
  • 通过siger获取系统信息

    通过siger获取系统信息一 简单介绍 Sigar SystemInform 是一个开源的工具 提供了跨平台的系统信息收集的 API 核心由 C 语言实现的 可以被以下语音调用 C C Java sigar jarauto loadsthenati Perl requiresbind p

    2026年3月20日
    2
  • 什么是正则化_lo正则化求解方式

    什么是正则化_lo正则化求解方式COUTCutout[1]是一种新的正则化方法。原理是在训练时随机把图片的一部分减掉,这样能提高模型的鲁棒性。它的来源是计算机视觉任务中经常遇到的物体遮挡问题。通过cutout生成一些类似被遮挡的物体,不仅可以让模型在遇到遮挡问题时表现更好,还能让模型在做决定时更多地考虑环境(context)。Theimplementationofcout1.自己码importtorchimpo…

    2025年12月7日
    6
  • Python基本数据类型有哪些

    Python基本数据类型有哪些1.基本数据类型1.数字类型:整型(int),浮点型(float),复数类型(complex)2.字符串类型:str3.逻辑类型:boolTrueFalse4.列表类型:list[]有序可修改5.元组类型:tuple()有序不可修改6.集合类型:set{}无序不重复7.字典类型:dict{key:value}无序2.整形中的四种进制…

    2022年5月24日
    49
  • 2022最新前端vue面试题

    2022最新前端vue面试题一 自我介绍 我是谁来自哪里 今天来的目的 面试的岗位是什么 几年的工作经验 掌握的技术栈有哪些 开发过什么项目 项目中负责的板块是什么 面试官您好 我叫 XXX 来自 XXX 很荣幸能来我们公司面试 我从事前端开发有 3 年了 目前掌握的技术有 html css js ajax vue 小程序 参与过各种类型的项目 我做过的项目有 A B C D E 那么最近做的一个项目是 XXX 在这个项目中我主要负责的板块是 XXX 面试官您这边还有什么想要了解的么 二 项目功能提问 vue 后台项目 这几个功能点要求

    2026年3月20日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号