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

📄 24lc02.c

📁 温湿度变送器的下位机代码
💻 C
📖 第 1 页 / 共 2 页
字号:

#include "SysDef.h"
/*
unsigned char E2ACK_OK;


void DelayTime(unsigned int value);
int E2PROM_SelfCheck();
void WriteEEPROM (unsigned int wOffset,unsigned char *str,unsigned char count);
void  ReadEEPROM(unsigned int wOffset,unsigned char *str,unsigned char count);






//==============================================================================================
//延时
//==============================================================================================
//#define E2P_Delay 5*3                            //e2p's CLOCK Freq 100KHz(  
//#define Delay_5ms 3000//3000*3
#define E2P_Delay 90*3
#define Delay_5ms 5000*3 
#define EEPROM 0xAE

//=============================================================================================
void DelayTime(unsigned int value)
{
	while(--value);
}	
//=============================================================================================
//"提供i2c总线工作时序中的起始位(SCL为高时SDA的一个下降沿,而后两线都为低)
//=============================================================================================
void Start(void)
{
	IICEOUT &= ~(IICESDA + IICESCL);
	IICEDIR &= ~(IICESDA + IICESCL);             //SCL and SDA set to inputs, signals go high due to pull-up resistors
	DelayTime(E2P_Delay);
	IICEDIR |= IICESDA;                         //Set to output, data low so SDA = 0  
	DelayTime(E2P_Delay);
	IICEDIR |= IICESCL;                         //Set to output, data low so SCL = 0  
	DelayTime(E2P_Delay);
}
//=============================================================================================
//提供i2c总线工作时序中的停止位
//=============================================================================================
void Stop(void)
{
	IICEDIR |= IICESDA;                         //Set to output, data low so SDA = 0
	DelayTime(E2P_Delay);
	IICEDIR &= ~IICESCL;                        //Set to input, SCL = 1 due to pull-up
	DelayTime(E2P_Delay);
	IICEDIR &= ~IICESDA;                        //Set to input, SDA = 1 due to pull-up
	DelayTime(E2P_Delay);
}
//=============================================================================================
//=============================================================================================
void Clock(void)
{
	DelayTime(E2P_Delay);
	IICEDIR &= ~IICESCL;                              //Set to input, SCL = 1 due to pull-up
	DelayTime(E2P_Delay);
	IICEDIR |= IICESCL;                                //Set to output, data low so SCL = 0
	DelayTime(E2P_Delay);
	IICEDIR &= ~IICESDA;                               //Set to input, SDA = 1 due to pull-up
}
//=============================================================================================
//=============================================================================================
void NAck(void)
{
	IICEDIR &= ~IICESDA;                               //Set to input, SDA = 1 due to pull-up
	Clock();
}
//=============================================================================================
//=============================================================================================
void Ack(void)
{
	if((IICEIN & IICESDA) == IICESDA)                 //"高电平
	{
		E2ACK_OK=0;
	}
	else
	{
		E2ACK_OK=0x55;
	}
	//P6DIR |= IICESDA;                        //Set to output, data low so SDA = 0
	Clock();
}
void MCUAck()
{
	IICEDIR |= IICESDA;                        //Set to output, data low so SDA = 0
	Clock();
	
}
//=============================================================================================
//=============================================================================================
void OutByte(unsigned char dd)
{
	unsigned char i;
	for(i=8;i>0;i--)
	{
		if(dd & 0x80)                    //Only take the first bit
		{
			IICEDIR &= ~IICESDA;        //Set to input, SDA = 1 due to pull-up
		}
		else
		{
			IICEDIR |= IICESDA;         //Set to output, data low so SDA = 0
		}
		dd <<= 1;
		Clock();
	}
}
//=============================================================================================
//=============================================================================================
unsigned char InByte(void)
{
	unsigned char i,dd=0;
	for(i=8;i>0;i--)
	{
		dd <<= 1;
		IICEDIR &= ~IICESCL;                //Set to input, SCL = 1 due to pull-up
		DelayTime(E2P_Delay);
		if(IICEIN & IICESDA) dd ++;
		IICEDIR |= IICESCL;                 //Set to output, data low so SCL = 0
		DelayTime(E2P_Delay);
	}
	return dd;
}


unsigned char Addr;

void  ReadEEPROM(unsigned int wOffset,unsigned char *str,unsigned char count)      //"Sequential READ
{
	Start ();
        OutByte (EEPROM);                        //"write ADDR(R/W=W)
        Ack();
        Addr = wOffset%256;
        OutByte(Addr);
        Ack();

        Start ();
        OutByte (EEPROM | 1);                    //"write CONTRL BYTE(R/W=R)
        Ack ();

        while(count!=1)                          //"read COUNT-1 byte
        {
                *str = InByte();
                MCUAck();
                str++;
                count--;
        }
        *str = InByte();                       	 //"read the last byte
        NAck ();

        Stop ();
}

 
void WriteEEPROM (unsigned int wOffset,unsigned char *str,unsigned char count)
{
	//"дE2
      //"取消写保护
     
      Start ();
      OutByte(EEPROM);
      Ack(); 
      Addr = wOffset%256;
      OutByte(Addr);
        Ack ();
        for(;count!=0;count--)
        {
                OutByte (*str);
                Ack ();
                str++;
        }
        Stop ();
        
       
}

int E2PROM_SelfCheck()
{
	int iResult = 0;
	unsigned char uchTemp;
	for(int i =0; i<3; i++)
	{
		uchTemp = 0x55;
		WriteEEPROM(0x10, &uchTemp, 1);
		DelayTime(Delay_5ms);
		DelayTime(Delay_5ms);
		ReadEEPROM(0x10, &uchTemp,1);
		if(uchTemp == 0x55)
		{
			uchTemp = 0xFF;
			WriteEEPROM(0xFE, &uchTemp, 1);
			iResult = 1;
			break;
		}
	}
	return iResult;
}
*/
#define deviceaddress 0xAE  //AT24C02的设备地址


#define SCL_H P1OUT |= BIT6
#define SCL_L P1OUT &= ~BIT6
#define SDA_H P1OUT |= BIT7
#define SDA_L P1OUT &= ~BIT7

#define SDA_in  P1DIR &= ~BIT7   //SDA改成输入模式
#define SDA_out P1DIR |= BIT7    //SDA变回输出模式
#define SDA_val P1IN&BIT7        //SDA的位值
 
#define TRUE    1
#define FALSE   0


union
{
	unsigned int UintV;
	uchar Bt[2];
}unionUint;


/*******************************************
函数名称:delay
功    能:延时约15us的时间
参    数:无
返回值  :无
********************************************/

void IintIIC()
{
      P1DIR |= BIT6 + BIT7;               //设置相应端口为输出状态
      P1OUT |= BIT6 + BIT7; 
}

void DelayTime(unsigned int value)
{
	while(--value);
}	

void delay(void)
{
    uchar i;
    
	for(i = 0;i < 100;i++)
	  _NOP();
}	

/*******************************************
函数名称:delay_10ms
功    能:延时约6ms,等待EEPROM完成内部写入
参    数:无
返回值  :无
********************************************/
void delay_10ms(void)
{
	uint i = 2000;
	while(i--);
}
/*******************************************
函数名称:start
功    能:完成IIC的起始条件操作
参    数:无
返回值  :无
********************************************/
void start(void)
{
	SCL_H;
	SDA_H;
	delay();
	SDA_L;
	delay();
	SCL_L;
	delay();
}
/*******************************************
函数名称:stop
功    能:完成IIC的终止条件操作
参    数:无
返回值  :无
********************************************/
void stop(void)
{
	SDA_L;
	delay();
	SCL_H;
	delay();
	SDA_H;
	delay();	   
}
/*******************************************
函数名称:mack
功    能:完成IIC的主机应答操作
参    数:无
返回值  :无
********************************************/
void mack(void)
{
	SDA_L;
	_NOP(); _NOP();
	SCL_H;
	delay();
	SCL_L;
	_NOP();_NOP();
	SDA_H;     
	delay();
}
/*******************************************
函数名称:mnack
功    能:完成IIC的主机无应答操作
参    数:无
返回值  :无
********************************************/
void mnack(void)
{
	SDA_H;
	_NOP(); _NOP();
	SCL_H;
	delay();
	SCL_L;
	_NOP(); _NOP();
	SDA_L;   
	delay();       
}

/**********检查应答信号函数******************/
/*如果返回值为1则证明有应答信号,反之没有*/
/*******************************************
函数名称:check
功    能:检查从机的应答操作
参    数:无
返回值  :从机是否有应答:1--有,0--无
********************************************/
uchar check(void)
{
	uchar slaveack;
    
	SDA_H;
	_NOP(); _NOP();
	SCL_H;
	_NOP(); _NOP();
        SDA_in;
        _NOP(); _NOP();
	slaveack = SDA_val;   //读入SDA数值
	SCL_L;
	delay();
    SDA_out;
    if(slaveack)    return FALSE;
    else            return TRUE;
}
/*******************************************
函数名称:write1
功    能:向IIC总线发送一个1
参    数:无
返回值  :无
********************************************/
void write1(void)
{
	SDA_H;
	delay();
	SCL_H;
	delay();
	SCL_L;				
	delay();
}
/*******************************************
函数名称:write0
功    能:向IIC总线发送一个0
参    数:无
返回值  :无
********************************************/
void write0(void)
{
	SDA_L;
	delay();
	SCL_H;
	delay();			 
	SCL_L;				
	delay();
}
/*******************************************
函数名称:write1byte
功    能:向IIC总线发送一个字节的数据
参    数:wdata--发送的数据
返回值  :无
********************************************/
void write1byte(uchar wdata)
{
	uchar i;
    
	for(i = 8;i > 0;i--)
	{
		if(wdata & 0x80)	write1();
		else 			    write0();
		wdata <<= 1;
	}                  
	
	SDA_H;
	_NOP();   
}
/*******************************************
函数名称:writeNbyte
功    能:向IIC总线发送N个字节的数据
参    数:outbuffer--指向发送数据存放首地址
          的指针
          n--数据的个数
返回值  :发送是否成功的标志:1--成功,0--失败
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
	uchar i;
    
	for(i = 0;i < n;i++)
	{
		write1byte(* outbuffer);
		if(check())      
		{
			outbuffer++;			
		}
		else 
		{
			stop();
			return FALSE;
		}
	}

	stop();
	return TRUE;			
}
/*******************************************
函数名称:read1byte
功    能:从IIC总线读取一个字节
参    数:无
返回值  :读取的数据
********************************************/

⌨️ 快捷键说明

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