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

📄 eeprom.c

📁 基于PIC16F877 温湿度控制器原代码及原理图PCB图
💻 C
字号:
#include <pic.h>
#include "Pindefine.h"
#include "variable.h"
#define  Nop()   asm("nop")
#define   SDAMODE   TRISB7 
#define  FM24C16addr         0xa0
#define  FM24C16addr2        0xa8
#define  DZSUM    6
#define  TRUE           1
#define  FALSE          0
bank1 para_data Para;
const  unsigned char ParaDefault[]=		     				  //确省定值
{
	0x01,		//地址
	0x00,   	//波特率
	0x00,		//PT高字节
	0x01,		//PT低字节
	0x00,		//CT高字节
	0x01,		//CT低字节
};
void  I2C_Start(void);
void  I2C_Stop(void);
void  I2C_Wait(void);
unsigned  char  I2C_SendByte(unsigned  char byte);
unsigned  char  I2C_ReceiveByte(void);
void  SendAcknowledge(unsigned  char ack);
unsigned  char  I2C_ReceiveByte(void);
unsigned  char  I2C_Read(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);
unsigned  char  I2C_Write(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf);
char CheckParameter(void);
void Load_DefaultValue(void);
void FinishParams(void);
char LoadParameter(void);
unsigned char ReadParameter(void);
unsigned char WriteParameter(void);
extern void watchDOG(void);
extern void DelyNms(unsigned int Nms);
void  I2C_Start(void)
{
    SCLPort = 0;
    SDAMODE = 0;
    I2C_Wait();
    SDA = 1;
    I2C_Wait();
    SCL = 1;
    I2C_Wait();
    SDA = 0;
    I2C_Wait();
    SCL = 0;	
}
/***********************************************************************/
void  I2C_Stop(void)
{
    SDAMODE = 0;
    I2C_Wait();
    SDA = 0;
    I2C_Wait();
    SCL = 1;
    I2C_Wait();
    SDA = 1;	
}
/***********************************************************************/
void  I2C_Wait(void)
{
   Nop();Nop();Nop();Nop();Nop();Nop();  Nop();Nop();Nop() ;Nop();Nop();Nop();                               			 
}
/***********************************************************************/
unsigned  char  I2C_SendByte(unsigned  char byte)
{
    unsigned  char i,ack;
    SDAMODE = 0;
    I2C_Wait();
    for (i = 0;i <= 7;i++)
    {
        if(byte & 0x80)
        {
          SDA=1;
        }
        else
        {
          SDA=0;
        }
        byte <<= 1;        
        SCL = 1;
        I2C_Wait();
        SCL = 0;
        I2C_Wait();        
    }
    SDA = 1; 
    Nop();      
    SDAMODE = 1;							 
    I2C_Wait();
    SCL = 1;
    I2C_Wait();      
    if(SDA == 1) 
    {
    	ack = 0;	
    }					 
    else 
    {
    	ack = 1;
    }
    SCL = 0;
    SDAMODE = 0;
    return(ack);	
}
/***********************************************************************/
unsigned  char  I2C_ReceiveByte(void)
{
    unsigned  char i,byte = 0;
    SDAMODE = 1;
    I2C_Wait();
    for(i = 0;i <= 7;i++)
    {       
       SCL = 1;
       I2C_Wait(); 
       byte <<= 1;             
       if(SDA == 1)
       {
       	 byte |= 0x01;
       }       
       SCL = 0;
    }
    return(byte);	
}
/***********************************************************************/
void  SendAcknowledge(unsigned  char ack)
{
    SDAMODE = 0;
    I2C_Wait();
    if(ack)
    {
       SDA = 1;
    }	
    else
    {
       SDA = 0;
    }
    I2C_Wait();
    SCL = 1;
    I2C_Wait();
    SCL = 0;
}
unsigned  char  I2C_Read(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf)
{
    unsigned  char i,j,ack;   
    for(j = 0;j < 3;j++)							 
    {
    	 I2C_Start();	
       ack = I2C_SendByte(slvaddr);
       if(ack == 0)
       {
          I2C_Stop();
          continue;	
       }
       I2C_Wait();
       ack = I2C_SendByte(address);
       if(ack == 0)
       {
          I2C_Stop();
          continue;	
       }
       I2C_Wait();    
       
       I2C_Start();
       ack = I2C_SendByte(slvaddr | 0x01);
       if(ack == 0)
       {
          I2C_Stop();
          continue;	
       }
       Nop();
       Nop();
       for(i = 0;i < length;i++)
       {
         *(databuf+i) = I2C_ReceiveByte();
         if(i < length-1)
         {
   	        SendAcknowledge(0);
   	     }
         else
         {
   	        SendAcknowledge(1);	
   	     }
       }
       I2C_Stop();
       if(ack == 1)
   	   {  
   	  	   break;
   	   } 
   	}
    return(ack);
}
/***********************************************************************/
unsigned  char  I2C_Write(unsigned  char slvaddr,unsigned  char address,unsigned  char length,unsigned  char *databuf)
{
    unsigned  char i,j,ack;
    WP = 0;
    for(j = 0;j < 3;j++)							 
    {
   	  I2C_Start();	
   	  ack = I2C_SendByte(slvaddr);
   	  if(ack == 0)
   	  {
      	 	I2C_Stop();continue;	
   	  }
   	  I2C_Wait();
   	  ack = I2C_SendByte(address);
     	if(ack == 0)
   	  {
       		I2C_Stop();continue;
     	}    	    	
   	  for(i = 0;i < length;i++)
   	  {
      		ack = I2C_SendByte(*(databuf+i));
      		if(ack == 0) 
      		{
      			break;
      		}
   	  }
   	  if(ack == 0)
   	  {
       		I2C_Stop();continue;
   	  }
     	I2C_Stop();
   	  if(ack == 1)  
   	  {
   	  	  break;
   	  }
    }
    return(ack);						
}

char CheckParameter(void)
{
	unsigned char *P,crc0,sum0,data,crc,sum;
	char i;
    P = &Para;
	I2C_Read(FM24C16addr,0,1,&crc0);
    I2C_Read(FM24C16addr,1,1,&sum0);

	if((crc0==0x55)&&(sum0==0xaa))				//定值标志
	{
		crc=0;
		sum=0;
	    I2C_Read(FM24C16addr,0x02,1,&crc0);
	    I2C_Read(FM24C16addr,0x03,1,&sum0);

		for(i=4;i<DZSUM+4;i++)
		{
            I2C_Read(FM24C16addr,i,1,&data);
            *P++ = data;
			crc^=data;
			sum^=data;
		}
		if((crc==crc0)&&(sum==sum0)) return TRUE;
	}
	return FALSE;
	
}

void Load_DefaultValue(void)					
{       
	unsigned char i,*P; 
    P = &Para;
    watchDOG();
    for(i=0;i<DZSUM;i++)  *P++ = ParaDefault[i];
    I2C_Write(FM24C16addr,0x04,4,P++);
    DelyNms(1);
    I2C_Write(FM24C16addr,8,2,P++);  
    WP = 1;
	FinishParams();   
    watchDOG();
        
}
void FinishParams(void)
{	
	unsigned char crc0,sum0,para;
	char i;

    crc0 = 0x55;
	I2C_Write(FM24C16addr,0,1,&crc0);
     DelyNms(1);
    sum0 = 0xaa;
    I2C_Write(FM24C16addr,1,1,&sum0);
     DelyNms(1);
	crc0=0;
	sum0=0;
	for(i=4;i<DZSUM+4;i++)
		{
          I2C_Read(FM24C16addr,i,1,&para); 
		  crc0^=para;
		  sum0^=para;
	}
	I2C_Write(FM24C16addr,2,1,&crc0);
     DelyNms(1);
    I2C_Write(FM24C16addr,3,1,&sum0);
     DelyNms(1);
     WP = 1;
}

char LoadParameter(void)						//调装置定值
{
	if(CheckParameter()==FALSE)
	{
		Load_DefaultValue();					//调确省定值
		if(CheckParameter()==FALSE)
		{		
			return FALSE;
		}
	}
	return TRUE;
}
unsigned char ReadParameter(void)
{
   if(CheckParameter()==FALSE) Load_DefaultValue();		
   return TRUE;			//调确省定值
}

unsigned char WriteParameter(void)
{
     unsigned char *P;
     *P = &Para;
     I2C_Write(FM24C16addr,0x04,4,P++);
     DelyNms(1);
     I2C_Write(FM24C16addr,8,2,P++);  
     DelyNms(1);
     WP = 1;
     watchDOG();     
	 FinishParams(); 
     watchDOG();
     return  TRUE;
}

⌨️ 快捷键说明

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