I2C_C51.rar

  • PUDN用户
    了解作者
  • C++
    开发工具
  • 8KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 4
    下载次数
  • 2010-05-06 09:27
    上传日期
字节方式I2C_C51 可以用这个程序实现字节方式iic的模拟
I2C_C51.rar
  • 字节方式I2C_C51
  • C51
  • 668si2c.h
    1.5KB
  • 668SI2C.LIB
    1.6KB
  • 668SI2C.C
    1.3KB
  • REG552.H
    3.4KB
  • 668i2c.c
    5.6KB
  • 668I2C.h
    2.8KB
  • 668I2C.LIB
    3KB
内容介绍
/******************************************************************* P89C668单片机硬件I2C软件包,668i2c.c(主方式) 668的硬件I2C接口定义在P1.6,P1.7上,分别为P1.6=SCL;P1.7=SDA;(开漏输出) 相应寄存器:地址寄存器 S1ADR 用于存放自身从地址(从方式时才有用) 数据寄存器 S1DAT 接收/发送数据用 控制寄存器 S1CON 用于硬件I2C的设置、使能、启动、结束, 应答控制,中断标志等。 状态寄存器 S1STA 指示I2C总线的操作状态码,高5位有效, 若I2C中断志置位,可查询此寄存器判断 总线情况。 此软件包是以查询方式完成各种总线操作的,在使用前应对总线进行检查,并 使用看门狗,以防等待总线而造成死机。 2001-09-21 *******************************************************************/ #include "REG552.h" /*668的硬件I2C定义与552的一样*/ #define uchar unsigned char /******************************************************************* 申请总线 功能:进行I2C总线的初始化--包括时钟速率,I2C使能,发送起始信号等 等。 *******************************************************************/ void GetBus() { S1CON=0xc5; /*设置时钟为100K(MCU主频为12M),ENS1和AA置位*/ STA=1; /*申请成为主机,起动总线*/ while(SI==0); /*等待起始位的发送*/ } /******************************************************************* 发送数据函数 功能:用于向总线发送数据 *******************************************************************/ void SendByte(uchar c) { S1DAT=c; S1CON=0XC5; /*清除SI位等等*/ while(SI==0); /*等待数据的发送*/ } /******************************************************************* 向无子地址器件发送字节数据函数 函数原型: bit ISendByte(uchar sla,ucahr c); 功能: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla, 待发送的数据c,如果返回1表示操作成功,否则操作有误。 ********************************************************************/ bit ISendByte(uchar sla,uchar c) { GetBus(); /*启动总线*/ SendByte(sla); /*发送器件地址,若无应答则返回*/ if(S1STA!=0X18){S1CON=0XD5;return(0);} SendByte(c); /*发送数据*/ if(S1STA!=0X28){S1CON=0XD5;return(0);} S1CON=0XD5; /*结束总线*/ return(1); } /******************************************************************* 向有子地址器件发送多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 如果返回1表示操作成功,否则操作有误。 ********************************************************************/ bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; GetBus(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(S1STA!=0X18){S1CON=0XD5;return(0);} SendByte(suba); /*发送器件子地址*/ if(S1STA!=0X28){S1CON=0XD5;return(0);} for(i=0;i<no;i++) { SendByte(*s); /*发送数据*/ if(S1STA!=0X28){S1CON=0XD5;return(0);} s++; } S1CON=0XD5; /*结束总线*/ return(1); } /******************************************************************* 向无子地址器件读字节数据函数 函数原型: bit IRcvByte(uchar sla,ucahr *c); 功能: 从启动总线到发送地址,读数据,结束总线的全过程,从器件地 址sla,返回值在c. 如果返回1表示操作成功,否则操作有误。 ********************************************************************/ bit IRcvByte(uchar sla,uchar *c) { GetBus(); /*启动总线*/ SendByte(sla+1); /*发送器件地址*/ if(S1STA!=0X40){S1CON=0XD5;return(0);} S1CON=0XC1; /*接收一字节数据即发送非应答位*/ while(SI==0); /*等待接收数据*/ if(S1STA!=0X58){S1CON=0XD5;return(0);} *c=S1DAT; /*读取数据*/ S1CON=0XD5; /*结束总线*/ return(1); } /******************************************************************* 向有子地址器件读取多字节数据函数 函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); 功能: 从启动总线到发送地址,子地址,读数据,结束总线的全过程,从器件 地址sla,子地址suba,读出的内容放入s指向的存储区,读no个字节。 如果返回1表示操作成功,否则操作有误。 ********************************************************************/ bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no) { uchar i; GetBus(); /*启动总线*/ SendByte(sla); /*发送器件地址*/ if(S1STA!=0X18){S1CON=0XD5;return(0);} SendByte(suba); /*发送器件子地址*/ if(S1STA!=0X28){S1CON=0XD5;return(0);} S1CON=0XE5; /*重新启动总线*/ while(SI==0); SendByte(sla+1); if(S1STA!=0X40){S1CON=0XD5;return(0);} for(i=0;i<no-1;i++) { S1CON=0XC5; /*接收一字节数据并发送应答位*/ while(SI==0); /*等待接收数据*/ if(S1STA!=0X50){S1CON=0XD5;return(0);} *s=S1DAT; /*读取数据*/ s++; } S1CON=0XC1; /*接收最后一字节数据并发送非应答位*/ while(SI==0); *s=S1DAT; S1CON=0XD5; /*结束总线*/ return(1); } /*软件包大小:326字节*/
评论
    相关推荐