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

📄 ade7758.c

📁 实现对ADE7758电能芯片的读写和校准,8051单片机,通过PC对电参量进行校准
💻 C
📖 第 1 页 / 共 4 页
字号:
			temp_add++;
			
			temp_data = rwdata.adjusting.write_data.voltage[i].data8[j];
			
			byte_write(temp_data , SET_E2PROM_ADD + temp_add );
		}
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 2; j++)
		{
			temp_add++;
			
			temp_data = rwdata.adjusting.write_data.current[i].data8[j];
			
			byte_write(temp_data , SET_E2PROM_ADD + temp_add );
		}
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 2; j++)
		{
			temp_add++;
			
			temp_data = rwdata.adjusting.write_data.watt[i].data8[j];
			
			byte_write(temp_data , SET_E2PROM_ADD + temp_add );
		}
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 2; j++)
		{
			temp_add++;
			
			temp_data = rwdata.adjusting.write_data.var[i].data8[j];
			
			byte_write(temp_data , SET_E2PROM_ADD + temp_add );
		}
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 2; j++)
		{
			temp_add++;
			
			temp_data = rwdata.adjusting.write_data.va[i].data8[j];
			
			byte_write(temp_data , SET_E2PROM_ADD + temp_add );
		}
	}//end of for(i)
	
	EA = 1;
}//end of save_set_to_e2prom()

/********************************************************************************************
                  从E2PROM中读出已保存的校准参数
上电初始化时调用
*********************************************************************************************/
bit b_adjust  =  0;//ADE7758已经校准标志
void read_set_from_e2prom()
{
	uchar data i,j;
	uchar data temp_data;
	uchar data temp_add = 0;
	
	if( byte_read(SET_E2PROM_ADD) == SAVE_OK)
	{
		b_adjust  =  1;//ADE7758已经校准标志
		
		for( i = 0; i < 3 ; i++)
		{
			for( j = 0; j < 2; j++)
			{
				temp_add++;
			
				temp_data = byte_read( SET_E2PROM_ADD + temp_add );
				
				rwdata.adjusting.write_data.voltage[i].data8[j] = temp_data;
			}//end of for(j)
		}//end of for(i)
		for( i = 0; i < 3 ; i++)
		{
			for( j = 0; j < 2; j++)
			{
				temp_add++;
			
				temp_data = byte_read( SET_E2PROM_ADD + temp_add );
				
				rwdata.adjusting.write_data.current[i].data8[j] = temp_data;
			}//end of for(j)
		}//end of for(i)
		
		for( i = 0; i < 3 ; i++)
		{	
			for( j = 0; j < 2; j++)
			{
				temp_add++;
			
				temp_data = byte_read( SET_E2PROM_ADD + temp_add );
				
				rwdata.adjusting.write_data.watt[i].data8[j] = temp_data;
			}//end of for(j)
		}//end of for(i)
		
		for( i = 0; i < 3 ; i++)
		{	
			for( j = 0; j < 2; j++)
			{
				temp_add++;
			
				temp_data = byte_read( SET_E2PROM_ADD + temp_add );
				
				rwdata.adjusting.write_data.var[i].data8[j] = temp_data;
			}//end of for(j)
		}//end of for(i)
		
		for( i = 0; i < 3 ; i++)
		{
			for( j = 0; j < 2; j++)
			{
				temp_add++;
			
				temp_data = byte_read( SET_E2PROM_ADD + temp_add );
				
				rwdata.adjusting.write_data.va[i].data8[j] = temp_data;
			}//end of for(j)
		}//end of for(i)
		//将数据从E2PROM中读到RAM中,再调用 write_to7758(),将数据写入ADE7758中
		////////////////////
		write_to7758();
		////////////////////
		
	}//end of if( byte_read(SET_E2PROM_ADD) == SAVE_OK)
}//end of read_set_from_e2prom()

/********************************************************************************************
                  将能量存入E2PROM
在正常模式下才会调用该函数
分为两部分:1--KWh  2--Ws
*********************************************************************************************/
#define ENERGY_E2PROM_ADD  0X10    //存放电能的起始地址
#define MCU_MEMORY         0X8000   //P89C51RC2的存储器空间
#define ENERGY_FLASH_ADD   MCU_MEMORY - 1024    //存放电能的起始地址
/*
void save_en_to_e2prom()
{
	uchar data i,j;
	uchar data temp_data;
	uchar data temp_add = 0;
	
	byte_write(SAVE_OK , ENERGY_E2PROM_ADD );
	
	//the part of "kwh"
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = rwdata.working.watt_hour[i].data8[j];
			
			if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
			byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
		}//end of for(j)
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = rwdata.working.var_hour[i].data8[j];
			
			if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
			byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
		}//end of for(j)
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = rwdata.working.va_hour[i].data8[j];
			
			if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
			byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
		}//end of for(j)
	}//end of for(i)
	
	//the part of "ws"
	for( i = 0; i < 9; i++)
	{
		for( j = 0; j < 4; j++)
		{
			temp_add++;
			
			temp_data = energy[i].data8[j];
			
			if( byte_read( ENERGY_E2PROM_ADD + temp_add ) != temp_data)
			byte_write(temp_data , ENERGY_E2PROM_ADD + temp_add );
		}//end of for(j)
	}//end of for(i)
	
}//end of save_en_to_e2prom()
*/
/********************************************************************************************************
                      清除电能值
调用该函数要小心,它将清除所有电能值                      
*********************************************************************************************************/

void clean_energy()
{
	uchar i;
	
	for( i = 0; i < sizeof( rwdata ); i++)
	{
		rwdata.serie_data8[i] = 0x00;   
	}
	
	for( i = 0; i < 9 ; i++ )
	{
		energy[i].data32 = 0;
	}
	/*
	for( i = 1; i <= 72; i++ )
	{
		byte_write(0x00 , ENERGY_E2PROM_ADD + i );
	}
	*/
	b_clean_en = 1;
}//end of clean_energy()

/*******************************************************************************************************
                   读取E2PROM中的电能到RAM中
在初始化程序中调用
********************************************************************************************************/
/*
void read_en_from_e2prom()
{
	uchar data i,j;
	uchar data temp_data;
	uchar data temp_add = 0;
	
	if( byte_read( ENERGY_E2PROM_ADD ) != SAVE_OK)
	{
		clean_energy();
		return;
	}
	
	//the part of "kwh"
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = byte_read( ENERGY_E2PROM_ADD + temp_add );
			
			rwdata.working.watt_hour[i].data8[j] = temp_data;
		}//end of for(j)
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = byte_read( ENERGY_E2PROM_ADD + temp_add );
			
			rwdata.working.var_hour[i].data8[j] = temp_data;
		}//end of for(j)
	}//end of for(i)
	
	for(i = 0; i < 3 ; i++)
	{
		for( j = 0; j < 4 ; j++)
		{
			temp_add++;
			
			temp_data = byte_read( ENERGY_E2PROM_ADD + temp_add );
			
			rwdata.working.va_hour[i].data8[j] = temp_data;
		}//end of for(j)
	}//end of for(i)
	
	//the part of "ws"
	for( i = 0; i < 9; i++)
	{
		for( j = 0; j < 4; j++)
		{
			temp_add++;
			
			temp_data = byte_read( ENERGY_E2PROM_ADD + temp_add );
			
			energy[i].data8[j] = temp_data;
		}//end of for(j)
	}//end of for(i)
}//end of read_en_from_e2prom()
*/


/***********************************************************************************************
将标志写入中断寄存器中,允许能量寄存器容量超出一半时产生中断
************************************************************************************************/
void write_mask()
{
	unsigned char loop,type;
	unsigned long wdata;
	wdata = 0x00000700;//AEHF=1,VAEHF=1,低8位无用

	type = ADD_MASK & 0x7F;
	type = type | 0x80;
	for(loop = 0;loop < 8;loop ++)
	{
		SSCK = 1;
		_nop_();
		SSDI = type & 0X80;
		_nop_();
		SSCK = 0;
		_nop_();
		type = (type << 1);
	}
	delay10us();
	for(loop = 0;loop < 24;loop ++)
	{
		SSCK = 1;
		_nop_();
		SSDI = wdata & 0X80000000;
		_nop_();
		SSCK = 0;
		_nop_();
		wdata = (wdata << 1);
	}
}//end of write_mask()


/////////////////////////////////////////////////////////////////////////////////////////////////
///                        以下是操作FLASH MEMORY的代码
///                        将数据存放到第4块,本段代码只适用于PHILIPS P89V51RDXX系列芯片
/////////////////////////////////////////////////////////////////////////////////////////////////
#define FLASH_START_ADD    0XC000      //存放数据的起始地址,从48K开始
#define BLOCK2             0XC0        //48K--64K的存储器空间
#define DATA_TABLE_LEN     150         //0--149,存放数据段标志,每一字节对应一个数据段
#define DATA_START_OFFSET  200         //从起始地址到存放第一个数据段的偏移
#define DATA_SEGMENT_LEN   100         //100BYTES
#define DATA_START         FLASH_START_ADD + DATA_START_OFFSET

/************************************************************************************
                   擦除从48K到64K的存储区
*************************************************************************************/
void erase_flash()
{
	EA = 0;//Disable all interrupt
	
	disable_dog();//Disable watchdog
	
	erase_block( BLOCK2 );
	
	wrsr_cmd();//Enable watchdog
	
	EA = 1;
}


/*************************************************************************************
                        寻找数据段标记,并将其读出入进RAM
上电后先读出存储分区表,读出最后一个数据区的区号
**************************************************************************************/
uchar data data_segment_flag = 0xff;

void look_for_flag()
{
	uchar data i = 0;
	
	//EA = 0;
	//////////////////////////////
	while( i < DATA_TABLE_LEN )
	{
		if( read_iap( FLASH_START_ADD + i ) != 0xff )
		{
			if( read_iap( FLASH_START_ADD + i + 1 ) != 0xff )
			i++;
			else
			{

⌨️ 快捷键说明

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