iic标准代码(真正的万能代码1161)
扫描二维码
随时随地手机看文章
/****************************************************************************/
/****************************************************************************/
/* MCS-51单片机模拟I2C软件包(V1.0)*/
/* 文件名:VI2C_C51.C */
/* 版 本:Version 1.0 */
/* 描 述:iic标准代码 */
/* 作 者:马志明 */
/* 函 数: */
/* iic_wait */
/* iic_start */
/* iic_stop */
/* iic_ack */
/* iic_no_ack */
/* iic_wait_ack */
/* iic_send_byte */
/* iic_receive_byte */
/* 功能说明:本模拟I2C软件包包含了I2C操作的底层函数,如发送数据及接收*/
/*数据,应答位发送,并提供了几个直接面对器件的操作函数,它很方便的与用户程*/
/*序连接并扩展..... */
/* 注意:函数是采用软件延时的方法产生SCL脉冲,固对高晶振频率要作 一定的*/
/*修改....(本软件包是1us机器周期,即晶振频率要小于12MHZ)*/
/* 总线时序符合I2C标准模式,100Kbit/S。 */ */
/* 历史记录: */
/* 马志明 2008-01-18 Creat Inital version. (Version 1.0) */
/****************************************************************************/
/****************************************************************************/
#include
#include
#include
typedef unsigned char u_char;
typedef unsigned int u_int;
sbit SDA = P0^5; /* iic数据传送位 定义数据串行线所在口 使用时根据自己的需要来定义*/
sbit SCL = P0^4; /* iic时钟控制位 定义串行时钟线所在口 使用时根据自己的需要来定义*/
/* 函数声明 */
void iic_wait(void); /* iic延时 */
void iic_start(void); /* 开启iic总线 */
void iic_stop(void); /* 关闭iic总线 */
void iic_ack(void); /* 发送ACK信号 */
void iic_no_ack(void); /* 发送NOACK信号 */
bit iic_wait_ack(void); /* 等待ACK信号 */
void iic_send_byte(u_char demand); /* MCU向iic设备发送一个字节 */
u_char iic_receive_byte(void); /* MCU从iic设备接收一个字节 */
/* 声明结束 */
/* iic延时 */
void iic_wait(void)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************************************************************
起动总线函数
函数原型: void iic_start(void);
功能: 启动I2C总线,即发送I2C起始条件.
********************************************************************/
/* 开启iic总线 */
void iic_start(void)
{
SDA = 1; //发送起始条件的数据信号
SCL = 1;
iic_wait(); //起始条件建立时间大于4.7us,延时,数据线保持高,时钟线从高到低一次跳变,IIC开始通信
SDA = 0; //发送起始信号
iic_wait(); //起始条件锁定时间大于4μs
SCL = 0; //钳住I2C总线,准备发送或接收数据
}
/*******************************************************************
结束总线函数
函数原型: void iic_stop(void);
功能: 结束I2C总线,即发送I2C结束条件.
********************************************************************/
/* 关闭iic总线 */
void iic_stop(void)
{
SDA=0; //发送结束条件的数据信号
SCL=0;
iic_wait();
SCL=1; //数据线保持低,时钟线从低到高一次跳变,IIC通信停止
iic_wait(); //结束条件建立时间大于4μs
SDA=1; //发送I2C总线结束信号
}
/********************************************************************
应答子函数
函数原型: void iic_ack(void);
功能: 主控器进行应答信号
********************************************************************/
/* 发送ACK信号 */
void iic_ack(void)
{
SDA=0;//在此发出应答信号
iic_wait(); //数据线保持低,时钟线发生一次从高到低的跳变,发送一个应答信号
SCL=1;
iic_wait();//时钟低电平周期大于4μs
SCL=0;//清时钟线,钳住I2C总线以便继续接收
}
/********************************************************************
非应答子函数
函数原型: void iic_ack(void);
功能: 主控器进行非应答信号
********************************************************************/