1、本例对I2C总线上关节两个AT24C02进行读写操作,想将数据0xaa写入第一个at24c02的指定地址,再将该数据读出后存入第二个AT24C02的指定地址,最后读出该数据并送P1口用8位LED显示验证
2、实现方法:
1)两个器件地址的确定
由于第一个AT24C02的3位地址位(A0A1A2)均接地(低电平),第二个AT24C02的三个地址位(A0A1A2)均接电源(高电平),因此第一个AT24C02的地址为000,第二个AT24C02的地址为111.在写命令时,指名要操作的器件地址,即可对不同的AT24C02进行操作
3、在keil c51中新建工程ex54,编写如下程序代码,编译并生成ex54.hex文件
//对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++)
#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++)