I2C总线上接两个AT24C02读写实例Word版.doc

上传人:rrsccc 文档编号:9418096 上传时间:2021-02-24 格式:DOC 页数:13 大小:194.50KB
返回 下载 相关 举报
I2C总线上接两个AT24C02读写实例Word版.doc_第1页
第1页 / 共13页
I2C总线上接两个AT24C02读写实例Word版.doc_第2页
第2页 / 共13页
I2C总线上接两个AT24C02读写实例Word版.doc_第3页
第3页 / 共13页
I2C总线上接两个AT24C02读写实例Word版.doc_第4页
第4页 / 共13页
I2C总线上接两个AT24C02读写实例Word版.doc_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《I2C总线上接两个AT24C02读写实例Word版.doc》由会员分享,可在线阅读,更多相关《I2C总线上接两个AT24C02读写实例Word版.doc(13页珍藏版)》请在三一文库上搜索。

1、传播优秀Word版文档 ,希望对您有帮助,可双击去除!I2C总线上接两个AT24C02读写实例、本例对I2C总线上关节两个AT24C02进行读写操作,想将数据0xaa写入第一个at24c02的指定地址,再将该数据读出后存入第二个AT24C02的指定地址,最后读出该数据并送P1口用8位LED显示验证2、实现方法:1)两个器件地址的确定由于第一个AT24C02的3位地址位(A0A1A2)均接地(低电平),第二个AT24C02的三个地址位(A0A1A2)均接电源(高电平),因此第一个AT24C02的地址为000,第二个AT24C02的地址为111.在写命令时,指名要操作的器件地址,即可对不同的AT2

2、4C02进行操作3、在keil c51中新建工程ex54,编写如下程序代码,编译并生成ex54.hex文件传播优秀Word版文档 ,希望对您有帮助,可双击去除!/对I2C总线上挂接多个AT24C02的读写操作#include / 包含51单片机寄存器定义的头文件#include /包含_nop_()函数定义的头文件#defineOP_READ10xa1/ 器件1地址以及读取操作,0xa1即为1010 0001B#defineOP_WRITE1 0xa0/ 器件1地址以及写入操作,0xa1即为1010 0000B#defineOP_READ20xaf/ 器件2地址以及读取操作,0xa1即为101

3、0 1111B#defineOP_WRITE2 0xae/ 器件2地址以及写入操作,0xa1即为1010 1110Bsbit SDA=P34; /将串行数据总线SDA位定义在为P3.4引脚sbit SCL=P33; /将串行时钟总线SDA位定义在为P3.3引脚/*函数功能:延时1ms(3j+2)*i=(333+2)10=1010(微秒),可以认为是1毫秒*/void delay1ms() unsigned char i,j; for(i=0;i10;i+) for(j=0;j33;j+) ; /*函数功能:延时若干毫秒入口参数:n*/void delaynms(unsigned char n)

4、 unsigned char i;for(i=0;in;i+) delay1ms();/*函数功能:开始数据传送*/void start()/ 开始位SDA = 1; /SDA初始化为高电平“1”SCL = 1; /开始数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 0; /SDA的下降沿被认为是开始信号_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据

5、传递)_nop_(); /等待一个机器周期/*函数功能:结束数据传送*/void stop()/ 停止位SDA = 0; /SDA初始化为低电平“0”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SCL = 1; /结束数据传送时,要求SCL为高电平“1”_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期_nop_(); /等待一个机器周期SDA = 1; /SDA的上升沿被认为是结束信号/*函数功能:从AT24Cxx读取数据出口参数:x*

6、/unsigned char ReadData()/ 从AT24Cxx移入数据到MCUunsigned char i;unsigned char x; /储存从AT24Cxx中读出的数据for(i = 0; i 8; i+)SCL = 1; /SCL置为高电平x=1; /将x中的各二进位向左移一位x|=(unsigned char)SDA; /将SDA上的数据通过按位“或“运算存入x中SCL = 0; /在SCL的下降沿读出数据return(x); /将读取的数据返回/*函数功能:向AT24Cxx的当前地址写入数据入口参数:y (储存待写入的数据)*/在调用此数据写入函数前需首先调用开始函数s

7、tart(),所以SCL=0bit WriteCurrent(unsigned char y)unsigned char i;bit ack_bit; /储存应答位for(i = 0; i 8; i+)/ 循环移入8个位 SDA = (bit)(y&0x80); /通过按位“与”运算将最高位数据送到S /因为传送时高位在前,低位在后_nop_(); /等待一个机器周期 SCL = 1; /在SCL的上升沿将数据写入AT24Cxx _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 0; /将SCL重新置为低电平,以在SC线形成传送数据所需的个脉冲y = 1;

8、 /将y中的各二进位向左移一位SDA = 1; / 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电平,表示没有接收到,传送异常SCL = 0

9、; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)return ack_bit;/ 返回AT24Cxx应答位/*函数功能:向第一个AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)*/void WriteSet1(unsigned char add, unsigned char dat)/ 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传递WriteCurrent(OP_WRITE1); /选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add); /写入指

10、定地址WriteCurrent(dat); /向当前地址(上面指定的地址)写入数据stop(); /停止数据传递delaynms(4); /1个字节的写入周期为1ms, 最好延时1ms以上/*函数功能:向第二个AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)*/void WriteSet2(unsigned char add, unsigned char dat)/ 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传递WriteCurrent(OP_WRITE2); /选择要操作的AT24Cxx芯片,并告知要对其

11、写入数据WriteCurrent(add); /写入指定地址WriteCurrent(dat); /向当前地址(上面指定的地址)写入数据stop(); /停止数据传递delaynms(4); /1个字节的写入周期为1ms, 最好延时1ms以上/*函数功能:从第一个AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent1()unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ1); /选择要操作的第一个AT24Cxx芯片,并告知要读其数据x=ReadData(); /将读取的数

12、据存入xstop(); /停止数据传递return x; /返回读取的数据传播优秀Word版文档 ,希望对您有帮助,可双击去除!传播优秀Word版文档 ,希望对您有帮助,可双击去除!/*函数功能:从第二个AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent2()unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ2); /选择要操作的第二个AT24Cxx芯片,并告知要读其数据x=ReadData(); /将读取的数据存入xstop(); /停止数据传递return x; /

13、返回读取的数据/*函数功能:从第一个AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x */unsigned char ReadSet1(unsigned char set_addr)/ 在指定地址读取start(); /开始数据传递WriteCurrent(OP_WRITE1); /选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); /写入指定地址return(ReadCurrent1(); /从第一个AT24Cxx芯片指定地址读出数据并返回/*函数功能:从第二个AT24Cxx中的指定地址读取数据入口参数:set_a

14、ddr出口参数:x */unsigned char ReadSet2(unsigned char set_addr)/ 在指定地址读取start(); /开始数据传递WriteCurrent(OP_WRITE2); /选择要操作的第二个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); /写入指定地址return(ReadCurrent2(); /从第二个AT24Cxx芯片指定地址读出数据并返回/*函数功能:主函数*/main(void) unsigned char x; SDA = 1; / SDA=1,SCL=1,使主从设备处于空闲状态SCL = 1;

15、WriteSet1(0x36,0xaa); /将数据0xaa写入第一个AT24C02的指定地址0x36x=ReadSet1(0x36); /从第二个AT24C02中的指定地址0x36读出数据 WriteSet2(0x48,x); /将读出的数据写入第二个AT24C02的指定地址0x48?P1=ReadSet2(0x48); /将从第二个AT24C02的指定地址读出的数据送P1口显示验证4、在proteus中新建仿真文件ex54.dsn,电路原理图如下所示5、将ex54.hex文件载入at89c51中,启动仿真,观察运行结果。下图是程序运行结果。传播优秀Word版文档 ,希望对您有帮助,可双击去除!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1