⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 iic.h

📁 主要实现对时钟芯片isl12029的功能。 isl12029是intersil公司的一款RTC
💻 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 + -