嵌入式单片机基础篇(三十二)之I2C通信以及51单片机程序

本文介绍了I2C通信的基本原理和51单片机的实现细节,包括起始信号、数据传输、应答信号、停止信号的程序编写,以及51单片机与AT24C02通讯的步骤和电路图。
摘要由CSDN通过智能技术生成

I2C通信以及51单片机程序

I2C总线是PHLIPS公司推出的一种双向串行总线,只有两根双向信号线。一根是数据/地址线SDA,另一根是时钟线SCL,半双工。
这两根信号线上挂载着主机与从机,一般来说,谁控制SCL信号线,谁就是主机。
1、空闲状态: 两根总线接上拉电阻,且都为高电平时,说明两根总线为空闲状态。
2、8位数据传输:
在这里插入图片描述
规则: I2C总线进行数据传送时,SCL为高电平期间,SDA上的数据必须保持稳定,只有在SCL上的信号为低电平期间,SDA上的高电平或低电平状态才允许变化。
就看这张图,下面一边介绍原理一边写程序:
(1)起始信号,既然是两根信号线来传输数据,那么就需要协议,也就是I2C协议,此协议包括起始信号,如上图所示,当SCL为高电平时,SDA由高电平变为低电平时,表示可以传输数据了,也就是所谓的起始信号
那么程序怎么写?很简单,基于51单片机的起始信号程序如下:

void startiic()
{
   

SDA=1;
delay();
delay();
SCL=1;//初始状态数据线与时钟线为高电平
delay();
SDA=0;//在时钟线为高电平的情况下拉低数据线表示起始信号
delay();
SCL=0;//起始信号完成后需要传输数据,所以拉低时钟线允许数据变化
delay();

}

注意:开始信号结束后,SCL信号线为低电平
(2)有了起始信号,接着就可以传输数据了,需要注意的是,数据传输从高位开始到低位传输结束,一共8位数据,开始信号结束后,SCL信号线为低电平,那么传输数据里的读数据程序第一步就要将SCL电平拉高,保持数据信号线上的数据可读,且读8位
51单片机的读8位数据程序如下:

unsigned char readbit8()
{
   
unsigned char i;
unsigned char dat=0;//定义一个8位数来存储读出的数据
for(i=0;i<8;i++)
{
   
SCL=1;//时钟线为高电平时因数据保持不变才可读数据
dat<<=1;
dat|=(unsigned char)SDA;//数据从高位开始读出,并保存在dat中
SCL=0;//时钟线为低电平时才允许数据变化传入
delay();
}
return(dat);

}

注意:8位的数据传输完毕后,SCL的电平状态为低电平
我们再来看一下写数据程序应该如何写,首先数据信号线要改变电平状态,SCL的电平要为低电平,所以写数据的程序第一步就是SCL的电平状态要先拉低,当我们的起始信号开始后,SCL的电平信号正好为低,那么只需写一句SDA=(bit)(dat&0x80);就把dat变量的最高位传递给SDA了,接下来将SCL拉高保持数据稳定,再拉低使数据可以改变,从而在稳定状态时实现传输
51单片机的写8位数据的程序如下:

void writebit8(unsigned char dat)
{
   

unsigned char i;
for(i=0;i<8;i++)
{
   


SDA=(bit)(dat&0x80);
delay();
SCL=1;	
dat<<=1;
delay();
SCL=0
  • 6
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值