赞
踩
目录
1.IIC—EEPROM:码管右3位显示0, 按K1键将数据写入到EEPROM内保存,按K2键读取EEPROM内保存的数据,按K3键显示数据加1,按K4键显示数据清零,最大能写入的数据是255
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 位)。
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)
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);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。