新闻中心

EEPW首页>嵌入式系统>设计应用> 51单片机I2C总线协议的实现

51单片机I2C总线协议的实现

作者: 时间:2016-11-27 来源:网络 收藏
//-----------------------函数声明,变量定义-------------------------------------------------------

#include

本文引用地址://m.amcfsurvey.com/article/201611/322567.htm

#include

sbit SDA=P1^0;// 将p1.0口模拟数据口

sbit SCL=P1^1;// 将p1.1口模拟时钟口

#define NUM 10 // 接收和发送缓存区的深度

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

unsignedcharidata sendbuf[NUM];// 数据发送缓冲区

unsignedcharidata receivebuf[NUM];// 数据接收缓冲区

bit bdata SystemError;// 从机错误标志位

//------------------------------------------------------------------------------------------------

// 函数名称: iic_start()

// 函数功能: 启动I2C总线子程序

//------------------------------------------------------------------------------------------------

voidiic_start(void)

{ EA=0;//时钟保持高,数据线从高到低一次跳变,I2C通信开始

SDA = 1;

SCL = 1;

delayNOP();// 延时5us

SDA = 0;

delayNOP();

SCL = 0;

}

//------------------------------------------------------------------------------------------------

// 函数名称: iic_stop()

// 函数功能: 停止I2C总线数据传送子程序

//------------------------------------------------------------------------------------------------

voidiic_stop(void)

{

SDA = 0;//时钟保持高,数据线从低到高一次跳变,I2C通信停止

SCL = 1;

delayNOP();

SDA = 1;

delayNOP();

SCL = 0;

}

//------------------------------------------------------------------------------------------------

// 函数名称: slave_ACK

// 函数功能: 从机发送应答位子程序

//------------------------------------------------------------------------------------------------

voidslave_ACK(void)

{

SDA = 0;

SCL = 1;

delayNOP();

SDA = 1;

SCL = 0;

}

//------------------------------------------------------------------------------------------------

// 函数名称: slave_NOACK

// 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束

//------------------------------------------------------------------------------------------------

voidslave_NOACK(void)

{

SDA = 1;

SCL = 1;

delayNOP();

SDA = 0;

SCL = 0;

}

//------------------------------------------------------------------------------------------------

// 函数名称: check_ACK

// 函数功能: 主机应答位检查子程序,迫使数据传输过程结束

//------------------------------------------------------------------------------------------------

voidcheck_ACK(void)

{

SDA = 1;// 将p1.0设置成输入,必须先向端口写1

SCL = 1;

F0 = 0;

if(SDA == 1)// 若SDA=1表明非应答,置位非应答标志F0

F0 = 1;

SCL = 0;

}


上一页 1 2 下一页

评论


技术专区

关闭