1.对I2C总线上挂接多个AT24C02的读写操作源代码如下:
//对I2C总线上的2个AT24C02(U2和U3)的读写
/*
I2C总线系统中器件地址包括固定部分和可编程部分。
可编程部分必须根据A0、A1和A2来设置。
可编程部分A0、A1和A2的编程并不是通过软件编程。
而是把A0、A1和A2三个引脚接不同的电压来确定数值。
接VCC表示1,接GND表示0,
所以最多可以接8个相同的芯片在同一个I2C总线上。
at24c02前四位固定
msb LSB
1 0 1 0 A2 A1 A0 R/W
pcf8591前四位固定1001
最后一位是读写位,1为读,0为写
*/
/*
1、本例对I2C总线上关节两个AT24C02进行读写操作,想将数据0xaa写入第一个at24c02的指定地址,再将该数据读出后存入第二个AT24C02的指定地址,最后读出该数据并送P1口用8位LED显示验证
2、实现方法:
1)两个器件地址的确定
由于第一个AT24C02的3位地址位(A0A1A2)均接地(低电平),第二个AT24C02的三个地址位(A0A1A2)均接电源(高电平),因此第一个AT24C02的地址为000,第二个AT24C02的地址为111.在写命令时,指名要操作的器件地址,即可对不同的AT24C02进行操作
*/
//对I2C总线上挂接多个AT24C02的读写操作
#include <reg51.h> // 包含51单片机寄存器定义的头文件
#include <intrins.h> //包含_nop_()函数定义的头文件
#define OP_READ1 0xa1 // 器件1地址以及读取操作,0xa1即为1010 0001B
#define OP_WRITE1 0xa0 // 器件1地址以及写入操作,0xa1即为1010 0000B
#define OP_READ2 0xaf // 器件2地址以及读取操作,0xa1即为1010 1111B
#define OP_WRITE2 0xae // 器件2地址以及写入操作,0xa1即为1010 1110B
sbit SDA=P3^4; //将串行数据总线SDA位定义在为P3.4引脚
sbit SCL=P3^3; //将串行时钟总线SDA位定义在为P3.3引脚
/*****************************************************
函数功能:延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
void delay1ms()
{
unsigned char i,j;
for(i=0; i<10; i++)
for(j=0; j<33; j++)
;
}
/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delaynms(unsigned char n)
{
unsigned char i;
for(i=0; i<n; i++)
delay1ms();
}
/*************************************