IIC通信是一种同步通信方式,同步通信是采用一个同步时钟线,连到收发双方,使收发双方达到完全同步。则IIC通信硬件连接就有四根线VCC、GND、SDA、SCL,SDA是传送数据的,SCL是控制时序的,IIC它是有规矩的,用到这种通信方式,就得按照它的规矩来做,它才会听话,才能完成通信,也称为IIC通信协议。

IIC通信协议:

IIC通信时,需要用到开始信号、停止信号、等待响应信号、发送字节信号、读取字节信号;

开始信号的条件:当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件;

结束信号的条件:当SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件;

在设置这些高低电平时,可以在代码中直接设置,这个也叫软件(代码)模拟IIC通信;

IIC通信的起始信号和结束信号:

当 SCL 线为高电平时,SDA 线由高到低的下降沿,为传输开始标志(S)。直到主设备 发出结束信号(P),否则总线状态一直为忙。结束标志(P)规定为,当 SCL 线为高电平 时,SDA 线由低到高的上升沿

IIC通信的应答信号:

IIC 的数据字节定义为 8-bits 长度,对每次传送的总字节数量没有限制。对每一次传输 必须伴有一个应答(ACK)信号,其时钟由主设备提供,而真正的应答信号由从设备发出, 在时钟为高时,通过拉低并保持 SDA 的值来实现。

如果从设备忙,它可以使 SCL 保持在低电平,这会强制使主设备进入等待状态。当从 设备空闲后,并且释放时钟线,原来的数据传输才会继续。

IIC通信的接收数据信号和发送数据信号:

开始标志(S)发出后,主设备会传送一个 7 位的 Slave 地址,并且后面跟着一个第 8 位,称为 Read/Write 位。R/W 位表示主设备是在接受从设备的数据还是在向其写数据。然 后,主设备释放 SDA 线,等待从设备的应答信号(ACK)。每个字节的传输都要跟随有一 个应答位。应答产生时,从设备将 SDA 线拉低并且在 SCL 为高电平时保持低。数据传输总 是以停止标志(P)结束,然后释放通信线路。然而,主设备也可以产生重复的开始信号去 操作另一台从设备,而不发出结束标志。综上可知,所有的 SDA 信号变化都要在 SCL 时钟 为低电平时进行,除了开始和结束标志。

 响应信号、发送字节信号,接收字节信号,我都会在代码中实现出来;

此文章并没有实现任何的功能,只是把IIC底层驱动实现出来,你们用到IIC,完全可以把驱动利用起来,下篇文章,我教大家利用IIC实现和OLED屏幕的通信。

废话不多说,直接上图:

IIC点C文件:

#include "iic.h"//总线引脚定义
sbit SDA = P2^1;  /* 数据线 */
sbit SCL = P2^0;  /* 时钟线 */
//延迟函数
void IIC_Delay(unsigned char i)//延时一段时间
{while(i--){_nop_();_nop_();}
}
//开始信号
void IIC_Start(void)
{SDA = 1;SCL = 1;//当SCL为高电平的时候,SDA线上由高到低的跳变被定义为起始条件IIC_Delay(5);SDA = 0;IIC_Delay(5);SCL = 0;
}//停止信号
void IIC_Stop(void)
{SDA = 0;SCL = 1;//SCL为高电平的时候,SDA线上由低到高的跳变被定义为停止条件;IIC_Delay(5);SDA = 1;IIC_Delay(5);
}//等待应答信号(作用很大)
bit IIC_WaitAck(void)
{bit ackbit;SCL  = 1;IIC_Delay(5);ackbit = SDA;SCL = 0;IIC_Delay(5);return ackbit;
}//通过I2C总线发送数据
void IIC_SendByte(unsigned char byt)
{unsigned char i;for(i=0; i<8; i++){SCL  = 0;IIC_Delay(5);if(byt & 0x80) SDA  = 1;else SDA  = 0;IIC_Delay(5);SCL = 1;byt <<= 1;IIC_Delay(5);}SCL  = 0;
}//从I2C总线上接收数据
unsigned char IIC_RecByte(void)
{unsigned char i, da;for(i=0; i<8; i++){   SCL = 1;IIC_Delay(5);da <<= 1;if(SDA) da |= 1;SCL = 0;IIC_Delay(5);}return da;
}

头文件

#ifndef _IIC_H
#define _IIC_H#include "main.h"void IIC_Start(void);
bit IIC_WaitAck(void);
void IIC_SendAck(bit ackbit);
void IIC_SendByte(unsigned char byt);
unsigned char IIC_RecByte(void); #endif

51单片机常用通信方式之IIC通信(二)相关推荐

  1. 51单片机常用寄存器速查

    51单片机常用寄存器速查表 一 : 定时器 / 计数器方式选择 : TMOD 地址 (89H) 不可位寻址 D7 D6 D5 D4 D3 D2 D1 D0 GATE C/T M1 M0 GATE C/ ...

  2. 最简单DIY基于51单片机、PCA9685、IIC、云台的舵机集群控制程序

    51单片机物联网智能小车系列文章目录 第一篇:最简单DIY的51蓝牙遥控小车设计方案 第二篇:最简单DIY串口蓝牙硬件实现方案 第三篇:最简单DIY蓝牙PS2遥控器控制蓝牙智能小车 第四篇:最简单DI ...

  3. 利用51单片机+0.96寸iic接口oled显示图片或动图

    利用51单片机+0.96寸iic接口oled显示图片或动图 前言:之前讲过如何使用oled显示数字以及字符,但并未讲述如何显示BMP格式的图片, 这篇将在之前的基础上加以封装一些函数用来显示图片 硬件 ...

  4. 51单片机常用波特率初值表(11.0592M和12M)

    51单片机常用波特率初值表(11.0592M和12M)

  5. 详细介绍如何从零开始制作51单片机控制的智能小车(二)———超声波模块、漫反射光电管、4路红外传感器的介绍和使用

       我会通过本系列文章,详细介绍如何从零开始用51单片机去实现智能小车的控制,在本系列的上一篇文章中介绍了如何让小车动起来,本文作为本系列的第二篇文章,主要介绍让小车实现自动避障所涉及的一些传感器, ...

  6. 51单片机学习--定时器--中断--串口通信

    51单片机学习–定时器–中断–串口通信 定时器–中断–串口通信 中断分类 定时器中断 外部中断 串口中断 基本概念 对于单片机来讲, 中断是指 CPU 在处理某一事件 A 时, 发生了另一事件 B, ...

  7. 51单片机常用功能及相关内容

    一.基本概念: 1.引脚 图1.1 这里只介绍常用及主要的引脚. I/O口引脚:P0.P1.P2.P3 P0口:39脚~32脚,双向8位三态I/O口,每个口可独立控制,但内部无上拉电阻,为高阻态,故不 ...

  8. 【自学51单片机】11 -- UART串口通信

    文章目录 1.串行通信的初步认识 2.USB转串口通信 3.UART串口通信的基本应用 3.1 通信的三种基本类型 3.2 UARM模块介绍 3.3编写UART串口步骤及程序 4.串口调试助手 5.通 ...

  9. 51单片机学习笔记-6串口通信

    6 串口通信 [toc] 注:笔记主要参考B站江科大自化协教学视频"51单片机入门教程-2020版 程序全程纯手打 从零开始入门". 注:工程及代码文件放在了本人的Github仓库 ...

最新文章

  1. 一文读懂Data Lake的概念、特征、架构与案例
  2. 001_公司网站首页遇到的问题
  3. [云炬创业基础笔记]第五章创业机会评估测试1
  4. python 多线程 模块_Python多线程threading和multiprocessing模块实例解析
  5. boost::mpl::integral_c用法的测试程序
  6. Linux的基础命令小总结(二)
  7. 什么是数据光端机?数据光端机的作用有哪些?
  8. 1052 卖个萌 (20 分)
  9. php怎么循环输出二维数组,PHP中遍历二维数组—以不同形式的输出操作
  10. 安装 Alibaba Cloud Toolkit
  11. 95-35-010-Topic-Topic的新建 源码解析
  12. Oracle SQL自带函数整理
  13. 大组合数:Lucas定理
  14. html转换为pdf的笔顺,笔顺正确写法,很全面.pdf
  15. Pycharm, 生成可执行文件,Unhandled exception in script报错
  16. 三元运算 微信小程序_微信小程序使用三元运算符代替wx:if
  17. 对炒股的一点个人浅见
  18. Linux 的父进程和子进程的执行情况(附有案例代码)
  19. Macbook Pro开机黑屏如何自查问题
  20. xposed框架的检测和反制

热门文章

  1. 生产力、商业价值和敏捷
  2. 怎样防止文件在停电时丢失
  3. pyinstaller打包软件失败的真正原因
  4. 列表推导式-list comprehension
  5. 重点人口动态管控轨迹分析系统开发,可视化大数据平台建设
  6. 使用scrapy创建一个项目爬取网易云音乐的所有歌手的相关资料
  7. jquery下载图片
  8. 微信小程序调用科大讯飞 在线合成语音接口(文字转语音)
  9. python时区、时差、时间差转换——datetime.timedelta类介绍
  10. 咏春拳谱之小念头(套路详解)