51单片机——IIC、EEPROM数据存储 C语言入门编程

  • Post author:
  • Post category:其他



目录


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函数

#include <REGX52.H>

sbit SCL=P2^1;
sbit SDA=P2^0;

void IIC_Start(void)//IIC开始
{
    SDA=1;
    SCL=1;
    SDA=0;
    SCL=0;
}

void IIC_Stop(void)//IIC停止
{
    SCL=0;
    SDA=0;
    SCL=1;
    SDA=1;
}

void IIC_SendAck(unsigned char Ack)//IIC发送应答0为应答1为非应答
{
    Ack=SDA;
    SCL=1;
    SCL=0;
    SDA=0;
}

unsigned char IIC_ReceiveAck(void)//IIC接收应答
{
    unsigned char Ack;
    SDA=1;//接收时先释放SDA置1
    SCL=1;
    SDA=Ack;
    SCL=0;
    SDA=0;
    return Ack;
}

void IIC_SendByte(unsigned char Byte)//IIC发送一个字节,先发高位
{
    unsigned char i;
    for(i=0;i<8;i++)
    {
        SDA=Byte&(0x80>>i);
        SCL=1;
        SCL=0;
    }
}
unsigned char IIC_ReceiveByte(void)//IIC接收一个字节
{
    unsigned char Byte=0,i;
    SDA=1;//接收时先释放SDA置1
    for(i=0;i<8;i++)
    {
        SCL=1;
        if(SDA)
            Byte|=(0x80>>i);
        SCL=0;
    }
    return Byte;
}

AT24C02函数

#include <REGX52.H>
#include "IIC.h"

void AT24C02_WriteByte(unsigned char Address,Data)//AT24C02写入一个字节 地址,数据 需5ms
{
    IIC_Start();
    IIC_SendByte(0xa0);//写入
    IIC_ReceiveAck();
    IIC_SendByte(Address);
    IIC_ReceiveAck();
    IIC_SendByte(Data);
    IIC_ReceiveAck();
    IIC_Stop();
}

unsigned char AT24C02_ReceiveByte(unsigned char Address)//AT24C02读取一个字节 地址
{
    unsigned char Data;
    IIC_Start();
    IIC_SendByte(0xa0);//写入
    IIC_ReceiveAck();
    IIC_SendByte(Address);
    IIC_ReceiveAck();
    IIC_Start();
    IIC_SendByte(0xa1);//读取
    IIC_ReceiveAck();
    Data=IIC_ReceiveByte();
    IIC_SendAck(1);
    IIC_Stop();
    return Data;
}

主函数

#include <REGX52.H>
#include "AT24C02.h"
#include "shumaguan.h"
#include "anjian.h"

void main()
{
    unsigned char i=199,key;
    while(1)
    {
        key=anjian();
        if(key)
        {
            if(key==1)
            {
                AT24C02_WriteByte(0,i);//写入当前数据
            }
            if(key==2)
            {
                i=AT24C02_ReceiveByte(0);//读取写入的数据
            }
            if(key==3)
            {
                i++;//当前数据+1
            }
            if(key==4)
            {
                i=0;//当前数据清零
            }
        }
        shumaguan(6,i/100);//显示数据
        shumaguan(7,(i/10)%10);
        shumaguan(8,i%10);
    }
}



版权声明:本文为m0_69169562原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。