为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形:

如下图所示的写操作的时序图:

读时序的理解同理。对于时序不理解的朋友请参考“I2C总线之(二)---时序”

完整的程序如下:

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define write_ADD 0xa0
#define read_ADD 0xa1
uchar a;
sbit SDA=P2^0;
sbit SCL=P2^1;
void SomeNop();     //短延时
void init();    //初始化
void check_ACK(void);
void I2CStart(void);
void I2cStop(void);
void write_byte(uchar dat);//写字节
void delay(uint z);
uchar read_byte();     //读字节
void write(uchar addr,uchar dat);  //指定地址写
uchar read(uchar addr);       //指定地址读
bit flag;  //应答标志位
void main()
{init();write_add(5,0xaa); //向地址5写入0xaadelay(10);      //延时,否则被坑呀!!!P1=read_add(5);      //读取地址5的值while(1);
}//***************************************************************************
void delay()//简单延时函数
{ ;; }
//***************************************************************************
void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号
{     sda=1; //释放SDA总线
    delay();  scl=1;  delay();  sda=0;  delay();
}
//***************************************************************************
void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号
{  sda=0;  delay();  scl=1;  delay();  sda=1;  delay();
}
//***************************************************************************
void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答
{  uchar i;  scl=1;  delay(); //至多等待250个CPU时钟周期 while((sda==1)&&(i<250))i++;  scl=0;  delay();
}
//***************************************************************************
void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号
{  sda=1;  delay();  scl=1;  delay();
}
//***************************************************************************
void write_byte(uchar date) //写一个字节
{  uchar i,temp;  temp=date;  for(i=0;i<8;i++)  {  temp=temp<<1;  scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿
        delay();  sda=CY;  delay();  scl=1;//拉高SCL,此时SDA上的数据稳定
        delay();  }  scl=0;//拉低SCL,为下次数据传输做好准备
    delay();  sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号
    delay();
}
//***************************************************************************
uchar read_byte()//读一个字节
{  uchar i,k;  scl=0;  delay();  sda=1;  delay();  for(i=0;i<8;i++)  {  scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦
        delay();      k=(k<<1)|sda;  scl=0;//拉低SCL,使发送端可以把数据放在SDA上
        delay();      }  return k;
}
//***************************************************************************
void write_add(uchar address,uchar date)//任意地址写一个字节
{  start();//启动  write_byte(0xa0);//发送从设备地址  respons();//等待从设备的响应  write_byte(address);//发出芯片内地址  respons();//等待从设备的响应  write_byte(date);//发送数据  respons();//等待从设备的响应  stop();//停止
}
//***************************************************************************
uchar read_add(uchar address)//读取一个字节
{  uchar date;  start();//启动  write_byte(0xa0);//发送发送从设备地址 写操作  respons();//等待从设备的响应  write_byte(address);//发送芯片内地址  respons();//等待从设备的响应  start();//启动  write_byte(0xa1);//发送发送从设备地址 读操作  respons();//等待从设备的响应  date=read_byte();//获取数据  stop();//停止  return date;//返回数据
}

I2C总线之(三)---以C语言理解IIC相关推荐

  1. I2C总线时序模拟(二)-加深理解总线协议

    /******************************************************************** 此程序是I2C操作平台(主方式的软件平台)的底层的C子程序, ...

  2. I2C总线式驱动开发

    文章目录 前言 一.Linux内核对I2C总线的支持 1.1.理解I2C设备驱动.I2C总线驱动以及I2C核心之间的关系 1.2.i2c二级外设驱动开发涉及到核心结构体及其相关接口函数: 二.I2C总 ...

  3. SPI、I2C、UART 三种串行总线对比介绍

    转载自https://blog.csdn.net/oqqHuTu12345678/article/details/65445338 参考博客 https://blog.csdn.net/xiaodin ...

  4. SPI、I2C、UART三种串行总线协议的区别和SPI接口介绍(转)

    SPI.I2C.UART三种串行总线协议的区别 第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART( ...

  5. 以C语言的方式理解IIC总线

    为了加深对I2C总线的理解,用C语言模拟IIC总线,边看源代码边读波形: 如下图所示的写操作的时序图: 读时序的理解同理.对于时序不理解的朋友请参考"I2C总线之(二)-时序" 完 ...

  6. SPI、I2C、UART三种串行总线的原理、区别及应用

    SPI协议解析,链接如下 https://blog.csdn.net/weiqifa0/article/details/82765892 I2C协议解析,链接如下 https://blog.csdn. ...

  7. 对I2C总线的时钟同步和总线仲裁的深入理解

    对I2C总线的时钟同步和总线仲裁的深入理解 每一个IIC总线器件内部的SDA.SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起.其中输出为漏极开路的场效应管.输入缓冲为一只高输入阻抗的同 ...

  8. 单总线和i2c总线结合实现数字温度计的设计c语言程序,1《单片机原理应用》课程设计指导书2010-6-8.doc...

    1<单片机原理应用>课程设计指导书2010-6-8 <单片机原理与应用>课程设计指导书 一.课程设计的基本任务 本课程设计的基本要求是使学生熟悉掌握MCS-51系列单片机的编程 ...

  9. 对I2C总线时序的一点理解以及ACK和NACK(NAK)

    http://www.cnblogs.com/zym0805/archive/2011/07/31/2122890.html I2C是由Philips公司发明的一种串行数据通信协议,仅使用两根信号线: ...

最新文章

  1. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(五)分水岭算法(watershed algorithm)
  2. 【数理逻辑】谓词逻辑 ( 个体词 | 个体域 | 谓词 | 全称量词 | 存在量词 | 谓词公式 | 习题 )
  3. 将decimal类型的数据转成2.12这样价钱的显示方式
  4. Mybatis的核心——SqlSession解读
  5. 使用while和FOR循环分布打印字符串S='asdfer' 中的每一个元素
  6. php 非递归调用,php 无限分类(非递归)
  7. windows c++ 原子操作_高分辨质谱数据处理操作篇
  8. link标签中的integrity和crossorigin字段---web前端工作笔记015
  9. AspNet MVC2 学习笔记
  10. 小精灵股市行情软件办公室专用绿色版.rar
  11. window7 32位部署django
  12. python名词解释题库_Python题库
  13. 计算机如何操作补考,关于计算机Excel补考试题
  14. 用 XHR + curl.exe 制作 ddns 客户端札记
  15. OCR-光学符号识别
  16. SAP ABAP ALV控制显示的网格中的每一个字段属性
  17. 我的世界服务器物品属性,[娱乐|机械]Item Lore Stats —— 自定义你的物品属性[自带强化][1.10及以上]...
  18. 云时代下,传统和新型存储的博弈已经开始
  19. 帮上百家客户完成数字化转型后,SAS开出了四剂药方应对变革焦虑
  20. idea导入项目及导入项目后无目录解决

热门文章

  1. 算法(伪代码)的书写
  2. 批处理系统和分时系统各具有什么特点?为什么分时系统的响应比较快?
  3. Retina时代的前端视觉优化
  4. Tapable.plugin is deprecated. Use new API on `.hooks` instead
  5. iOS运行时-使用Runtime向Category中添加属性以及运行时介绍
  6. 19_03_26校内训练[魔法卡片]
  7. HTTP协议详解(转载)
  8. unity 中的UGUI 屏蔽鼠标穿透
  9. leetcode jump game ii
  10. 夺命雷公狗---微信开发39----微信语言识别接口1