📄 iic.h
字号:
//本头文件关于I2C总线的通信协议I0口模拟实现
#ifndef _IIC_H
#define _IIC_H
//信号引脚定义
sbit SDA=P1^5; // 将p1.0口模拟数据口
sbit SCL=P1^4; // 将p1.1口模拟时钟口
/******************************************************************************
函数:IIC_delay5us()
功能:模拟I2C总线延时
说明:请根据具体情况调整延时值
******************************************************************************/
void IIC_delay5us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/******************************************************************************
函数:DELAY20Ms()
功能:IIC总线STOP后有15-20MS的延时下一次才可以START。
******************************************************************************/
void Delay20Ms(void)
{
unsigned int TempCyc = 1500;
while(TempCyc--);
}
/*--------------------------------------------------------------------------------------------------
函数名称: IIC_start()
函数功能: 启动I2C总线子程序
函数说明:
SCL处于高电平期间,当SDA出现下降沿时启动I2C总线
本函数也用来产生重复起始条件
--------------------------------------------------------------------------------------------------*/
void IIC_Start(void)
{
SDA = 1; //时钟保持高,数据线从高到低一次跳变,I2C通信开始
IIC_delay5us();
SCL = 1;
IIC_delay5us();
SDA = 0;
IIC_delay5us();
SCL = 0;
IIC_delay5us();
}
/*--------------------------------------------------------------------------------------------------
函数名称: IIC_stop()
函数功能: 停止I2C总线数据传送子程序
函数说明: SCL处于高电平期间,当SDA出现上升沿时停止I2C总线
--------------------------------------------------------------------------------------------------*/
void IIC_Stop(void)
{
SCL = 1;
SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
IIC_delay5us();
SDA = 1;
IIC_delay5us();
//对于器件来说,在下一次产生Start之前,额外增加一定的延时是必须的
Delay20Ms();
}
/******************************************************************************
函数:Slave_Ack()
功能:读取从机应答位(应答或非应答),用于判断:从机是否成功接收主机数据
返回:
0:从机应答
1:从机非应答
说明:从机在收到每一个字节后都要产生应答位,主机如果收到非应答则应当终止传输
******************************************************************************/
bit Slave_Ack()
{
bit ack;
// unsigned char m;
SCL=0; //置SCL为低电平
SDA = 1; //释放SDA信号线。
IIC_delay5us(); //延时,从机的响应信号应该在这段时间出现。
SCL = 1; // 置SCL为高电平,准备判断SDA。
IIC_delay5us(); //延时。
ack = SDA; //读取响应信号。
SCL = 0; //置SCL为低电平。
SDA=0;
/* k++;
m=k+'0';
if(ack==1)
DisplayOneChar(1, 1, '0');
else
DisplayOneChar(1, 1, m);*/
return ack;
}
/******************************************************************************
函数:master_Ack()
功能:主机产生应答位(应答),用于通知从机:主机成功接收从机数据
参数:
ack=0:主机应答
说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答
******************************************************************************/
/*void master_Ack()
{
SDA = 0;
IIC_delay5us();
SCL = 1;
IIC_delay5us();
SCL = 0;
}*/
/******************************************************************************
函数:master_NAck()
功能:主机产生应答位(应答),用于通知从机:主机成功接收从机数据
参数:
ack=0:主机应答
说明:主机在收到每一个字节后都要产生应答,在收到最后一个字节后,应当产生非应答
******************************************************************************/
/*void master_NAck()
{
SDA = 1;
SCL = 0;
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}*/
//--------------------------------------------------------------------------------------------------
// 函数名称: IICSendByte
// 入口参数: ch
// 函数功能: 发送一个字节,也就是DATASHEET中所说的BYTE WRITE.利用此函数的有很多,像
// 写SLAVE ADDRESS,WORDADDRESS1,WORDADDRESS0
//--------------------------------------------------------------------------------------------------
void IICSendByte(unsigned char ch)
{
unsigned char n=8; // 向SDA上发送一位数据字节,共八位
while(n--)
{
if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
{
SCL=0;
SDA = 1; // 传送位1
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}
else
{
SCL=0;
SDA = 0; // 否则传送位0
IIC_delay5us();
SCL = 1;
IIC_delay5us();
}
ch = ch<<1; // 数据左移一位
}
SCL=0;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: IICreceiveByte
// 返回接收的数据
// 函数功能: 接收一字节子程序,利用此函数的有很多,像CURRENT ADDRESS READ,RADOM READ,SEQUENTIAL READ.
//--------------------------------------------------------------------------------------------------
unsigned char IICreceiveByte(void)
{
unsigned char n=8; // 从SDA线上读取一上数据字节,共八位
unsigned char tdata;
SDA=1;
while(n--)
{
SCL = 0;
IIC_delay5us();
SCL=1;
IIC_delay5us();
tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SDA=1;
}
return(tdata);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -