当前位置:   article > 正文

51单片机——IIC、EEPROM数据存储 C语言入门编程_51单片机eeprom只能写0或1吗

51单片机eeprom只能写0或1吗

目录

IIC:

起始和停止信号:

应答响应:

AT24C02:

 1.IIC—EEPROM:码管右3位显示0, 按K1键将数据写入到EEPROM内保存,按K2键读取EEPROM内保存的数据,按K3键显示数据加1,按K4键显示数据清零,最大能写入的数据是255


IIC

        I2C(Inter-Integrated Circuit)总线是由 PHILIPS 公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单, 器件封装形式小,通信速率较高等优点。I2C总线只有两根双向信号线。一根是数据线SDA,另一根是时钟线SCL。由于其管脚少,硬件实现简单,可扩展性强等特点,因此被广泛的使用在各大集成芯片内。       

        (1)它是一个支持多设备的总线。“总线”指多个设备共用的信号线。在 一个I2C通讯总线中,可连接多个I2C通讯设备,支持多个通讯主机及多个通 讯从机。 (2)一个I2C总线只使用两条总线线路,一条双向串行数据线(SDA),一 条串行时钟线(SCL)。数据线即用来表示数据,时钟线用于数据收发同步。 (3)每个连接到总线的设备都有一个独立的地址,主机可以利用这个地址 进行不同设备之间的访问。 (4)总线通过上拉电阻接到电源。当I2C设备空闲时,会输出高阻态,而当所有设备都空闲,都输出高阻态时,由上拉电阻把总线拉成高电平。 (5)多个主机同时使用总线时,为了防止数据冲突,会利用仲裁方式决定 由哪个设备占用总线。具有三种传输模式:标准模式传输速率为100kbit/s,快速模式为400kbit/s,高速模式下可达3.4Mbit/s,但目前大多I2C设备尚不支持高速模式。 (7)连接到相同总线的IC数量受到总线的最大电容400pF限制。

        数据有效性规定:I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。每次数据传输都以字节为单位,每次传输的字节数不受限制。

起始和停止信号:

        SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。(接收数据和接收应答时应先释放SDA置1)起始和终止信号都是由主机发出的,在起始信号产生后,总线就处于被占用的状态;在终止信号产生后,总线就处于空闲状态。

应答响应:

        每当发送器件传输完一个字节的数据后,后面必须紧跟一个校验位,这个校验位是接收端通过控制SDA(数据线)来实现的,以提醒发送端数据我这边已经接收完成,数据传送可以继续进行。这个校验位其实就是数据或地址传输过程中的响应。响应包括“应答(ACK)”和“非应答(NACK)”两种信号。

作为数据接收端时,当设备(无论主从机)接收到I2C传输的一个字节数据或地址后,若希望对方继续发送数据,则需要向对方发送“应答(ACK)”信号即特定的低电平脉冲,发送方会继续发送下一个数据;若接收端希望结束数据传输,则向对方发送“非 应答(NACK)”信号即特定的高电平脉冲,发送方接收到该信号后会产生一个停止信号,结束信号传输。数据传送时,先传送最高位(MSB),每一个被传送的字节后面都必须跟随一位应答位(即一帧共有 9 位)。

AT24C02

        AT24C01/02/04/08/16...是一个 1K/2K/4K/8K/16K位串行CMOS,内部含有 128/256/512/1024/2048个8位字节,AT24C01有一个8字节页写缓冲器, AT24C02/04/08/16 有一个16字节页写缓冲器。该器件通过I2C总线接口进行 操作,它有一个专门的写保护功能。

        AT24C02 器件地址为7位,高4位固定为1010,低3位由A0/A1/A2信号线的电平决定。 因为传输地址或数据是以字节为单位传送的,当传送地址时, 器件地址占7位,还有最后一位(最低位 R/W)用来选择读写方向,它与地址无关。(每次写入数据都需要5ms)

 1.IIC—EEPROM:码管右3位显示0, 按K1键将数据写入到EEPROM内保存,按K2键读取EEPROM内保存的数据,按K3键显示数据加1,按K4键显示数据清零,最大能写入的数据是255

        IIC函数

  1. #include <REGX52.H>
  2. sbit SCL=P2^1;
  3. sbit SDA=P2^0;
  4. void IIC_Start(void)//IIC开始
  5. {
  6. SDA=1;
  7. SCL=1;
  8. SDA=0;
  9. SCL=0;
  10. }
  11. void IIC_Stop(void)//IIC停止
  12. {
  13. SCL=0;
  14. SDA=0;
  15. SCL=1;
  16. SDA=1;
  17. }
  18. void IIC_SendAck(unsigned char Ack)//IIC发送应答0为应答1为非应答
  19. {
  20. Ack=SDA;
  21. SCL=1;
  22. SCL=0;
  23. SDA=0;
  24. }
  25. unsigned char IIC_ReceiveAck(void)//IIC接收应答
  26. {
  27. unsigned char Ack;
  28. SDA=1;//接收时先释放SDA置1
  29. SCL=1;
  30. SDA=Ack;
  31. SCL=0;
  32. SDA=0;
  33. return Ack;
  34. }
  35. void IIC_SendByte(unsigned char Byte)//IIC发送一个字节,先发高位
  36. {
  37. unsigned char i;
  38. for(i=0;i<8;i++)
  39. {
  40. SDA=Byte&(0x80>>i);
  41. SCL=1;
  42. SCL=0;
  43. }
  44. }
  45. unsigned char IIC_ReceiveByte(void)//IIC接收一个字节
  46. {
  47. unsigned char Byte=0,i;
  48. SDA=1;//接收时先释放SDA置1
  49. for(i=0;i<8;i++)
  50. {
  51. SCL=1;
  52. if(SDA)
  53. Byte|=(0x80>>i);
  54. SCL=0;
  55. }
  56. return Byte;
  57. }

        AT24C02函数

  1. #include <REGX52.H>
  2. #include "IIC.h"
  3. void AT24C02_WriteByte(unsigned char Address,Data)//AT24C02写入一个字节 地址,数据 需5ms
  4. {
  5. IIC_Start();
  6. IIC_SendByte(0xa0);//写入
  7. IIC_ReceiveAck();
  8. IIC_SendByte(Address);
  9. IIC_ReceiveAck();
  10. IIC_SendByte(Data);
  11. IIC_ReceiveAck();
  12. IIC_Stop();
  13. }
  14. unsigned char AT24C02_ReceiveByte(unsigned char Address)//AT24C02读取一个字节 地址
  15. {
  16. unsigned char Data;
  17. IIC_Start();
  18. IIC_SendByte(0xa0);//写入
  19. IIC_ReceiveAck();
  20. IIC_SendByte(Address);
  21. IIC_ReceiveAck();
  22. IIC_Start();
  23. IIC_SendByte(0xa1);//读取
  24. IIC_ReceiveAck();
  25. Data=IIC_ReceiveByte();
  26. IIC_SendAck(1);
  27. IIC_Stop();
  28. return Data;
  29. }

        主函数

  1. #include <REGX52.H>
  2. #include "AT24C02.h"
  3. #include "shumaguan.h"
  4. #include "anjian.h"
  5. void main()
  6. {
  7. unsigned char i=199,key;
  8. while(1)
  9. {
  10. key=anjian();
  11. if(key)
  12. {
  13. if(key==1)
  14. {
  15. AT24C02_WriteByte(0,i);//写入当前数据
  16. }
  17. if(key==2)
  18. {
  19. i=AT24C02_ReceiveByte(0);//读取写入的数据
  20. }
  21. if(key==3)
  22. {
  23. i++;//当前数据+1
  24. }
  25. if(key==4)
  26. {
  27. i=0;//当前数据清零
  28. }
  29. }
  30. shumaguan(6,i/100);//显示数据
  31. shumaguan(7,(i/10)%10);
  32. shumaguan(8,i%10);
  33. }
  34. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号