[C51代码]I2C总线协议程序

发布者:祝福的4号最新更新时间:2016-07-28 来源: eefocus关键字:C51代码  I2C总线协议 手机看文章 扫描二维码
随时随地手机看文章
/****************************************************************

       I2C总线协议程序

****************************************************************/

 

#define  NOP {_nop_();_nop_();_nop_();_nop_();} 

 

sbit SDA=P1^2;           /*模拟I2C数据传送位*/

sbit SCL=P1^3;           /*模拟I2C时钟控制位*/

bit ack;               /*应答标志位*/

  

void Start_I2c()

{

  SDA=1;  NOP;

  SCL=1;  NOP;  

  SDA=0;  NOP;       

  SCL=0;  NOP;

}

 

void Stop_I2c()

{

  SDA=0;  NOP; 

  SCL=1;  NOP;

  SDA=1;  NOP; 

}

 

void  Senduchar(uchar c)

{

  uchar i;

  for(i=0;i<8;i++)

  {

     c<<=1;

     SDA=CY; NOP;

     SCL=1;  NOP;         

     SCL=0;  NOP;

  }

   

  SDA=1;  NOP;    

  SCL=1;  NOP;  

  if(SDA==1) ack=0; 

  else ack=1;      

  SCL=0;  NOP;

}

 

uchar  Rcvuchar()

{

  uchar i,x=0;

  SDA=1;            

  for(i=0;i<8;i++)

  {

    SCL=0;  NOP;  

    SCL=1;  NOP;

    x=x<<1;

    if(SDA) x=x+1;

    NOP;

  }

  SCL=0;  NOP; 

  return(x);

}

 

void Ack_I2c(bit a)

{

 

  SDA=a; NOP;       

  SCL=1; NOP;  

  SCL=0; NOP;   

}

bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

 

   Start_I2c();               /*启动总线*/

   Senduchar(sla);            /*发送器件地址*/

   if(ack==0)return(0);

   Senduchar(suba);           /*发送器件子地址*/

   if(ack==0)return(0);

 

   for(i=0;i

   {  

     Senduchar(*s);           /*发送数据*/

     if(ack==0)return(0);

     s++;

   }

  Stop_I2c();                 /*结束总线*/

  return(1);

}

 

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no)

{

   uchar i;

 

   Start_I2c();               /*启动总线*/

   Senduchar(sla);            /*发送器件地址*/

   if(ack==0)return(0);

   Senduchar(suba);           /*发送器件子地址*/

   if(ack==0)return(0);

 

   Start_I2c();

   Senduchar(sla+1);

   if(ack==0)return(0);

 

   for(i=0;i

    {  

     *s=Rcvuchar();           /*发送数据*/

      Ack_I2c(0);             /*发送就答位*/ 

     s++;

    }

   *s=Rcvuchar();

   Ack_I2c(1);                /*发送非应位*/

   Stop_I2c();                /*结束总线*/

   return(1);

}

关键字:C51代码  I2C总线协议 引用地址:[C51代码]I2C总线协议程序

上一篇:[汇编学习笔记]MCS-51指令符号说明
下一篇:[C51代码]LCD12864驱动[待续][左右屏]

推荐阅读最新更新时间:2024-03-16 15:02

在Keil C51函数中加入ASM代码
使用C51进行单片机编程是事半功倍的事,但是很多算法上以及编译上的问题,往往使用ASM代码更为方便又高效。但不知什么原因,Keil在实现C51夹杂ASM代码比SDCC麻烦很多,方法如下: 预处理指令 #pragma asm 开始ASM代码 预处理指令 #pragma endasm 结束ASM代码 如果就这样直接编译的话,会出现以下错误: error C272: 'asm/endasm' requires src-control to be active 解决方法:在 Files Toolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assembl
[单片机]
关于I2C和SPI总线协议
IICvs SPI 现今,在低端数字通信应用领域,我们随处可见IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和Motorola(for SPI) 出于不同背景和市场需求制定了这两种标准通信协议。 IIC 开发于1982年,当时是为了给电视机内的CPU和外围芯片提供更简易的互联方式。电视机是最早的嵌入式系统之一,而最初的嵌入系统是使用内存映射(memory-mapped I/O)的方式来互联微控制器和外围设备的。要实现内存映射,设备必须并联
[单片机]
关于<font color='red'>I2C</font>和SPI<font color='red'>总线协议</font>
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved