51单片机——EEPROM

发布者:bln898最新更新时间:2016-12-23 来源: eefocus关键字:51单片机  EEPROM 手机看文章 扫描二维码
随时随地手机看文章

24C02:256 个字节的 EEPROM。一般情况下,EEPROM 拥有 30 万到 100 万次的寿命。基于 I2C 通信协议的器件。I2C 是一个通信协议,它拥有严密的通信时序逻辑要求,而EEPROM 是一个器件,只是这个器件采样了 I2C 协议的接口与单片机相连而已,二者并没有必然的联系,EEPROM 可以用其它接口, I2C 也可以用在其它很多器件上。

 

1、EEPROM写数据流程

第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地
址,并且在读写方向上选择“写”操作。

第二步,发送数据的存储地址。24C02一共 256 个字节的存储空间,地址从 0x00~0xFF,我们想把数据存储在哪个位置,此刻写的就是哪个地址。
第三步,发送要存储的数据第一个字节、第二个字节„„注意在写数据的过程中,
EEPROM 每个字节都会回应一个“应答位 0”,来告诉我们写 EEPROM 数据成功,如果没有回应答位,说明写入不成功。

在写数据的过程中,每成功写入一个字节,EEPROM 存储空间的地址就会自动加 1,当加到 0xFF 后,再写一个字节,地址会溢出又变成了 0x00。

 

2、EEPROM读数据流程

第一步,首先是 I2C 的起始信号,接着跟上首字节,也就是我们前边讲的 I2C 的器件地址,并且在读写方向上选择“写”操作。这个地方可能有同学会诧异,我们明明是读数据为何方向也要选“写”呢?刚才说过了,24C02 一共有 256 个地址,我们选择写操作,是为了把所要读的数据的存储地址先写进去,告诉 EEPROM 我们要读取哪个地址的数据。这就如同我们打电话,先拨总机号码(EEPROM 器件地址),而后还要继续拨分机号码(数据地址),而拨分机号码这个动作,主机仍然是发送方,方向依然是“写”。

第二步,发送要读取的数据的地址,注意是地址而非存在EEPROM 中的数据,通知EEPROM 我要哪个分机的信息。
第三步,重新发送 I2C 起始信号和器件地址,并且在方向位选择“读”操作。
这三步当中,每一个字节实际上都是在“写”,所以每一个字节EEPROM 都会回应一个“应答位 0”。

第四步,读取从器件发回的数据,读一个字节,如果还想继续读下一个字节,就发送一个“应答位ACK(0)”,如果不想读了,告诉 EEPROM,我不想要数据了,别再发数据了,那就发送一个“非应答位NAK(1)”。

和写操作规则一样,我们每读一个字节,地址会自动加 1,那如果我们想继续往下读,给EEPROM 一个 ACK(0)低电平,那再继续给 SCL 完整的时序,EEPROM 会继续往外送数据。如果我们不想读了,要告诉 EEPROM 不要数据了,那我们直接给一个NAK(1)高电平即可。这个地方大家要从逻辑上理解透彻,不能简单的靠死记硬背了,一定要理解明白。梳理一下几个要点: A、在本例中单片机是主机,24C02 是从机; B、无论是读是写, SCL 始终都是由主机控制的; C、写的时候应答信号由从机给出,表示从机是否正确接收了数据; D、读的时候应答信号则由主机给出,表示是否继续读下去。

 

  1. #include   

  2.   

  3. extern void I2CStart();  

  4. extern void I2CStop();  

  5. extern unsigned char I2CReadACK();  

  6. extern unsigned char I2CReadNAK();  

  7. extern bit I2CWrite(unsigned char dat);  

  8.   

  9. /* E2读取函数,buf-数据接收指针,addr-E2中的起始地址,len-读取长度 */  

  10. void E2Read(unsigned char *buf, unsigned char addr, unsigned char len)  

  11. {  

  12.   do                         //用寻址操作查询当前是否可进行读写操作  

  13.   {  

  14.     I2CStart();  

  15.     if(I2CWrite(0x50 << 1)) //应答则跳出循环,非应答则进行下一次查询  

  16.     {  

  17.       break;  

  18.     }  

  19.     I2CStop();  

  20.   }  

  21.   while(1);  

  22.   I2CWrite(addr);            //写入起始地址  

  23.   I2CStart();                //发送重复启动信号  

  24.   I2CWrite((0x50 << 1) | 0x01); //寻址器件,后续为读操作  

  25.   while (len > 1)           //连续读取len-1个字节  

  26.   {  

  27.     *buf++ = I2CReadACK(); //最后字节之前为读取操作+应答  

  28.     len--;  

  29.   }  

  30.   *buf = I2CReadNAK();      //最后一个字节为读取操作+非应答  

  31.   I2CStop();  

  32. }  

  33. /* E2写入函数,buf-源数据指针,addr-E2中的起始地址,len-写入长度 */  

  34. void E2Write(unsigned char *buf, unsigned char addr, unsigned char len)  

  35. {  

  36.   while (len > 0)  

  37.   {  

  38.     //等待上次写入操作完成  

  39.     do                        //用寻址操作查询当前是否可进行读写操作  

  40.     {  

  41.       I2CStart();  

  42.       if(I2CWrite(0x50 << 1)) //应答则跳出循环,非应答则进行下一次查询  

  43.       {  

  44.         break;  

  45.       }  

  46.       I2CStop();  

  47.     }  

  48.     while(1);  

  49.     //按页写模式连续写入字节  

  50.     I2CWrite(addr);           //写入起始地址  

  51.     while(len > 0)  

  52.     {  

  53.       I2CWrite(*buf++);     //写入一个字节数据  

  54.       len--;                //待写入长度计数递减  

  55.       addr++;               //E2地址递增  

  56.       if ((addr & 0x07) == 0) //检查地址是否到达页边界,24C02每页8字节,  

  57.       {  

  58.         //所以检测低3位是否为零即可  

  59.         break;            //到达页边界时,跳出循环,结束本次写操作  

  60.       }  

  61.     }  

  62.     I2CStop();  

  63.   }  

  64. }  



关键字:51单片机  EEPROM 引用地址:51单片机——EEPROM

上一篇:51单片机——LCD1602
下一篇:单片机中三极管的应用

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

51单片机的晶振频率是多少
51单片机是一种常用的微控制器芯片,广泛应用于各种电子设备的控制和计算中。在单片机中晶振非常重要,它是单片机实现高精度和高速运算的基础。JSK晶鸿兴为您介绍51单片机的晶振频率是多少。 在51单片机中,晶振频率确定了单片机的基本时钟周期(Clock Cycle)。晶振的频率越高,单片机的时钟周期越短,单片机的处理速度越快。反之,晶振的频率越低,单片机的时钟周期越长,单片机的处理速度越慢。因此,在选择晶振时需要根据实际需要选择合适的频率。 通常,51单片机晶振的频率有以下几种:12MHz、11.0592MHz、24MHz、16MHz、20MHz等。目前,12MHz和11.0592MHz较为常见,这两种频率的晶振通常用于简单的
[单片机]
51单片机基础之DS1302
代码: main.c 文件 /* DS1302时钟 */ #include smg.h #include ds1302.h void main() { u8 time_buf ; //这个数组用来存储需要现实的内容 ds1302_init();//初始化DS1302 while(1) { ds1302_read_time(); //虽然不知道这个是干嘛的,但是知道怎么改。 time_buf =gsmg_code /16]; time_buf =gsmg_code &0x0f]; time_buf =0x40; //显示一杠 time_buf =gs
[单片机]
基于51单片机的直流电机PWM调速控制系统
1 引言 1.1 课题背景 1.1.2 开发背景 在现代电子产品中,自动控制系统,电子仪器设备、家用电器、电子玩具等等方面,直流电机都得到了广泛的应用。大家熟悉的录音机、电唱机、录相机、电子计算机等,都不能缺少直流电机。所以直流电机的控制是一门很实用的技术。直流电机,大体上可分为四类:几相绕组的步进电机、永磁式换流器直流电机、伺服电机、 两相低电压交流电机 直流电机的特点是启动转矩大,最大转矩大,转速控制容易,调速后效率很高。与交流调速相比,直流电机结构复杂,生产成本高,维护工作量大。随着大功率晶体管的问世以及矢量控制技术的成熟,使得矢量控制变频技术获得迅猛发展,从而研制出各种类型、各种功率的变频调速装置,并在工业上得到广泛应
[单片机]
基于<font color='red'>51单片机</font>的直流电机PWM调速控制系统
51单片机 8*8LED点阵横向流水 使用位运算生成中间帧
#include reg52.h typedef unsigned char uchar; sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; code uchar image = { {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}, //动画帧0 {0xFF,0xC3,0xE7,0xE7,0xE7,0xE7,0xE7,0xC3}, //动画帧8 {0xFF,0
[单片机]
C51单片机学习---8*8LED点阵屏
关于8*8LED点阵屏 1.8*8LED点阵屏原理图 74HC595移位器:将串行输入— 并形输出 LED:单色光,三色光(红,绿,蓝– 组成多种颜色) pitch:相邻两个点之间的间距。 2mm=2pitch 实际应用: 广告 //点亮最右边的led #include reg52.h #include intrins.h typedef unsigned char u8; typedef unsigned int u16; sbit SCK =P3^6; sbit RCK =P3^5; sbit SER =P3^4; void Hc595SendByte(u8 dat); void main(void )
[单片机]
C<font color='red'>51单片机</font>学习---8*8LED点阵屏
51单片机存储器的结构和原理解析
一、存储器结构 51单片机存储器采用的是哈佛结构,即是程序存储器空间和数据存储器空间分开,程序存储器和数据存储器各自有自己的寻址方式、寻址空间和控制系统。 51存储器可以分为 程序存储器ROM:用于存放程序和表格之类的固定常识。C51编程中用code关键词声明。 内部数据存储器RAM:51子系列有128字节RAM,52子系列有256字节RAM 特殊功能寄存器SFR:80H-FFH字节地址的RAM 位地址空间:片内RAM0x20-0x2f空间,本空间允许按位或者字节寻址。可用bdata进行声明。 外部数据寄存器RAM:片外的RAM,最大寻址空间2^16即是64K大RAM。Pdata用于声明片外第一页RAM空间为0-255;x
[单片机]
<font color='red'>51单片机</font>存储器的结构和原理解析
51单片机做一个电子钟
学了一个多月51了,终于整了个电子钟出来,个人感觉还是比较有趣的。 需要注意的是我用的是普中的板子,板子类型不同,io口的功能可能会有所差异。然后我这个k1开关和k2开关是接反了的,原本k1应该是接P3^0,k2接P3^1的,结果我一测试才知道k1接到了P3^1,k2接到P3^0了,不过这不要紧,用sbit定义位变量时注意换一下就可以了。然后大概讲讲功能,用8个数码管显示目前时间和闹铃时间,然后用4个独立按键对目前时间和闹铃时间进行调整(k2是加,k3是减 ,k4是用来停止闹铃的),第一次按k1是对目前时间秒数调整,第2次按k1是对目前时间分钟数调整,第三次按k1是对目前时间小时数调整,第4次按k1是对闹铃秒数调整,第5次按k
[单片机]
Microchip推出单I/O总线串行EEPROM系列
  2008年5月6日,Microchip Technology Inc.今天宣布推出最新的总共10款具备单I/O总线接口的串行EEPROM器件系列。新器件支持Microchip待批专利的UNI/O存储器件协议。11XX010、11XX020、11XX040、11XX080及11XX160是业内首批能支持从10kHz至100kHz范围内任意数据速率的单I/O EEPROM器件,也是唯一具有3引脚SOT-23封装的1KB、2KB、4KB、8KB及16KB的EEPROM器件(还具有其他高引脚数封装)。新器件及总线集强大功能和低引脚封装于一身,可帮助设计人员有效减小系统体积并降低成本。   现今的消费电子产品在日渐轻巧的同时具备越来越
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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