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

📄 save.c

📁 基于AVR的一种程序,智能控制器,可用于低压无功补偿部分,
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "public.h"
#include "p_main.H"

/* LF2407.H 的外部变量 */
/*IO端口C数据和方向控制寄存器*/
extern  unsigned int  *PCDATDIR;
/*SPI状态寄存器*/
extern unsigned int  *SPISTS;
/*SPI串行输入缓冲寄存器*/
extern unsigned int  *SPIRXBUF;
/*SPI串行输出缓冲寄存器*/
extern unsigned int  *SPITXBUF;


/*ad45db041片选信号使能;*/
void Cs_Enable(void)
{
	*PCDATDIR=*PCDATDIR&0X0FFDF;    /*CS=0;*/
}

/*AD45DB041片选信号禁止*/
void Cs_Disable(void)
{
	*PCDATDIR=*PCDATDIR|0X20;
}

/*读状态寄存器*/
unsigned int Ad45_Status(void)
{
	uint temp_s;
	Cs_Enable();
	Delay(20);
	*SPITXBUF=0X0d700;	               /*COMMAND 0X84*/
	 while((*SPISTS&0x0040)==0);
     temp_s=*SPIRXBUF;
  *SPITXBUF=0X0000;	                 /*ad45db041 status*/ 
	 while((*SPISTS&0x0040)==0);
     temp_s=*SPIRXBUF;
  temp_s&=0x80;
  return(temp_s);
}

/**********************************************************************/
/* main memory page program through buffer  */
/* 82h for buffer1 or 85h for buffer2 */
/* 时序顺序:命令 地址 地址 地址 数据 */
/* 地址:ADDR1(**** PA10 PA9 PA8 PA7) */
/* 地址:ADDR2(PA6 PA5 PA4 PA3  PA2 PA1 PA0 BA8) */
/* 地址:ADDR3(BA7 BA6 BA5 BA4  BA3 BA2 BA1 BA0) */
/**********************************************************************/
void Write_Flash(uint page,uint block,uint *buffer,uint num)
{
	uint temp,addr1,addr2,addr3;
	uint i;
	temp=page<<1;
	addr1=temp&0xff00;
	addr2=temp&0x00ff;
	addr2<<=8;
	addr3=block&0x0ff;
	addr3<<=8;	
	Cs_Enable();
	Delay(20);
	 *SPITXBUF=0X8200;	               /* flash write COMMAND 0X82 */
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  *SPITXBUF=addr1;	               /*ADDRESS 1*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  *SPITXBUF=addr2;	               /*ADDRESS 2*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
     *SPITXBUF=addr3;	               /*ADDRESS 3*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  for(i=0;i<num;i++)
  {
  	temp=*(buffer+i);
  	*SPITXBUF=temp<<8;
  	while((*SPISTS&0x0040)==0);
       temp=*SPIRXBUF;
  }   
  Delay(20);
  Cs_Disable();
  //while(Ad45_Status()==0);  
  Delay(60000);      
}

/**********************************************************************/
/* main memory page program through buffer  */
/* 52h for buffer1 */
/* 时序顺序:命令 地址 地址 地址 数据 */
/* 地址:ADDR1(**** PA10 PA9 PA8 PA7) */
/* 地址:ADDR2(PA6 PA5 PA4 PA3  PA2 PA1 PA0 BA8) */
/* 地址:ADDR3(BA7 BA6 BA5 BA4  BA3 BA2 BA1 BA0) */
/**********************************************************************/

void Read_Flash(uint page,uint block,uint *buffer,uint num)
{
	uint temp,addr1,addr2,addr3;
	uint i;
	temp=page<<1;	
	addr1=temp&0xff00;
	addr2=temp&0x00ff;
	addr2<<=8;
	addr3=block&0x0ff;
	addr3<<=8;		
	Cs_Enable();
	Delay(20);
	 *SPITXBUF=0X5200;	               /* flash write COMMAND 0X52 */
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  *SPITXBUF=addr1;	                 /*ADDRESS 1*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  *SPITXBUF=addr2;	                 /*ADDRESS 2*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
     *SPITXBUF=addr3;	               /*ADDRESS 3*/ 
	 while((*SPISTS&0x0040)==0);
     temp=*SPIRXBUF;
  for(i=0;i<4;i++)
   {  
     *SPITXBUF=0X0000;	             /*DATA*/ 
	   while((*SPISTS&0x0040)==0);
       temp=*SPIRXBUF;
   }
  for(i=0;i<num;i++)
  {
  	*SPITXBUF=0x0000;
  	while((*SPISTS&0x0040)==0);
    *(buffer+i)=*SPIRXBUF;
  }    
  Delay(20);
  Cs_Disable();
//  while(Ad45_Status()==0);  
}

/*保存设置参数 flash page0 from byte0 */
void Save_Set(void)
{
	uint i,temp;
	up3_data.set_shuju[0]=set_mm[0]+set_mm[1]*10+set_mm[2]*100+set_mm[3]*1000;
	up3_data.set_shuju[1]=set_id[0]+set_id[1]*10+set_id[2]*100+set_id[3]*1000;
	for(i=0;i<19;i++)
	{
			temp=*(&up3_data.set_shuju[0]+i);
			flash_buffer[2*i]=temp&0x0ff;			
			flash_buffer[2*i+1]=temp&0x0ff00;
			flash_buffer[2*i+1]>>=8;
	}
	Write_Flash(0,0,flash_buffer,38);	
	for(i=0;i<38;i++)flash_buffer[i]=0;
}

/*读出设置参数 flash page0 from byte0*/
void Read_Set(void)
{
	uint i,temp;
	Read_Flash(0,0,flash_buffer,38);
	for(i=0;i<19;i++)
	{
		*(&up3_data.set_shuju[0]+i)=flash_buffer[2*i]+flash_buffer[2*i+1]*256;
	}
	set_mm[0]=up3_data.set_shuju[0]%10;
	set_mm[1]=up3_data.set_shuju[0]/10%10;
	set_mm[2]=up3_data.set_shuju[0]/100%10;
	set_mm[3]=up3_data.set_shuju[0]/1000%10;
	set_id[0]=up3_data.set_shuju[1]%10;
  set_id[1]=up3_data.set_shuju[1]/10%10;		
	set_id[2]=up3_data.set_shuju[1]/100%10;
	set_id[3]=up3_data.set_shuju[1]/1000%10;
	for(i=0;i<255;i++)flash_buffer[i]=0;	
}

/********************************************************************************/
/***********************************求统计数据***********************************/
/********************************************************************************/
uint IntToLsb(uint itl_int)
{
 return(itl_int%256);
}

uint IntToMsb(uint itl_int)
{
 return(itl_int>>8);
}


void Tj_Shuju(void)
{
	uint i,j,temp;
	uint st_out;
	up4_data.tj_shuju[0]=p_year;
	up4_data.tj_shuju[1]=p_month;
	up4_data.tj_shuju[2]=p_day;
	for(i=0;i<3;i++)
	 {
	 	if(up1_data.avr_u[i]/100>SET_U1)
	 		{
	 			temp=up4_data.tj_shuju[2*i+3]+up4_data.tj_shuju[2*i+4]*256;
	 			temp+=1;                                             /*abc电压超上限时间[0]-[5]*/
	 			if(temp>1440)temp=0;
	 			up4_data.tj_shuju[2*i+3]=IntToLsb(temp);
	 			up4_data.tj_shuju[2*i+4]=IntToMsb(temp);
	 	 }
	 }	  
	for(i=0;i<3;i++)
	 {
	 	if(up1_data.avr_u[i]/100<SET_U2&&up1_data.avr_u[i]/100>100)
	 		{
	 			temp=up4_data.tj_shuju[2*i+9]+up4_data.tj_shuju[2*i+10]*256;
	 			temp+=1;                                              /*abc电压超下限时间[6]-[11]*/
	 			if(temp>1440)temp=0;
	 			up4_data.tj_shuju[2*i+9]=IntToLsb(temp);
	 			up4_data.tj_shuju[2*i+10]=IntToMsb(temp);
	 		}	 		
	 }
	for(i=0;i<3;i++)
	 {
	 	temp=up4_data.tj_shuju[2*i+15]+up4_data.tj_shuju[2*i+16]*256;
	 	if(temp>1440)temp=0;
	 	if(up1_data.avr_u[i]/100<80)temp+=1;                      /*abc电压缺相时间[12]-[17]*/	 	
	 	up4_data.tj_shuju[2*i+15]=IntToLsb(temp);
	 	up4_data.tj_shuju[2*i+16]=IntToMsb(temp);	 		
	 }  
	 
	for(i=0;i<3;i++)
	{
		temp=up4_data.tj_shuju[4*i+21]+up4_data.tj_shuju[4*i+22]*256;
		if(temp>28000)temp=0;
		if(up1_data.avr_u[i]>temp)                    /*abc电压最大值、发生时间[18]-[29]*/
			{
				up4_data.tj_shuju[4*i+21]=IntToLsb(up1_data.avr_u[i]);
				up4_data.tj_shuju[4*i+22]=IntToMsb(up1_data.avr_u[i]);
				up4_data.tj_shuju[4*i+23]=p_hour;
				up4_data.tj_shuju[4*i+24]=p_minute;	
			}			
	}  	
	for(i=0;i<3;i++)
	{
		temp=up4_data.tj_shuju[4*i+33]+up4_data.tj_shuju[4*i+34]*256;		
		if(temp<10000)temp=24000;
		if(up1_data.avr_u[i]<temp&&up1_data.avr_u[i]>10000)  /*abc电压最小值、发生时间 [30]-[41] */
			{
				up4_data.tj_shuju[4*i+33]=IntToLsb(up1_data.avr_u[i]);
				up4_data.tj_shuju[4*i+34]=IntToMsb(up1_data.avr_u[i]);
				up4_data.tj_shuju[4*i+35]=p_hour;
				up4_data.tj_shuju[4*i+36]=p_minute;	
			}			
	}
	  	
	for(i=0;i<3;i++)
	{
		temp=up4_data.tj_shuju[4*i+45]+up4_data.tj_shuju[4*i+46]*256;
		if(temp>65000)temp=0;
		if(up1_data.avr_i[i]>temp)                 /*abc电流最大值、发生时间[42]-[53]*/
			{
				up4_data.tj_shuju[4*i+45]=IntToLsb(up1_data.avr_i[i]);
				up4_data.tj_shuju[4*i+46]=IntToMsb(up1_data.avr_i[i]);
				up4_data.tj_shuju[4*i+47]=p_hour;
				up4_data.tj_shuju[4*i+48]=p_minute;	
			}			
	}	  	
	for(i=0;i<3;i++)
	{
		temp=up4_data.tj_shuju[4*i+57]+up4_data.tj_shuju[4*i+58]*256;		
		if(up1_data.avr_i[i]<temp||temp==0x0ffff||temp==0)                  /*abc电流最小值、发生时间 [54]-[65] */
			{
				up4_data.tj_shuju[4*i+57]=IntToLsb(up1_data.avr_i[i]);
				up4_data.tj_shuju[4*i+58]=IntToMsb(up1_data.avr_i[i]);
				up4_data.tj_shuju[4*i+59]=p_hour;
				up4_data.tj_shuju[4*i+60]=p_minute;	
			}			
	}  	
	/*************abc十五分钟电流最大值,发生时间*****[69]-[80]************/	
	minute_15++;
	if(minute_15>15)
		{
			minute_15=0;
			for(i=0;i<3;i++)
			{
				temp=up4_data.tj_shuju[4*i+69]+up4_data.tj_shuju[4*i+70]*256;
				if(temp>65000)temp=0;
				if(up1_data.avr_i[i]>temp)temp=up1_data.avr_i[i];

⌨️ 快捷键说明

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