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

📄 i2c.c

📁 此程序用于恒温箱控制
💻 C
字号:
 
#include "main.h"
#include "i2c.h"
void i2c_writ2(uchar bat );
uchar i2c_rea2(bit ack) ;
void i2c_start(void);
void delay_5us();
//#define ADDR  0x50


void i2c_start()
{ 
	SCL=1;delay_5us();
	SDA=1;delay_5us();
	SDA=0;delay_5us();
	SCL=0;delay_5us();
}
void i2c_stop()
{
	SCL=0;//wu
	SDA=0;delay_5us();
	SCL=1;delay_5us();
	SDA=1;delay_5us();

  
}
/**--------------------------------------------------------------------------------
 调用方式:bit I2CAck(void) ﹫200 /07/0 4
 函数说明:私有函数,I2C用,等待从器件接收方的应答
 ---------------------------------------------------------------------------------*/
 
 /**--------------------------------------------------------------------------------
 调用方式:void SendAck(void) ﹫200 /07/0 4
 函数说明:私有函数,I2C用,主器件为接收方,从器件为发送方时,非应答信号。
 --------------------------------------------------------------------------------*/
  

//------------------------------------------------
 
 
 /*
 要求温度的数据为*100/25的整数;或为*4的整数 例如10度,输入的数据为40
*/
/*void write_7416T (uchar adr1,uchar adr2,uint dat)//adr1 is 0x02 or 0x00; 
  {     
  	dat=dat<<6;                                     // when adr2 is 0x02  express TL ,0x03 express TO (over temp)
  	i2c_start();
  	i2c_writ2(0x90|adr1);
  	i2c_writ2(adr2);
  	i2c_writ2((uchar)(dat>>8) );
  	i2c_writ2((uchar)dat);
  	i2c_stop();
	delay(5);//20
  } */
void write_7416C(uchar adr1)  //adr1 is 0x02 or 0x00; 
  {                              
  	i2c_start();           
  	i2c_writ2(0x90|adr1);
  	i2c_writ2(0x01); 
  	i2c_writ2(0x10);      //2 fault  OTI level is low  ,比较模式在高出高位值后发生低跳变,低于低设定值后恢复高
  	i2c_stop();
	delay(5); 
  }	
 
uint read_7416(uchar adr1)  //adr is 0x02  or 0x00;
 {  
      uchar i;
      uint j;
       i2c_start();
      i2c_writ2(0x90|adr1);
      i2c_writ2(0x00); 
      i2c_stop();
      i2c_start();
       i2c_writ2(0x91|adr1);
       j=i2c_rea2(1);
       i=i2c_rea2(1);
       i2c_stop();
        j=j<<8;
       j=j+i;
       return j>>6;
       
      
  }
 /*uint read_74161(uchar adr1)  //adr is 0x02  or 0x00;
 {  
      uchar i;
      uint j;
       i2c_start();
      i2c_writ2(0x90|adr1);
      i2c_writ2(0x02); 
      i2c_stop();
      i2c_start();
       i2c_writ2(0x91|adr1);
       j=i2c_rea2(1);
       i=i2c_rea2(1);
       i2c_stop();
        j=j<<8;
       j=j+i;
       return j>>6 ;
       
      
  }
  uint read_74162(uchar adr1)  //adr is 0x02  or 0x00;
 {  
      uchar i;
      uint j;
       i2c_start();
      i2c_writ2(0x90|adr1);
      i2c_writ2(0x03); 
      i2c_stop();
      i2c_start();
       i2c_writ2(0x91|adr1);
       j=i2c_rea2(1);
       i=i2c_rea2(1);
       i2c_stop();
        j=j<<8;
       j=j+i;
       return j>>6;
       
      
  }*/
/*void write_24c64(unsigned char adr,uchar dat)
{
	//unsigned char add1;
	//if(adr>0x1fff)
      //	return ;
   	//add1=adr>>8;
	i2c_start();
	i2c_writ2(0xa6);//
	i2c_writ2(adr);
	//add1=adr&0x00ff;
	//i2c_writ2(add1);
	i2c_writ2(dat);
	i2c_stop();
	delay(30);//20
}

uchar read_24c64(unsigned char adr)
{
	uchar i;
	//if(adr>0x1fff)
      	//return 	0x10;
   	//add1=adr>>8;
	i2c_start();
	i2c_writ2(0xa6);
	//i2c_writ2(add1);
	//add1=adr&0x00ff;
	i2c_writ2(adr);
	i2c_start();
	i2c_writ2(0xa7);
	i=i2c_rea2(0);
	i2c_stop();
	delay(5);
	return i;
}*/

void i2c_writ2(uchar dat)
{
	uchar i;
	for(i=0;i<8;i++)
	{
		
		if((dat&0x80)==0x00) SDA=0;
		else SDA=1;
		SCL=1;delay_5us();SCL=0;
		dat=dat<<1;
	}
	SDA=0;
	SCL=1;delay_5us();
	SCL=0;delay_5us();
}

uchar i2c_rea2(bit ack)
{
	uchar i,j;
	j=0x00;
	SDA=1;
	for(i=0;i<8;i++)
	{
		SCL=1;
		j=j<<1;
		if(SDA) j|=0x01;
		SCL=0;delay_5us();
	}
	if(ack) SDA=0;
	SCL=1;delay_5us();
	SCL=0;delay_5us();
	return j;
}

 
void delay_5us()
{
	uchar i;
	//for(i=0;i<2;i++){}
	for(i=0;i<4;i++){}
}

 
 
//#define WCR0  0xa0
//#define WCR1  0xa4
/*	ADDR             EQU    01010000B
       WCR0             EQU    10100000B
       WCR1             EQU    10100100B*/




/*************************************************************************
*           函数原型:void  START_I2C(void)
*           功    能:启动I2C总线
*           返 回 值:无
*           最后修改日期:2003-11-4
**************************************************************************/
/*void START_I2C()
{
	//EA=0;
	SDA=1;
       _nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA=0;
	_nop_();
	_nop_();
	SCL=0;
}
/*************************************************************************
*           函数原型:void  STOP_I2C(void)
*           功    能:停止I2C总线
*           返 回 值:无
*           最后修改日期:2003-11-4
**************************************************************************/
/*void STOP_I2C()
{
	SDA=0;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	 SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SDA=1;
 	_nop_();
	//EA=1;
}
/*************************************************************************
*           函数原型:void  CACK_I2C(void)
*           功    能:I2C总线MCU检查应答
*           返 回 值:1 成功
*           最后修改日期:2003-11-4
**************************************************************************/
/*bit CACK_I2C()
{
	SDA=1;
	_nop_();
	_nop_();
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
 	if(!SDA)/*有应答*/
	/*	{
			_nop_();
			_nop_();
			SCL=0;
			_nop_();
			return(1);
		}
	_nop_();
	_nop_();
	SCL=0;
	_nop_();
	return(0);
}*/
/*************************************************************************
*           函数原型:void  MACK_I2C(void)
*           功    能:I2C总线MCU作出应答
*           返 回 值:无
*           最后修改日期:2003-11-4
**************************************************************************/
/*void MACK_I2C()
{
	SDA=0;
	_nop_();
	_nop_();
	SCL=1;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SCL=0;
	_nop_();
	_nop_();
}*/
/*************************************************************************
*           函数原型:void  SendData_I2C(void)
*           功    能:I2C总线MCU检查应答
*           返 回 值:无
*           最后修改日期:2003-11-4
**************************************************************************/
/*void SendData_I2C(uchar Data)
{
	uchar i;
	for(i=0;i<8;i++)	
		{
			if(Data & 0x80) 
	      		{SDA=1;}
       		else 
	      		{SDA=0;}
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			SCL=1;
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			_nop_();
			SCL=0;
			_nop_();
			_nop_();
			Data=Data<<1;
		}
	SDA=1;//很奇怪,应答要加在这里才可以

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -