目录
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);
}
}