ImageVerifierCode 换一换
格式:DOCX , 页数:9 ,大小:144.35KB ,
资源ID:8471285      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8471285.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(I2C总线上接两个AT24C02读写实例.docx)为本站会员(b****6)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

I2C总线上接两个AT24C02读写实例.docx

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

2、作3、在keil c51中新建工程ex54,编写如下程序代码,编译并生成ex54.hex文件/对I2C总线上挂接多个AT24C02的读写操作#include / 包含51单片机寄存器定义的头文件#include /包含_nop_()函数定义的头文件#defineOP_READ10xa1/ 器件1地址以及读取操作,0xa1即为1010 0001B#defineOP_WRITE1 0xa0/ 器件1地址以及写入操作,0xa1即为1010 0000B#defineOP_READ20xaf/ 器件2地址以及读取操作,0xa1即为1010 1111B#defineOP_WRITE2 0xae/ 器件2地

3、址以及写入操作,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) unsigned char i;for(i=0;in;i+) de

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

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

6、x移入数据到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 (储存待写入的数据)*/在调用此数据写入函数前需首先调用开始函数start(),所以SCL=0bit WriteCurrent(uns

7、igned 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; /将y中的各二进位向左移一位SDA = 1; / 发送设备(主机)

8、应在时钟脉冲的高电平期间(SCL=1)释放SDA线, /以让SDA线转由接收设备(AT24Cxx)控制_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 SCL = 1; /根据上述规定,SCL应为高电平_nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 _nop_(); /等待一个机器周期 ack_bit = SDA; /接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节 /若送高电平,表示没有接收到,传送异常SCL = 0; /SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递

9、)return ack_bit;/ 返回AT24Cxx应答位/*函数功能:向第一个AT24Cxx中的指定地址写入数据入口参数:add (储存指定的地址);dat(储存待写入的数据)*/void WriteSet1(unsigned char add, unsigned char dat)/ 在指定地址addr处写入数据WriteCurrentstart(); /开始数据传递WriteCurrent(OP_WRITE1); /选择要操作的第一个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(add); /写入指定地址WriteCurrent(dat); /向当前地址(上面指定的

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

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

12、的数据/*函数功能:从第二个AT24Cxx中的当前地址读取数据出口参数:x (储存读出的数据) */unsigned char ReadCurrent2()unsigned char x;start(); /开始数据传递WriteCurrent(OP_READ2); /选择要操作的第二个AT24Cxx芯片,并告知要读其数据x=ReadData(); /将读取的数据存入xstop(); /停止数据传递return x; /返回读取的数据/*函数功能:从第一个AT24Cxx中的指定地址读取数据入口参数:set_addr出口参数:x */unsigned char ReadSet1(unsigned

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

14、Current(OP_WRITE2); /选择要操作的第二个AT24Cxx芯片,并告知要对其写入数据WriteCurrent(set_addr); /写入指定地址return(ReadCurrent2(); /从第二个AT24Cxx芯片指定地址读出数据并返回/*函数功能:主函数*/main(void) unsigned char x; SDA = 1; / SDA=1,SCL=1,使主从设备处于空闲状态SCL = 1; 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中,启动仿真,观察运行结果。下图是程序运行结果。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1