#include "reg51.h"
      #include "intrins.h"
      unsigned char SystemError;
      sbit SCL= P1^; //定义串行时钟线所在口 使用时根据自己的需要来定义
      sbit SDA= P1^; //定义串行数据线所在口 使用时根据自己的需要来定义
      #define SomeNOP(); {_nop_();_nop_();_nop_();_nop_();}
      /*--------------------------------------------------------------------------------
      调用方式:void AD7416_I2CStart(void) 2003/05/04
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CStart(void)
      {
      EA=";
      SDA="; SomeNOP();//数据线保持高,时钟线从高到低一次跳变,I2C通信开始
      SDA="; SomeNOP();
      SCL=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:void AD7416_I2CStop(void) 2003/05/04
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CStop(void)
      {
      SCL="; SomeNOP(); //数据线保持低,时钟线从低到高一次跳变,I2C通信停止
      SCL=";
      EA=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:I2CAck(void) 2003/05/13
      函数说明:私有函数,I2C专用,等待从器件接收方的应答
      ACK BY AD7416
      ---------------------------------------------------------------------------------*/
      WaitAck(void)
      {
      unsigned ";//因故障接收方无ACK,超时值为255。
      SDA=";
      SCL=";
      SystemError="0x10";
      while(SDA)
      { errtime--;
      if(!errtime)
      { AD7416_I2CStop();
      AD7416_SystemError=0x11; //出错后给全局变量赋值
      return;
      }
      }
      SCL=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:void SendAck(void) ﹫2003/05/13
      函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
      ---------------------------------------------------------------------------------*/
      void SendAck(void)
      {
      SDA="; SomeNOP(); //数据线保持低,时钟线发生一次从高低的跳变 发送一个应答信号
      SCL="; SomeNOP();
      SCL=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:void SendAck(void) ﹫2003/05/13
      函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
      --------------------------------------------------------------------------------*/
      void SendNotAck(void)
      {
      SDA="; SomeNOP(); //数据线保持高,时钟线发生一次从高低的跳变 没有应答
      SCL="; SomeNOP();
      SCL=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:void I2CSend(uchar ch) 2003/05/13
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      void I2CSendByte(Byte ch)
      {
      unsigned ";
      while (i--)
      {
      SCL=";_nop_();
      SDA=(bit)(ch&; SomeNOP(); //时钟保持低可以发送数据
      SCL="; SomeNOP();
      }
      SCL=";
      }
      /*--------------------------------------------------------------------------------
      调用方式:uchar I2CReceive(void) 2003/05/13
      函数说明:私有函数,I2C专用
      ---------------------------------------------------------------------------------*/
      Byte I2CReceiveByte(void)
      {
      unsigned ;
      SDA=";
      while (i--)
      {
      data<<=;
      SCL=";SomeNOP();
      SCL=";SomeNOP(); //时钟做一次从低到高的跳变 可以接收数据
      data|=SDA;
      }
      SCL=";
      return data;
      }

I2C串行总线标准驱动程序(C51)-万能程序的更多相关文章

  1. I2c串行总线组成及其工作原理

    采用串行总线技术可以使系统的硬件设计大大简化,系统的体积减小,可靠性提高,同时系统更容易更改和扩充 常用的串行扩展总线有:I2c总线,单总线,SPI总线,以及microwire.Plus等等 I2c总 ...

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

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

  3. 串行总线 —— I2C、UART、SPI

    I2C,也叫 IIC,是一种常见的串行总线,它只需要两根线即可在连接于总线上的器件之间传送信息. 0. 电气知识 开漏输出:Open drain output,不输出电压,低电平时接地,高电平时不接地 ...

  4. 【转载】IIC SPI UART串行总线

    一.SPISPI(Serial Peripheral Interface,串行外设接口)是Motorola公司提出的一种同步串行数据传输标准,在很多器件中被广泛应用. 接口SPI接口经常被称为4线串行 ...

  5. SPI、I2C、UART三种串行总线协议的区别

    第一个区别当然是名字: SPI(Serial Peripheral Interface:串行外设接口); I2C(INTER IC BUS) UART(Universal Asynchronous R ...

  6. 单片微机原理P4:80C51串口与串行总线拓展

    0. 串口通讯 0. 串口通讯的数据传输方式:单工(单向传输数据),半双工(非同时双向传输),全双工(同时,双向传输) 1. 根据通信方式的不同又分为同步通讯和异步通讯. 同步通讯:所有设备都使用同一 ...

  7. IIC串行总线的组成及其工作原理

    ------------------最近项目上用到了一款美信的DS1308RTC芯片,由于是挂在了Zynq的PS MIO上,需要软件人员协助才能测试:觉得太麻烦了,想通过飞线,然后在Vivado中调用 ...

  8. 痞子衡嵌入式:MCUBootUtility v3.5发布,支持串行NOR的ECC及双程序启动

    -- 痞子衡维护的 NXP-MCUBootUtility 工具距离上一个大版本(v3.4.0)发布过去半年了,这一次痞子衡为大家带来了版本升级 v3.5.0,这个版本主要有几个非常重要的更新需要跟大家 ...

  9. COM口,串行通讯端口,RS-232接口 基础知识

    COM口即串行通讯端口. COM口的接口标准规范和总线标准规范是RS-232,有时候也叫做RS-232口.电脑上的com口多为9针,最大速率115200bps.通常用于连接鼠标(串口)及通讯设备(如连 ...

随机推荐

  1. android的微信签名

    目标: 已经在微信官网申请了账号了,想要在上面开发应用,必须首先对应用进行审核.在审核之前,需要填写应用的相关信息,包括名称.图标.用途说明.签名等. 下面介绍如何获取程序的签名. 解决方案: 选择程 ...

  2. Flume Channel

    http://blog.csdn.net/john_f_lau/article/details/20913831 http://dev.cmcm.com/archives/194

  3. Windows 下 pip和easy_install 的安装与使用

    最简单的莫过于用vs 开发python 的程序,集成PTVS插件后,果然简单易用,调试也方便. 手工搭建的话: 官网:https://pypi.python.org/pypi/setuptools 主 ...

  4. [转载]Linux编程 sockaddr_in 和sockaddr和in_addr详解

    sockaddr sockaddr 是通用的socket地址,具体到Internet socket,用下面的结构,二者可以进行类型转换 sa_family是地址家族,一般都是"AF_xxx& ...

  5. 04747_Java语言程序设计(一)_第9章_输入和输出流

    例9.1一个文件复制应用程序,将某个文件的内容全部复制到另一个文件. import java.io.*; public class Example9_1 { public static void ma ...

  6. Android学习笔记__2__Android工程目录结构

    一.创建Android工程HelloWorld . src 文件夹里的是源文件 . Android2.2 是引用的类库,这些和 java 的都一样 . gen里面的类就是 ADT 自动生成的啦,一般只 ...

  7. Ajax 介绍

    Ajax的关键技术:  异步处理数据 使用XHTML(HTML)和CSS构建标准化的展示层 使用DOM(document object model)进行动态显示和交互 使用XML和XSLT进行数据交换 ...

  8. PC-CSS-分隔线

    单个标签实现分隔线: 点此查看实例展示 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: ...

  9. 百度之星B题(组合数)

    Problem B Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total ...

  10. C# Datatable导出Excel方法

    C# 导出Excel方法  先引用下System.IO;System.data; 具体函数如下: public static bool ExportCSV(DataTable dt, string f ...