EEPROM-AT24C02存储器芯片数据读写

news2024/9/27 17:31:13

一、前言

1.1 功能介绍

在嵌入式系统设计中,数据的存储与读取是至关重要的一环。随着技术的不断发展,对存储设备的性能、容量和可靠性要求也越来越高。EEPROM(电可擦除可编程只读存储器)作为一种非易失性存储介质,以其数据存储可靠、功耗低、读取速度快等特点,广泛应用于各种嵌入式系统中。本项目在利用STC90C51单片机和EEPROM-AT24C02存储器芯片实现高效的数据读写存储功能,以满足现代嵌入式系统对数据存储的需求。

本项目的主要目标是通过STC90C51单片机与EEPROM-AT24C02存储器芯片的配合使用,实现以下功能:

  1. 数据写入:通过STC90C51单片机向EEPROM-AT24C02存储器芯片中写入数据,实现数据的非易失性存储。EEPROM-AT24C02存储容量为2Kbit(即256字节),足够满足大多数嵌入式系统对数据存储的需求。
  2. 数据读取:STC90C51单片机能够从EEPROM-AT24C02存储器芯片中读取已存储的数据,并在需要时进行处理或使用。由于EEPROM-AT24C02的读取速度快,能够保证数据访问的高效性。

image-20240612114433567

image-20240612114445518

1.2 AT24C02介绍

AT24C02是一款串行EEPROM(电可擦除可编程只读存储器)芯片,由CATALYST公司(或Atmel公司,因品牌收购关系)生产,广泛应用于各种电子设备中,特别是那些需要数据存储和参数保存的场景。

以下是关于AT24C02的详细介绍:

主要技术参数

  1. 存储容量:2Kbit(256个8位字节),适合存储少量但重要的数据。
  2. 工作电压范围:1.8V至5.5V,宽电压范围使得AT24C02能够适应不同的电源供电情况。
  3. 通信接口:I2C串行总线接口,通过两根总线(串行数据线SDA和串行时钟线SCL)与微处理器或其他设备进行通信。
  4. 存储速率:可达400KHz,提供较快的数据传输速度。
  5. 可擦写次数:高达100万次,确保长期使用的可靠性。
  6. 存储器保持时间:至少10年,保证数据长时间存储的稳定性。
  7. 工作温度范围:虽然不同资料给出的温度范围略有差异,但一般可认为是-40℃至+85℃或-55℃至+125℃,适应各种工作环境。

主要特点

  1. 低功耗:采用先进的CMOS技术,功耗极低,适用于电池供电等低功耗应用场景。
  2. 高可靠性:内部具有校验和功能,可以检测和纠正数据传输中的错误,提高数据传输的可靠性。
  3. 多种封装形式:提供DIP、SOP、TSSOP等多种封装形式,方便用户根据实际需求选择。
  4. 易于使用:通过I2C总线接口与微处理器进行通信,简化了与主机的连接和数据传输过程。

应用领域

AT24C02广泛应用于各种需要数据存储和参数保存的领域:

  1. 工业控制:用于存储和读取PLC程序、传感器数据等。
  2. 仪器仪表:用于存储电子秤、温度计、压力计等设备的校准参数。
  3. 网络通信:用于存储MAC地址、序列号等数据。
  4. 汽车电子:用于存储汽车门锁控制、气囊控制等信息。

二、代码实现

2.1 main.c

#include <reg51.h>
#include "delay.h"
#include "key.h"
#include "type.h"
#include "led.h"
#include "uart.h"
#include "timer.h"
#include "exti.h"
#include "infrared.h"
#include "ds18b20.h"
#include "at24c02.h"
//u8 at24c02_w[8]="1234567";
//u8 at24c02_r[8];
int main()
{
    u8 dat;
    UART_Init();        //初始化串口波特率为4800
    while(1)
    {
//单个字节读写测试
        AT24C02_WriteOneByte(5,0xAA);
        dat=AT24C02_ReadOneByte(5);
        printf("dat=%d\r\n",(int)dat);
        //多个字节读写测试
//        AT24C02_WriteByte(0,8,at24c02_w);
//        AT24C02_ReadByte(0,8,at24c02_r);
//        printf("at24c02_r=%s\r\n",at24c02_r);
          DelayMs(1000);
    }
}


2.2 AT24C02.c

#include "at24c02.h"
#include "iic.h"

/*
函数功能: 写一个字节
函数参数:
	u8 addr 数据的位置(0~255)
	u8 dat 数据范围(0~255)
*/
void AT24C02_WriteOneByte(u16 addr,u8 dat)
{
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_WRITE_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    IIC_SendOneByte(addr); //数据存放的地址
    IIC_GetAck();//获取应答
    IIC_SendOneByte(dat); //发送将要存放的数据
    IIC_GetAck();//获取应答
    IIC_SendStop(); //停止信号
    DelayMs(10); //等待写
}

/*
函数功能: 读一个字节
函数参数:
	u8 addr 数据的位置(0~255)
返回值: 读到的数据
*/
u8 AT24C02_ReadOneByte(u16 addr)
{
    u8 dat=0;
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_WRITE_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    IIC_SendOneByte(addr); //将要读取数据的地址
    IIC_GetAck();//获取应答
    
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_READ_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    dat=IIC_RecvOneByte();//读取数据
    IIC_SendAck(1); //发送非应答
    IIC_SendStop(); //停止信号
    return dat;
}

/*
函数功能: 从指定位置读取指定长度的数据
函数参数:
	u16 addr 数据的位置(0~255)
	u16 len 读取的长度
	u8 *buffer 存放读取的数据
返回值: 读到的数据
*/
void AT24C02_ReadByte(u16 addr,u16 len,u8 *buffer)
{
    u16 i=0;
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_WRITE_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    IIC_SendOneByte(addr); //将要读取数据的地址
    IIC_GetAck();//获取应答
    
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_READ_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    for(i=0;i<len;i++)
    {
        buffer[i]=IIC_RecvOneByte();//读取数据
        if(i<len-1)IIC_SendAck(0); //发送应答
        else IIC_SendAck(1); //发送非应答
    }
    IIC_SendStop(); //停止信号
}

/*
函数功能: AT24C02页写函数
函数参数:
	u16 addr 写入的位置(0~1023)
	u8 len 写入的长度(每页16字节)
	u8 *buffer 存放读取的数据
*/
void AT24C02_PageWrite(u16 addr,u16 len,u8 *buffer)
{
    u16 i=0;
    IIC_SendStart();//起始信号
    IIC_SendOneByte(AT24C02_WRITE_ADDR);//发送设备地址
    IIC_GetAck();//获取应答
    IIC_SendOneByte(addr); //数据存放的地址
    IIC_GetAck();//获取应答
    for(i=0;i<len;i++)
    {
        IIC_SendOneByte(buffer[i]); //发送将要存放的数据
        IIC_GetAck();//获取应答	
    }
    IIC_SendStop(); //停止信号
    DelayMs(10); //等待写
}


/*
函数功能: 从指定位置写入指定长度的数据
函数参数:
	u16 addr 数据的位置(0~255)
	u16 len 写入的长度
	u8 *buffer 存放即将写入的数据
返回值: 读到的数据
*/
void AT24C02_WriteByte(u16 addr,u16 len,u8 *buffer)
{
    u8 page_byte=8-addr%8; //得到当前页剩余的字节数量
    if(page_byte>len) //判断当前页剩余的字节空间是否够写
    {
        page_byte=len; //表示一次性可以写完
    }
    while(1)
    {
        AT24C02_PageWrite(addr,page_byte,buffer); //写一页
        if(page_byte==len)break; //写完了
        buffer+=page_byte; //指针偏移
        addr+=page_byte;//地址偏移
        len-=page_byte;//得到剩余没有写完的长度
        if(len>8)page_byte=8;
        else page_byte=len; //一次可以写完
    }
}

2.3 AT24C02.h

#ifndef _AT24C02_H_
#define _AT24C02_H_
#include <reg51.h>
#include "delay.h"
#include "type.h"
//地址
#define AT24C02_WRITE_ADDR 0xA0
#define AT24C02_READ_ADDR 0xA1
//函数声明
void AT24C02_WriteOneByte(u16 addr,u8 dat);
u8 AT24C02_ReadOneByte(u16 addr);
void AT24C02_WriteByte(u16 addr,u16 len,u8 *buffer);
void AT24C02_PageWrite(u16 addr,u16 len,u8 *buffer);
void AT24C02_ReadByte(u16 addr,u16 len,u8 *buffer);
#endif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1909607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISO 20000认证:驱动企业IT服务管理变革的利器

在信息技术驱动商业发展的今天&#xff0c;企业对高效、可靠和安全的IT服务需求日益增长。ISO 20000作为国际公认的IT服务管理标准&#xff0c;能够帮助企业在竞争激烈的市场环境中脱颖而出&#xff0c;实现IT服务管理的全面提升。本文将深入探讨ISO 20000认证如何帮助企业优化…

idea运行旧的项目如何引入jar包

背景: 有一个旧项目,年份不详, 生产环境运行正常, 生产环境jenkins打包正常;部分jar包为私包,已无法下载 现在要对这个项目进行调试修改 从生产环境下载正常的jar包解压找到lib把lib放到项目目录中 然后选者对应的jdk版本: 一个模块一个模块的 把刚才的库加进去 然后试着启…

免费听书TV版

技术文档摘要 标题&#xff1a; 听书软件用户体验与功能概述 摘要&#xff1a; 本文档提供了一款听书软件的用户体验和功能描述。软件以其稳定性、简洁的用户界面和纯净的用户体验受到用户青睐。文档概述了软件的主要特点、操作便利性以及对遥控器操作的支持。 关键词&#…

仪表板展示|DataEase看中国:2023年中国新能源汽车经济运行情况分析

背景介绍 随着政府机构、企业和个人对环保和可持续发展的高度关注&#xff0c;“新能源汽车”在全球范围内成为了一个热门话题。新能源汽车是指使用非传统燃料&#xff08;如电能、氢能等&#xff09;作为动力源的汽车。 在中国市场&#xff0c;新能源汽车产业蓬勃发展&#…

AI数字人直播saas系统源码部署火爆!无人直播系统全攻略

随着直播行业的日益兴盛&#xff0c;各种直播模式和玩法不断涌现。其中&#xff0c;AI数字人直播更是凭借着其在降本增效的独特优势而在众多直播模式中脱颖而出&#xff0c;成为了众多企业已经引进或计划引进的新型技术。而各大数字人源码厂商推出的AI数字人直播saas系统源码部…

uniapp小程序上传文件

需求 小程序需要上传用户相册图片或拍摄的照片到后端服务器 uniapp官方处理小程序文件方法 选择文件方法&#xff1a;uni.chooseMedia uni-app官网uni-app,uniCloud,serverless,uni.chooseVideo(OBJECT),chooseVideo HarmonyOS 兼容性,uni.chooseMedia(OBJECT),uni.saveVid…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十三章 Linux连接档

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

【C++报错已解决】Invalid Use of ‘this’ Pointer

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言 一、问题描述1.1 报错示例1.2 报错分析1.3 解决思路 二、解决方法2.1 方法一&#xff1a;修正‘this’指针使用2…

首席数据官CDO,提升城市数字治理能力

随着数字技术的飞速发展&#xff0c;首席数据官(CDO)的角色越来越受到各城市的重视。 不仅企业和机构&#xff0c;城市本身也是巨大的数据生成者。 它们拥有丰富的政府、社会和经济数据资源&#xff0c;这些数据涵盖了城市治理、公共服服务和产业进展等多个方面。 利用这些数…

pytorch- RNN循环神经网络

目录 1. why RNN2. RNN3. pytorch RNN layer3.1 基本单元3.2 nn.RNN3.2.1 函数说明3.2.2 单层pytorch实现3.2.3 多层pytorch实现 3.3 nn.RNNCell3.3.1 函数说明3.3.2 单层pytorch实现3.3.3 多层pytorch实现 4.完整代码 1. why RNN 以淘宝的评论为例&#xff0c;判断评论是正面…

登录谷歌时系统提示“找不到您的Google账号”,原因通常有5个

时不时有朋友问我&#xff0c;说他明明后了谷歌账号&#xff0c;但是在登录谷歌时&#xff08;有时是自己登录谷歌的网站或者APP&#xff0c;也有的是登录ourplay等加速器、虚拟机等第三方应用&#xff09;&#xff0c;输入了账号后系统却提示说“找不到您的Google账号”&#…

如何在 Odoo 16 中创建名称搜索功能

我们精通 Odoo&#xff0c;了解如何使用关系字段来建立不同模型之间的联系。为了填充这些关系字段&#xff0c;我们经常需要从一整套可用记录中搜索并找到特定值。Odoo 的名称搜索功能简化了此搜索过程&#xff0c;提供了一种根据我们的特定需求自定义搜索的便捷方式。 深入探…

图像识别和目标检测在超市电子秤上的应用

目录 前言深度学习的目标检测图像识别技术视觉秤的优势其他应用场景中的技术应用未来展望 前言 随着科技的不断发展&#xff0c;电子秤在生鲜超市中的应用也在不断升级。传统的电子秤需要打秤人员手动输入秤码&#xff0c;这不仅耗时费力&#xff0c;还需要大量的培训以记住各…

WMS海外仓系统应用:如何改善海外仓的12个核心业务流程

现代化跨境电商的发展依赖海外仓的高效运转&#xff0c;从货物入仓到订单拣货再到最后的货物出库&#xff0c;全部流程都需要海外仓可以顺畅应对。 作为海外仓&#xff0c;则需要借助诸如WMS海外仓系统这样的智能化管理方式&#xff0c;才能适应日益复杂的客户需求。今天我们就…

数据融合工具(4)正方形矩形图幅分幅计算

一、需求背景 对于工程方面需要的局部地区的大比例尺地形图、平面图和中小比例尺挂图和地图集&#xff0c;常使用矩形分幅。 二、矩形分幅 矩形分幅是按平面直接坐标系的横纵坐标线来划分的&#xff0c;图幅的上、下以坐标横轴为界&#xff0c;左、右以坐标纵轴为界。 供各种工…

KIVY ScreenManager 使用案例常见错误总结

# 导入Kivy的App类&#xff0c;它是所有kivy应用的基类 from kivy.app import App # kivy内置了丰富的控件widget 如 按钮button 复选框checkbox 标签label 输入框textinput 滚动容器scrollable container等 from kivy.uix.button import Button # 引入BoxLayout 布局 from ki…

「AI绘画Stable Diffusion 零基础入门 」文生图教程:什么是提示词?万字长文详解提示词的使用,建议收藏!

大家好&#xff0c;我是画画的小强 AI 绘画的一个必不可少的环节就是告诉 AI 描述画面的 Prompt&#xff08;提示词&#xff09;&#xff0c;但是这种很长很乱、穿插着各种奇怪的数字符号、高深莫测的提示词&#xff0c;究竟在说着什么&#xff1f;难道真的是咒语吗&#xff1…

【力扣高频题】042.接雨水问题

上一篇我们通过采用 双指针 的方法解决了 经典 容器盛水 问题 &#xff0c;本文我们接着来学习一道在面试中极大概率会被考到的经典题目&#xff1a;接雨水 问题 。 42. 接雨水 给定 n 个非负整数&#xff0c;表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子…

跨平台桌面应用开发工具:electron的优缺点

跨平台桌面应用开发工具Electron是一个由GitHub开发和维护的开源框架&#xff0c;它允许开发者使用HTML、CSS和JavaScript等Web技术来构建跨平台的桌面应用程序。以下是关于Electron的详细介绍&#xff1a; 一、Electron概述 定义&#xff1a;Electron是一个基于Chromium和Nod…

【《无主之地3》风格角色渲染在Unity URP下的实现_角色渲染(第四篇) 】

文章目录 概要描边问题外秒变分叉解决办法1:测试效果如下:外秒变分叉解决办法2:URP管线下PBR渲染源码关键词解释:完整shader代码如下:URP管线下二次元皮肤渲染源码URP管线下二次元头发渲染源码简要介绍文章的目的、主要内容和读者将获得的知识。 概要 提示:《无主之地3》…