一. 简介AT24C02是一种低工作电压的 2k 位串行电可擦除只读存储器可以实现掉电不丢失的功能可以用来存储想要永久保存的数据单片机在断电重启后也可以重新读取利用。1.引脚引脚功能A0~A2地址输入GNDVCC电源WP写保护SDA串行数据输出输入SCL串行时钟输入写保护WP为高电平时功能启用无法写入只可读。反之则可以正常进行读/写操作。2.AT24C02地址其中对AT24Cxx芯片来说前四位固定为 1010 而后面的三位则由引脚上的高低电平决定如均接gnd则为000所以一条总线上最多接8个AT24C02.最后一位为读/写位1为读0为写。3.存储容量256个字节每个字节8位256*82048 2k。芯片寻址可对内部256B中的任一个进行读/写操作其寻址范围为00~FF共256个寻址单位二. I2C总线1. 简介I2C总线是由Philips公司开发的一种简单、双向二线制同步串行总线。它只需要两根线即可在连接于总线上的器件之间传送信息。同步半双工带数据应答2. 电路I2C 的引脚设置为开漏输出模式同时为了防止输出1时的引脚为浮空在外要接上上拉电阻。这样当主机拉低时从机就无法控制数据线只有数据线为高时才释放了数据线。同时实现了一个线与的功能即所有都为高数据线才为高。3.I2C时序开始SCL在高电平期间SDA从高电平切换到低电平终止SCL在高电平期间SDA从低电平切换到高电平在起始条件产生后总线处于忙状态由本次数据传输的主从设备独占其他I2C器件无法访问总线而在停止条件产生后本次数据传输的主从设备将释放总线总线再次处于空闲状态发送一个字节在SCL低电平时在SDA上放置数据高位在前之后拉高SCL之后拉低SCL 。循环八次后发送一个字节。接受一个字节接收也是上升沿接收数据反复八次。注意主机在接收之前要释放SDA即先置1 拉高SDAIIC 协议规定SDA上传输的数据必须在SCL为高电平期间保持稳定SDA上的数据只能在SCL为低电平期间变化。IIC期间在脉冲上升沿把数据放到SDA上在脉冲下降沿从SAD上读取数据应答发送应答在接收完一个字节后主机在下一个时钟发送一位数据。0代表应答1代表非应答。如果没有得到主机的应答信号此时会停止输出直到收到结束信号来结束。接收应答在发送完一个字节后主机在下一个时钟接收一位数据。判断从机是否应答0代表应答1代表非应答。主机接收前要先释放SDA由于应答信号为传递的最后一位信号当其确实是时在第9个时钟周期发送的是非应答信号(此时发送的不是应答信号就是非应答信号)三. AT24C02 的数据传输只针对其的时序1.写操作字节写入存在一个写周期即在一个写的结束到下一个开始之间需要一段时间所以在程序中需要增加延时。2.读操作随机读取存储器内某一地址数据四.代码实现#includereg51.h#defineC02_W0xA0//在这个单片机上写芯片地址为0xA0#defineC02_R0xA1//读芯片地址为0xA1sbit SCLP2^1;sbit SDAP2^0;/****** I2C 部分 *******///* 开始voidstart(){SCL1;SDA1;//初始化两条线SDA0;SCL0;}//* 结束voidend(){SDA0;SCL1;//防止之前的数值影响而失败SDA1;}//* 发送 1位8字节voidsend(unsignedcharByte){unsignedchari0;SCL0;for(i0;i8;i){SDAByte(0x80i);SCL1;SCL0;}}//* 接收 1位charrecv(){chari0;unsignedcharByte0x00;//使用char 定义变量时读取时会出现错误SCL0;SDA1;for(i0;i8;i){SCL1;if(SDA){Byte|(0x80i);//发送位为1时将data相应的位为1}SCL0;}returnByte;}//* 发送应答voidSA(unsignedcharA){SCL0;SDAA;SCL1;SCL0;}//* 接收应答charRA(){charA0;SCL0;SDA1;SCL1;ASDA;SCL0;//不写会出错returnA;}/******** AT24C02 ********/voidSend_data(unsignedcharaddress,Data){start();send(C02_W);RA();send(address);RA();send(Data);RA();end();}charRecv_data(unsignedcharaddress){unsignedcharData;start();send(C02_W);RA();send(address);RA();start();send(C02_R);RA();Datarecv();SA(1);end();returnData;}voidmain(){unsignedcharABC,BCD;ABC57;BCD0x00;Send_data(0,ABC);Delay(5);//写周期保证写入正确BCDRecv_data(0);LCD_Init();LCD_ShowNum(1,1,BCD,5);}