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

📄 parameter.c

📁 基于PIC16F877 温湿度控制器原代码及原理图PCB图
💻 C
字号:

#include <pic.h>
#include "Pindefine.h"
#include "variable.h"
#define  Nop()   asm("nop")
const  unsigned char ParaDefault[]=		     				  //确省定值
{
	0x01,		//地址
	0x00,   	//波特率
	0x00,		//PT高字节
	0x01,		//PT低字节
	0x00,		//CT高字节
	0x01,		//CT低字节
};
#define  FALSE     0
#define  TRUE      1
#define  MaxParameter   6
unsigned char Rd_inE2PROM(unsigned int addr);
unsigned char Wr_inE2PROM(unsigned int addr,unsigned char data);
void Load_DefaultValue(void);
void FinishParams(void);
void FinishParams(void);
char CheckParameter(void);
char LoadParameter(void);
unsigned char ReadParameter(void);
unsigned char WriteParameter(void);
/*****************************************************************
函数名称:void Rd_inE2PROM(unsigned int addr)
函数功能:写内部E2PROM
入口参数:addr---内部E2PROM的地址
        
输    出:
备    注: 
******************************************************************/
unsigned char Rd_inE2PROM(unsigned int addr)
{
   unsigned char i,j;
   EEADRH = (unsigned char)((addr>>8)&0x1f);
   EEADR = (unsigned char)(addr&0xff);
   EEPGD = 1;
   EEDATA = 0;
   RD = 1;
   Nop();
   Nop(); 
   i = EEDATA;
   j = EEDATH;
   EEPGD = 0;
   RD = 0;
   return i;
}

/*****************************************************************
函数名称:unsigned char Wr_inE2PROM(unsigned int *addr,unsigned char data)
函数功能:写内部E2PROM
入口参数:addr---内部E2PROM的地址
          data---写入的数据
输    出:
备    注: 用查询的方法写EPROM,在写的过程中要关闭系统的中断
           关闭最长时间为:8000*2*0.25uS = 2ms
******************************************************************/
unsigned char Wr_inE2PROM(unsigned int addr,unsigned char data)
{
  unsigned int i ;
  
  EEADR = addr&0xff;
  EEADRH = (addr&0x1f00)>>8;
  EEDATA = data;
  EEDATH = 0;
  GIE = 0;   //关闭中断 
  PEIE = 0;
  EEPGD = 1;
  WREN = 1;
  Nop();
  EECON2=0X55;
  EECON2=0XAA;
  WR = 1;
  i = 0;
  Nop();
  Nop();
  Nop();
  Nop();
  Nop();
  EEDATA = 0;
  WREN=0;  
  WR = 0; 
  GIE = 1;   //关闭中断 
  PEIE = 1; 

  return  TRUE;
}

void Load_DefaultValue(void)					
{       
	unsigned char i,*P;  
    P = &Para;
    for(i=0;i<MaxParameter;i++)
    {                   	
        Wr_inE2PROM((0x0011+i),ParaDefault[i]);			//将源数据写入EEDATA
        *P++ = ParaDefault[i];
   } 
	FinishParams();              
}

void FinishParams(void)
{	
	unsigned char crc0,sum0,para;
	char i;

	Wr_inE2PROM(0x000,0x55);
	Wr_inE2PROM(0x001,0xaa);
	crc0=0;
	sum0=0;
	for(i=0;i<MaxParameter;i++)
	{
		para=Rd_inE2PROM(0x0011+i);
		crc0^=para;
		sum0^=para;
	}
	Wr_inE2PROM(0x002,crc0);
	Wr_inE2PROM(0x003,sum0);
}


char CheckParameter(void)
{
	unsigned char *P,crc0,sum0,data,crc,sum;
	char i;
    P = &Para;
	crc0=Rd_inE2PROM(0x000);
	sum0=Rd_inE2PROM(0x001);

	if((crc0==0x55)&&(sum0==0xaa))				//定值标志
	{
		crc=0;
		sum=0;
		crc0=Rd_inE2PROM(0x002);
		sum0=Rd_inE2PROM(0x003);

		for(i=0;i<MaxParameter;i++)
		{
			data=Rd_inE2PROM(0x0011+i);
            *P++ = data;
			crc^=data;
			sum^=data;
		}
		if((crc==crc0)&&(sum==sum0)) return TRUE;
	}
	return FALSE;
	
}

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,i;  
    P = &Para;
    for(i=0;i<MaxParameter;i++)
    {                   	
        Wr_inE2PROM((0x0011+i),*P++);			//将源数据写入EEDATA
   } 
	FinishParams(); 
   return TRUE;				
}

⌨️ 快捷键说明

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