I2C总线上接两个AT24C02读写实例.docx
- 文档编号:5507422
- 上传时间:2022-12-17
- 格式:DOCX
- 页数:6
- 大小:16.51KB
I2C总线上接两个AT24C02读写实例.docx
《I2C总线上接两个AT24C02读写实例.docx》由会员分享,可在线阅读,更多相关《I2C总线上接两个AT24C02读写实例.docx(6页珍藏版)》请在冰豆网上搜索。
I2C总线上接两个AT24C02读写实例
I2C总线上接两个AT24C02读写实例
、本例对I2C总线上关节两个AT24C02进行读写操作,想将数据0xaa写入第一个at24c02的指定地址,再将该数据读出后存入第二个AT24C02的指定地址,最后读出该数据并送P1口用8位LED显示验证
2、实现方法:
1)两个器件地址的确定
由于第一个AT24C02的3位地址位(A0A1A2)均接地(低电平),第二个AT24C02的三个地址位(A0A1A2)均接电源(高电平),因此第一个AT24C02的地址为000,第二个AT24C02的地址为111.在写命令时,指名要操作的器件地址,即可对不同的AT24C02进行操作
3、在keilc51中新建工程ex54,编写如下程序代码,编译并生成ex54.hex文件
//对I2C总线上挂接多个AT24C02的读写操作
#include
#include
#define OP_READ1 0xa1 //器件1地址以及读取操作,0xa1即为10100001B
#define OP_WRITE10xa0 //器件1地址以及写入操作,0xa1即为10100000B
#define OP_READ2 0xaf //器件2地址以及读取操作,0xa1即为10101111B
#define OP_WRITE20xae //器件2地址以及写入操作,0xa1即为10101110B
sbitSDA=P3^4; //将串行数据总线SDA位定义在为P3.4引脚
sbitSCL=P3^3; //将串行时钟总线SDA位定义在为P3.3引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /*************************************************** 函数功能: 开始数据传送 ***************************************************/ voidstart() //开始位 { SDA=1; //SDA初始化为高电平“1” SCL=1; //开始数据传送时,要求SCL为高电平“1” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SDA=0; //SDA的下降沿被认为是开始信号 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL=0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) _nop_(); //等待一个机器周期 } /*************************************************** 函数功能: 结束数据传送 ***************************************************/ voidstop() //停止位 { SDA=0; //SDA初始化为低电平“0” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL=1; //结束数据传送时,要求SCL为高电平“1” _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SDA=1; //SDA的上升沿被认为是结束信号 } /*************************************************** 函数功能: 从AT24Cxx读取数据 出口参数: x ***************************************************/ unsignedcharReadData() //从AT24Cxx移入数据到MCU { unsignedchari; unsignedcharx; //储存从AT24Cxx中读出的数据 for(i=0;i<8;i++) { SCL=1; //SCL置为高电平 x<<=1; //将x中的各二进位向左移一位 x|=(unsignedchar)SDA; //将SDA上的数据通过按位“或“运算存入x中 SCL=0; //在SCL的下降沿读出数据 } return(x); //将读取的数据返回 } /*************************************************** 函数功能: 向AT24Cxx的当前地址写入数据 入口参数: y(储存待写入的数据) ***************************************************/ //在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0 bitWriteCurrent(unsignedchary) { unsignedchari; bitack_bit; //储存应答位 for(i=0;i<8;i++) //循环移入8个位 { SDA=(bit)(y&0x80); //通过按位“与”运算将最高位数据送到S //因为传送时高位在前,低位在后 _nop_(); //等待一个机器周期 SCL=1; //在SCL的上升沿将数据写入AT24Cxx _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL=0; //将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲 y<<=1; //将y中的各二进位向左移一位 } SDA=1; //发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, //以让SDA线转由接收设备(AT24Cxx)控制 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 SCL=1; //根据上述规定,SCL应为高电平 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 _nop_(); //等待一个机器周期 ack_bit=SDA;//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 //若送高电平,表示没有接收到,传送异常 SCL=0; //SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递) return ack_bit;//返回AT24Cxx应答位 } /*************************************************** 函数功能: 向第一个AT24Cxx中的指定地址写入数据 入口参数: add(储存指定的地址);dat(储存待写入的数据) ***************************************************/ voidWriteSet1(unsignedcharadd,unsignedchardat) //在指定地址addr处写入数据WriteCurrent { start(); //开始数据传递 WriteCurrent(OP_WRITE1); //选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据 WriteCurrent(add); //写入指定地址 WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据 stop(); //停止数据传递 delaynms(4); //1个字节的写入周期为1ms,最好延时1ms以上 } /*************************************************** 函数功能: 向第二个AT24Cxx中的指定地址写入数据 入口参数: add(储存指定的地址);dat(储存待写入的数据) ***************************************************/ voidWriteSet2(unsignedcharadd,unsignedchardat) //在指定地址addr处写入数据WriteCurrent { start(); //开始数据传递 WriteCurrent(OP_WRITE2); //选择要操作的AT24Cxx芯片,并告知要对其写入数据 WriteCurrent(add); //写入指定地址 WriteCurrent(dat); //向当前地址(上面指定的地址)写入数据 stop(); //停止数据传递 delaynms(4); //1个字节的写入周期为1ms,最好延时1ms以上 } /*************************************************** 函数功能: 从第一个AT24Cxx中的当前地址读取数据 出口参数: x(储存读出的数据) ***************************************************/ unsignedcharReadCurrent1() { unsignedcharx; start(); //开始数据传递 WriteCurrent(OP_READ1); //选择要操作的第一个AT24Cxx芯片,并告知要读其数据 x=ReadData(); //将读取的数据存入x stop(); //停止数据传递 returnx; //返回读取的数据 } /*************************************************** 函数功能: 从第二个AT24Cxx中的当前地址读取数据 出口参数: x(储存读出的数据) ***************************************************/ unsignedcharReadCurrent2() { unsignedcharx; start(); //开始数据传递 WriteCurrent(OP_READ2); //选择要操作的第二个AT24Cxx芯片,并告知要读其数据 x=ReadData(); //将读取的数据存入x stop(); //停止数据传递 returnx; //返回读取的数据 } /*************************************************** 函数功能: 从第一个AT24Cxx中的指定地址读取数据 入口参数: set_addr 出口参数: x ***************************************************/ unsignedcharReadSet1(unsignedcharset_addr) //在指定地址读取 { start(); //开始数据传递 WriteCurrent(OP_WRITE1); //选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据 WriteCurrent(set_addr); //写入指定地址 return(ReadCurrent1()); //从第一个AT24Cxx芯片指定地址读出数据并返回 } /*************************************************** 函数功能: 从第二个AT24Cxx中的指定地址读取数据 入口参数: set_addr 出口参数: x ***************************************************/ unsignedcharReadSet2(unsignedcharset_addr) //在指定地址读取 { start(); //开始数据传递 WriteCurrent(OP_WRITE2); //选择要操作的第二个AT24Cxx芯片,并告知要对其写入数据 WriteCurrent(set_addr); //写入指定地址 return(ReadCurrent2()); //从第二个AT24Cxx芯片指定地址读出数据并返回 } /*************************************************** 函数功能: 主函数 ***************************************************/ main(void) { unsignedcharx; SDA=1; //SDA=1,SCL=1,使主从设备处于空闲状态 SCL=1; WriteSet1(0x36,0xaa); //将数据"0xaa"写入第一个AT24C02的指定地址"0x36" x=ReadSet1(0x36); //从第二个AT24C02中的指定地址"0x36"读出数据 WriteSet2(0x48,x); //将读出的数据写入第二个AT24C02的指定地址"0x48"? P1=ReadSet2(0x48); //将从第二个AT24C02的指定地址读出的数据送P1口显示验证 } 4、在proteus中新建仿真文件ex54.dsn,电路原理图如下所示 5、将ex54.hex文件载入at89c51中,启动仿真,观察运行结果。 下图是程序运行结果。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- I2C 总线 两个 AT24C02 读写 实例
![提示](https://static.bdocx.com/images/bang_tan.gif)