实现AT24C02的数据读写操作

发布者:云淡雅致最新更新时间:2016-12-16 来源: eefocus关键字:AT24C02  数据  读写操作 手机看文章 扫描二维码
随时随地手机看文章

/***************************************************************

功能:11:32 2008-6-27

作者:SG

时间:2004-03-15

版本:V1.0

***************************************************************/


#include "INTRINS.H"

#include "reg52.h"


#define  WriteDeviceAddress 0xa0 //写驱动地址指令

#define  ReadDeviceAddress 0xa1  //读驱动地址指令


sbit AT24C02_SCL = 0xa4;

sbit AT24C02_SDA = 0xa5;


/*-------------------------------------------------------------

功能:发起始信号

------------------------------------------------------------*/

void Start_Cond()

{

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 1;

    _nop_();

    AT24C02_SCL = 1;

    _nop_();

    AT24C02_SDA = 0;

    _nop_();

}


/*-------------------------------------------------------------

功能:发停止信号

------------------------------------------------------------*/

void Stop_Cond()

{

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 0;

    _nop_();

    AT24C02_SCL = 1;

    _nop_();

    AT24C02_SDA = 1;

    _nop_();

}


/*-------------------------------------------------------------

功能:发确认信号

------------------------------------------------------------*/

void Ack()

{

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 0;

    AT24C02_SCL = 1;

    _nop_();

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 1;

}


/*-------------------------------------------------------------

功能:发无确认信号

------------------------------------------------------------*/

void NoAck()

{

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 1;

    _nop_();

    AT24C02_SCL = 1;

    _nop_();

    AT24C02_SCL = 0;

    _nop_();

}


/*-------------------------------------------------------------

功能:写一个字节数据

------------------------------------------------------------*/

bit Write8Bit(unsigned char input)

{

    unsigned char i;

    for (i=0;i<8;i++)

    { 

        AT24C02_SCL = 0;

        input <<= 1;

        AT24C02_SDA = CY;

        AT24C02_SCL = 1;

        

    }

    AT24C02_SCL = 0;

    _nop_();

    AT24C02_SDA = 1;

    AT24C02_SCL = 1;

    _nop_();

    CY = AT24C02_SDA;

    return(CY) ;

}


/*-------------------------------------------------------------

功能:读一个字节数据

------------------------------------------------------------*/

unsigned char Read8Bit()

{

    unsigned char temp,rbyte=0;

    for (temp = 8;temp != 0;temp--)

    {

        AT24C02_SCL = 0;

        _nop_();

        rbyte = (rbyte << 1) | AT24C02_SDA;

        AT24C02_SCL = 1;

        _nop_();

    }

    return rbyte;

}


/*-------------------------------------------------------------

功能:从EEPROM中给定一个地址连续读NLEN个字节数据存放在以指针

nContent开头的往下内容。

------------------------------------------------------------*/

bit Read_Flash ( unsigned char *nContent, unsigned char nAddr, unsigned char nLen )

{

    unsigned char Addr;

    Addr = nAddr;

    Start_Cond();                        //写开始信号

    Write8Bit(WriteDeviceAddress);      //写驱动地址

    Write8Bit(Addr);                    //写从EEPROM中读的开始地址

    Start_Cond();                        //写开始信号

    Write8Bit(ReadDeviceAddress);        //写读数据指令

    while(--nLen)

    {

        *nContent=Read8Bit();              //读出内容

        nContent++;                        //指针加1

        Ack();                            //发确认信号

    }                                   

    *nContent=Read8Bit();               //读一字节

    NoAck();                            //没有确认信号

    Stop_Cond();                        //发停止信号

    return(0);                            //返回

}


/*-------------------------------------------------------------

功能:初始化EEPROM子程序内容为FF

------------------------------------------------------------*/

bit Init_Flash ( unsigned int nPage ) //    8 Byte/1Page init 0xFF 

{

    unsigned char nLen;

    unsigned char Addr;

    nLen=8;

    Addr=8 *nPage;

    

    Start_Cond();

    Write8Bit(WriteDeviceAddress);

    Write8Bit(Addr);

    for(;nLen!=0;nLen--)

    {

        if(Write8Bit(0xff)) break;    //if Write8Bit() Return 1 Write Flase

    }

    Stop_Cond();

        return(CY);

}


/*-------------------------------------------------------------

功能:从EEPROM中给定一个地址连续写NLEN个字节数据存放在以指针

nContent开头的往下内容。

------------------------------------------------------------*/

bit Write_Flash ( unsigned char *nContent, unsigned char nAddr,unsigned char nLen)

{

    unsigned char i,temp;

    unsigned char Addr;

    Addr = nAddr;

    Start_Cond();                    //写开始信号

    Write8Bit(WriteDeviceAddress);    //写驱动地址

    Write8Bit(Addr);                //写从EEPROM中写的开始地址 

    for(i = 0;i < nLen;i++)

    {

        if(Addr%8==0)                //每页8字节  //换页

        {

            Stop_Cond();

            _nop_();

            Start_Cond();

            Write8Bit(WriteDeviceAddress);

            Write8Bit(Addr);

        }

        temp = *nContent;

        if(Write8Bit(temp)) break;    //CY

        nContent++;

        Addr++;

    }

    Stop_Cond();                    //发停止信号

    return(CY);

}


/*-------------------------------------------------------------

主程序

功能:实现存储器EEPROM AT24C02的数据读写操作

------------------------------------------------------------*/

void main()

{

    unsigned char dat[16],i;

    

    Read_Flash(dat,0,16);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中  

    Init_Flash(0);            //将AT24C02的第0页初始化为FF

    Read_Flash(dat,0,16);    //读出AT24C02中从地址0开始依次往后16个字节放入dat数组中

    

    for(i = 0;i < 16;i++ )

    {

         dat[i] = i;        //对数组dat初始化为0---F

    }     

    Write_Flash(dat,0,16);    //将dat数组中的数据写入AT24C02中地址从0开始

    Read_Flash(dat,1,16);    //读出AT24C02中从地址1开始依次往后16个字节放入dat数组中

    while(1)

    {

        i = 9;

    }

}


关键字:AT24C02  数据  读写操作 引用地址:实现AT24C02的数据读写操作

上一篇:Keil C51 Data Overlaying
下一篇:数据的加密传输——单片机上实现TEA加密解密算法

推荐阅读最新更新时间:2024-03-16 15:25

单片机EEPROM读写数据流程解析
EEPROM 写数据流程 第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读写方向上选择“写”操作。 第二步,发送数据的存储地址。24C02 一共 256 个字节的存储空间,地址从 0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。 第三步,发送要存储的数据第一个字节、第二个字节??注意在写数据的过程中,EEPROM 每个字节都会回应一个“应答位 0”,来告诉我们写 EEPROM 数据成功,如果没有回应答位,说明写入不成功。 在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加 1,当加到 0xFF 后,再写一个字节,地址会溢
[单片机]
单片机EEPROM<font color='red'>读写</font><font color='red'>数据</font>流程解析
如何改进您的数据质量
企业机构每年因糟糕的数据质量而造成的平均损失达到1290万美元。除了直接影响收入外,从长远来看,质量差的数据还会增加数据生态系统的复杂性,进而导致决策失误。 随着企业越来越多地使用数据分析来帮助推动业务决策,企业日益重视其系统中的数据质量(DQ)。Gartner预测到2022年,70%的企业机构将通过指标来严格追踪数据质量水平并将数据质量提高60%,以此显著降低运营风险和成本。 数据质量直接关系到决策的质量。高质量的数据能够提供更好的客户线索、对客户的更深入了解和更好的客户关系。数据质量是数据和分析(D&A)领导人需要不断提升的竞争优势。 1. 确定数据质量改进将如何影响业务决策 确定业务流程、关键绩效指标(
[工业控制]
如何改进您的<font color='red'>数据</font>质量
全球销售额将仅增长5%至3170亿美元,数据处理是2010年的最大应用
据iSuppli公司,由于全经济和电子市场继续复苏,尽管2011年半导体产业不会再现今年预期中的强劲表现,但将继续增长。 2011年全球半导体销售额将达到3174亿美元,比今年预期的3020亿美元温和增长5.1%。这与今年32.0%的预期增长率无法相比。但是,由于衰退已经结束,今年以后半导体销售额将继续稳步增长。2014年半导体销售额将达到3574亿美元左右,如图2所示。 尽管半导体市场恢复了增长,但由于最近经济衰退的阴影仍然挥之不去,产业信心仍然不足。有几个因素表明衰退的影响仍在,如失业率居高不下、信贷供应紧张和房屋市场复苏乏力。这些因素在抑制消费者支出,而消费支出是美国国内生产总值(GDP)的最大支
[半导体设计/制造]
全球销售额将仅增长5%至3170亿美元,<font color='red'>数据</font>处理是2010年的最大应用
STM32与FPGA通信写数据出错问题解决方法
项目中需要使用STM32和FPGA通信,使用的是地址线和数据线,在FPGA中根据STM32的读写模式A的时序完成写入和读取。之前的PCB设计中只使用了8跟数据线和8根地址线,调试过程中没有发现什么问题,在现在的PCB中使用了8根地址线和16根数据线,数据宽度也改成了16位,刚开始是读取数据不正确,后来发现了问题,STM32在16位数据宽度下有个内外地址映射的问题,只需要把FPGA中的设定的地址乘以2在STM32中访问就可以了,但是在写操作的时候会出现写当前地址的时候把后面的地址写成0的情况,比如说我给FPGA中定义的偏移地址0x01写一个16位数据,按照地址映射,在STM32中我把地址写入0x02,。实际测试发现这个地址上的数据是
[单片机]
KUKA:简单数据和数组的使用V1.24
KRL中数据的保存 •使用KRL以变量工作 使用KRL对进行时,在程序中使用的数据会有相应的类型来处理这些数据,变量就是用来保存这些数据的容器,每个变量都属于一个专门的数据类型,在使用前必须声明数据类型。在KRL中变量有局部变量和全局变量之分。 局部:局部变量可以分为程序文件(.src)中的局部变量或局部数据列表(*.dat)中的局部变量。如果变量是在.src文件中定义的,则该变量仅在程序运行时存在。我们将此称为“运行时间变量”。如果变量是在.dat文件中被定义为局部变量,并且仅在相关程序文件中已知,则其值在关闭程序后保持不变。 全局:如果变量为全局变量,则随时都可以显示。在这种情况下,变量必须
[机器人]
在中国投资进行元数据驱动数据编织设计的三大理由
数据编织是一种新兴的数据管理设计,在中国保持了较高的市场吸引力。 2022年Gartner数据和分析云采用调研显示,尽管受访者对“数据编织”一词的定义不尽相同,但42%的中国用户表示已采用这一技术,另有34%的受访者计划在未来12个月内采用这项技术 。这两个选项的受访者占比都超过了全球水平(见图1)。 图1:中国客户与全球客户的数据编织采用计划 数据分析和人工智能(AI)技术及其在垂直行业用例的爆炸式增长,使企业数据基础设施变得日益复杂和难以维护。经济和地缘政治不确定性导致数据监管环境难以预测,进一步提高了管理难度。如果企业无法实施由主动元数据驱动的数据编织来提升数据和分析(D&A)弹性和敏捷性,D&A系统的维护成本
[工业控制]
在中国投资进行元<font color='red'>数据</font>驱动<font color='red'>数据</font>编织设计的三大理由
一种基于C8051F350的无线同步数据采集方法
  歼击机的操纵性,如杆/舵的操纵力、位移等要符合技术要求,符合飞行员的使用习惯,才能使飞行员安全舒适地驾驶歼击机,在整个飞行中较好地完成飞行任务。歼击机操纵杆/舵操纵力一位移性能评估是歼击机产品质量检测的主要项目之一,它根据歼击机操纵杆/舵操纵力一位移性能指标的要求,检测出其力和位移是否在规定的标准范围内。本系统主要完成对歼击机操纵杆/舵操纵力和位移的同步数据采集,并通过无线的方法将采集到的力、位移数据传输给评估系统,为评估系统提供绘制力一位移曲线所需的准确测量数据。   1 系统整体设计   歼击机操纵杆/舵操纵力一位移性能检测评估系统由采集系统和评估系统两部分构成。采集系统主要包括传感器、信号调理电路、微控制器和无线模块。系
[单片机]
一种基于C8051F350的无线同步<font color='red'>数据</font>采集方法
凌华科技于Computex 2007展出计算机系统应用平台
搭载多核心处理器的高效能工业计算机、触控式平板计算机、工业自动化运动控制与影像控制器、数据采集卡等 模块与平台产品一应俱全 2007年6月8日,北京讯 产业计算机应用平台供货商-凌华科技于Computex 2007台北国际计算机展推出搭载Intel多核心处理器的高效能工业计算机、触控式液晶面板的平板计算机(Panel PC)、涵盖各式工业控制自动化系统所需的运动轴控卡、影像控制卡、数据采集卡等,模块与平台产品一应俱全,充分结合凌华科技在量测与自动化领域的技术优势,积极扩展工业计算机领域的市场优势。 凌华科技为亚洲最大的数据采集卡与PXI模块供货商,同时在工业计算机领域努力投入各种产业标准制定,包括推动新ㄧ代电信架构标准Adv
[焦点新闻]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved