基于 proteus 的 51 单片机仿真实例 53、单个 I2C 器
件 AT24C02 读写实例
1、I2C 总线器件只有两根信号线,一根是双向的数据/地址线 SDA,另一根是串行时钟总线
SCL,所有连到 I2C 总线上的设备的串行数据线都接到总显得 SDA 上,而设备的串行时钟线
都连接到总线的 SCL 上。
在实际使用中,由于 SDA 和 SCL 是漏极开路端口,所以两根总线必须接有 5-10K 的上拉电
阻。
2、I2C 总线的传输协议与数据传送
1)起始和停止条件
在数据传送过程中,必须确认数据传送的开始和结束。
开始和结束信号都是有主器件产生的,在开始信号后,总线被认为处于忙状态,其它器件不
能再产生开始信号。主器件在结束信号后退出主器件角色,经过一段时间,总线才被认为是
空闲的。
2)数据格式
在 I2C 总线开始信号后,送出的第一个字节数据是用来选择从器件地址的。其中前 7 位为
地址码,第 8 位为方向位,方向位为 0,表示写操作,记住器件把信息写到所选的从器件中,
方向位为 1,表示读操作,即主器件从从器件读信息。开始信号后,系统中的各个器件将自
己的地址和主器件送到总线上的地址进行比较,如果两者一直,则该器件为被主器件寻址的
器件。
I2C 总线的数据传输采用时钟脉冲逐位串行传送方式,在 SCL 低电平期间,SDA 上的数据允
许变化,SCL 高电平期间,SDA 上的数据必须保持稳定,不能发生变化,因为此时 SDA 状
态的改变已被用来表示起始和停止条件,以便接收器件的采样接收。
3)相应
I2C 总线协议规定,每传送一个字节数据(焊地址及命令字)后,都要有一个应答信号,以
确定数据传送是否正确,应答位的时钟脉冲由主机产生,发送器件需在应答时钟脉冲的高电
平期间释放(送高电平)数据/地址线 SDA,转由接收器件控制,通常接收器件在这个时钟
脉冲内必须向 SDA 传送低电平,以产生有效的应答信号。此时,主机残生一个停止信号,
表示接受异常,使传送异常结束。
当主机为接收器件时,主机对最后一个季节不应答,以向发送器件表示数据传送结束。此时
器件应释放 SDA,以便主机产生一个停止信号。
3、本例利用单片机将数据“0x0f"写入 AT24C02,然后将其读出并送 P1 口的 8 位 LED 显示。
4、在 keil c51 中新建工程 ex53,编写如下程序代码,编译并生成 ex53.hex 文件
//将数据"0x0f"写入 AT24C02 再读出送 P1 口显示
#include <reg51.h> // 包含 51 单片机寄存器定义的头文件
#include <intrins.h> //包含_nop_()函数定义的头文件
#define OP_READ 0xa1 // 器件地址以及读取操作,0xa1 即为 1010 0001B
#define OP_WRITE 0xa0 // 器件地址以及写入操作,0xa1 即为 1010 0000B
sbit SDA=P3^4; //将串行数据总线 SDA 位定义在为 P3.4 引脚
sbit SCL=P3^3; //将串行时钟总线 SDA 位定义在为 P3.3 引脚