单片机读取EEPROM(AT24C02)

发布者:变形金刚最新更新时间:2017-02-06 来源: eefocus关键字:单片机  读取EEPROM  AT24C02 手机看文章 扫描二维码
随时随地手机看文章

      在 arm cortex-m3中 有专门的断电保护寄存器(BKP寄存器) ,在主电源切断或系统产生复位时间时,BKP寄存器仍然可以再备用电源的支持下保持其内容。在实际应用中可以存入重要数据,防止被恶意查看,或用于断电回复。参见 stm32 BKP寄存器操作 。

 

单片机掉电保护通常可采用以下三种方法:

  • 一是加接不间断电源,让整个系统在掉电时继续工作。

  • 二是采用备份电源,掉电后保护系统中全部或部分数据存储单元的内容;

  • 三是采用EEPROM来保存数据。

由于第一种方法体积大、成本高,对单片机系统来说,不宜采用。第二种方法是根据实际需要,掉电时保存一些必要的数据,使系统在电源恢复后,能够继续执行程序。EEPROM既具有ROM掉电不丢失数据的特点,又有RAM随机读写的特点。所以使用EEPROM AT24C02实现掉电保护是最可行的一种方式。

   AT24C02是一种I2C总线结构的芯片。

QQ截图20120518125241.png

 

I2C总线协议如下:

  1. 只有在在总线空闲时才可以启动数据发送。

  2. 在数据传送过程中,当时钟线为高电平时,数据线上必须保持稳定,不允许有跳变;时钟线为高电平时,数据线的任何电平跳变都视为是总线起始或是结束信号。

      起始信号:SCL 线是高电平时,SDA 线从高电平向低电平切换;

  停止信号:SCL 线是高电平时,SDA 线由低电平向高电平切换;

   发送起始信号后,可以以字节为单位发送数据,每个字节必须为8位,高位在前,低位在后。主设备每个字节发送后,必须接收从设备的一个应答信号ACK,即在第9个时钟周期,接收SDA上的低电平。

   主设备发送起始信号后,第一个发送的字节必须是器件地址码,第二个字节为期间单元码,用于实现选择所操作的器件的内部单元。第三个字节开始传送数据。


   器件地址码格式如下:

QQ截图20120518131152.png

 

其中前四位是器件的类型,有固定的定义,EPROM为1010;后三位为片选,同类器件可以接8个;R/W为读写控制,R/W=1为从总线读取信息,R/W=0为从总线写入信息。

 

I2C 读指定单元时序:

 

开始信号 + 器件地址码(R/W = 0 写) + ACK(接收应答信号)+待读取单元地址+ACK+开始信号+器件地址码(R/W = 1 读) + ACK+读取8位数据+停止信号

 

I2C 指定单元写时序:

 

开始信号 + 器件地址码(R/W = 0 写) + ACK(接收应答信号)+待写入单元地址+ACK+写入8位数据 + ACK+停止信号

 

读写时序时间控制:

QQ截图20120518125424.png

 

单片机读取EEPROM(AT24C02)代码:

at24c02.c

       #include 

       #define uchar unsigned  char     // 宏定义uchar 为无符号字符
	#define uint  unsigned  int  
	
	#define ADDRS_R  0xA1	 //读操作地址
	#define ADDRS_W  0xA0	 //写操作地址


	sbit I2C_SCL =  P2^0;
	sbit I2C_SDL =  P2^1;
	
	sbit I2C_ACK_Led = P2^7;	//接收到正确的ACK相应(低电平),则灯不亮(低电平亮)

	void  I2C_Delay(uchar n);
	void  I2C_Start();
	void  I2C_End();
	void  I2C_ACK();
	void  I2C_WriteByte(uchar var);
	uchar I2C_ReadByte();
	uchar I2C_Read(uchar addr);
	void I2C_Write(uchar addr,uchar var);

	void I2C_Delay(uchar n)
	{
		while(--n);				// 2us一次
	}

	void I2C_Start()
	{
		I2C_SCL = 1;
		I2C_Delay(1);
		I2C_SDL = 1;
		I2C_Delay(1);              
		I2C_SDL = 0;
		I2C_Delay(1);


		I2C_SCL = 0;           //每次执行完读写操作后都,拉低SCL ,防止时序混乱
		I2C_Delay(1);

	}

	void I2C_End()
	{
		I2C_SCL = 0;
		I2C_Delay(1);
		I2C_SDL = 0;
		I2C_Delay(1);
		I2C_SCL = 1;
		I2C_Delay(1);	     	 
		I2C_SDL = 1;
		I2C_Delay(1);
	}

	void I2C_ACK()						   //EEPROM  字节写入相应,低电平正确
	{	

		I2C_SCL = 0;
		I2C_Delay(1);
		I2C_SCL = 1;
		I2C_Delay(1);
		while(I2C_SDL == 1){ I2C_ACK_Led = 0; }
		I2C_ACK_Led = 1;
	   	
		I2C_SCL = 0;
		I2C_Delay(1);
		
	}

	void I2C_WriteByte(uchar var)			//单字节写入函数
	{
		uchar i;

		for(i=0;i<8;i++)
		{
			I2C_SCL = 0;
			I2C_Delay(1);
			if(var & 0x80) I2C_SDL = 1; else I2C_SDL = 0;
			I2C_Delay(1);
			I2C_SCL = 1;
			I2C_Delay(1);
			var <<=  1;
		}
		
		I2C_SCL = 0;
		I2C_Delay(1); 	
	}

	uchar I2C_ReadByte()					//单字节读取函数
	{
		uchar var,i;

		for(i=0;i<8;i++)
		{
			var <<= 1;
			I2C_SCL = 0;
			I2C_Delay(1);
			I2C_SCL = 1;
			I2C_Delay(1);
			if(I2C_SDL == 1)  var |= 0x01;
			I2C_Delay(1);
		}

		I2C_SCL = 0;
		I2C_Delay(1);

		return var;
	
	}

	void I2C_Write(uchar addr,uchar var)   //EEPROM 单元写入函数
	{
	   	I2C_Start();

		I2C_WriteByte(ADDRS_W);

		I2C_ACK();

		I2C_WriteByte(addr);

		I2C_ACK();

		I2C_WriteByte(var);

		I2C_ACK();

		I2C_End();

	}

	uchar I2C_Read(uchar addr)	     //EEPROM 单元读取函数
	{
		uchar var;

		I2C_Start();

		I2C_WriteByte(ADDRS_W);

		I2C_ACK();

		I2C_WriteByte(addr);

		I2C_ACK();

		I2C_Start();

		I2C_WriteByte(ADDRS_R);

		I2C_ACK();

		var = I2C_ReadByte();

		I2C_End();

		return var;

	}

在程序中调用读写函数即可,程序调试使用的是11.0592Mhz的晶振。


关键字:单片机  读取EEPROM  AT24C02 引用地址:单片机读取EEPROM(AT24C02)

上一篇:stm32 开发环境MDK+库文件配置
下一篇:arm 学习笔记--C程序基础

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

将基于AT89C2051的解码器应用于安防系统
1 引 言      目前,我国应用极广的编解码器是Princeton公司生产的具有531441(3 12 )种状态的PT2262编码芯片和与之配套的PT2272解码芯片。但一片PT2272只能对一种地址的PT2262的15种状态进行解码,对于较大的编解码保安防盗控制系统,常使用多片PT2272组合解码,但仍远远满足不了大中型安防系统的设计要求。因此,采用AT89C2051单片机,实现了PT2262的大容量解码功能。 2 PT2262的编码原理      PT2262(可参阅http://www.princeton.com.tw)的工作原理如图1所示,图中K0~K7为地址端,应该预置其状态;K8~K11为数据端,按下按钮开
[单片机]
基于单片机与电机PWM控制的水族类喂养自动送氧送料系统
1 引言 现在家庭或餐厅饭店的水族饲养中,一般多为送氧泵一直通氧,这样即浪费电,又浪费氧,送料更是全手工操作,现代鱼类饲养科学表明:一般的水族类更喜欢夜间觅食,另外如果一次放过多的料,使水质变差,科学的饲养方法:多餐少食。 电机在现代社会中起着重要作用。现在90%的驱动来自电机。对运动控制最有用的方式是对运动源的控制,单片机在电机控制的发展中扮演了十分重要的角色。本系统通过单片机与电机的PWM控制,由控制速度达到控制送料量,实现了单片机能够顺利完成定时送氧,定时定量送料。对送料机械装置创新性的设计,即简单又方便,类似于洗衣机中摔水桶,靠电机转动的离心力把料撒出去,但只有半边有孔,这样可以控制撒出去的方向,防止漏料。 2 控制
[单片机]
基于<font color='red'>单片机</font>与电机PWM控制的水族类喂养自动送氧送料系统
徐杰解读兆易创新在RISC-V生态上的建设
兆易创新科技集团股份有限公司生态市场经理徐杰,日前在第三届滴水湖中国RISC-V论坛上推荐了公司第二款RISC-V MCU。 据介绍,兆易创新不仅是中国排名第一的Arm MCU供应商,在RISC-V领域同样引领着业界,曾成功推出了全球首个32位RISC-V通用MCU。 徐杰表示,目前RISC-V生态资源、开发环境方面相对薄弱,因此兆易创新除了产品创新之外,也先后做了很多工作加速RISC-V MCU应用的落地。 从产品角度来看,GD32F103是兆易创新2019年推出的全球首个RISC-V通用MCU,内核采用了芯来RISC-V IP,主频108MHz,同意法半导体的F103/303两个热门MCU的软硬件是完全引脚兼容。经
[单片机]
徐杰解读兆易创新在RISC-V生态上的建设
AVR单片机和GTJ4-10A固态继电器实现实时测量监控系统的设计
随着计算机技术尤其是单片微型机技术的发展,温度对人们的生活与工作影响很大,所以要实时采集温度并且对其进行分析。为此,实现实时准确的测量监控。采用串口传送数据并且在PC机上进行分析。由于单片机的控制方便、简单和灵活等优点,采用了高性能avr单片机来控制GTJ4-10A固态继电器,最总实现温度的控制。从而最总在PC机上绘制温度曲线并保存数据和分析温度的数据。 1 、系统组成及基本原理 本系统由温度采集模块,固态继电器控制模块,单片机模块,PC机软件处理模块。4个模块加起来实现温度的控制,以及温度采集和温度经过软件处理的分析。它们的逻辑关系如图1所示。 本系统的任务是对某种特定环境的温度进行采集并进行保存和再显示,通过单片机去控
[单片机]
AVR<font color='red'>单片机</font>和GTJ4-10A固态继电器实现实时测量监控系统的设计
STC51单片机流水灯+外部中断蜂鸣器
闲暇之余做了一个简单的流水灯,设计思路先将LED灯从0-7逐个显示,然后再从7-0逐个显示。如果产生外部中断(即按钮按下),则8个LED灯全亮,之后又恢复流水灯状态。 #include reg52.h #include intrins.h #define uchar unsigned char #define uint unsigned int sbit K=P3^2;//启动按钮,外部中断 uchar led; void delay(uint x) { while(x--); } void XX()//中断设置 { EA=1; EX0=1; } void DD
[单片机]
单片机有源蜂鸣器驱动之效率编程
蜂鸣器是很常见的设备,分为无源和有源两种。根据项目需求选择不同类型的蜂鸣器。最近的项目里有用到有源蜂鸣器对有源蜂鸣器。还是老一套,把电路板画完,接着编程。 在项目中原理图如下: 如果不能保证I/O的输出性能可以根据情况增加上拉或者下拉电阻。 切入正题:在程序里面这个蜂鸣器的驱动就是个高低电平驱动。高电平三极管导通、蜂鸣器发声,低电平三极管关断、蜂鸣器不发声。这的确很简单,程序上最开始我是这样写的: 当然,如果单片机没有很好的I/O跳变函数也可以这样修改: 这里稍作解释: 1) 函数功能:蜂鸣器发声驱动 传入参数:蜂鸣器发声的次数 2) 传入的次数cnt需要再函数内翻倍。这是因为传入的
[单片机]
<font color='red'>单片机</font>有源蜂鸣器驱动之效率编程
基于51单片机设计的公交车LED屏
一、项目介绍 为了提高公交车站点信息的实时性和准确性,方便乘客及时了解公交车到站信息,从而提高公交出行的便利性和舒适度。传统的公交车到站信息是通过人工喊话或者静态的站牌来实现的,这种方式存在信息不及时、不准确、不方便等问题。当前设计基于STC89C52单片机和MAX7219点阵LED驱动模块的公交车LED屏,通过SYN6288进行语音播报到站信息,可以更加准确地展示到站信息,提高公交出行的效率和便利性。 通过STC89C52单片机控制MAX7219点阵LED驱动模块,将需要显示的信息转化成点阵图像,然后通过MAX7219点阵LED驱动模块控制2*8的LED显示屏显示出来。同时,通过SYN6288语音模块,将到站信息转化成语音播
[单片机]
基于51<font color='red'>单片机</font>设计的公交车LED屏
什么是51单片机?又该如何自学51单片机
51 单片机是目前使用最多的单片机之一,那么什么是 51 单片机呢?作为新手,又该如何自学 51 单片机?为帮助大家更好的学习 51 单片机,本文将对这两个问题予以阐述。如果你对 51 单片机具有兴趣,不妨继续往下阅读哦。 一、何为 51 单片机 51 单片机是对所有兼容 Intel8031 指令系统的单片机的统称。该系列单片机的始祖是 Intel 的 8004 单片机,后来随着 Flashrom 技术的发展,8004 单片机取得了长足的进展,成为应用最广泛的 8 位单片机之一,其代表型号是 ATMEL 公司的 AT89 系列,它广泛应用于工业测控系统之中。很多公司都有 51 系列的兼容机型推出,今后很长的一段时间内将占有大量
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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