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

📄 dataprc.c

📁 电磁流量计的源程序。将流体流量用电磁转换方式变换成弱电信号
💻 C
字号:
#include "MATH.H"
#include "reg52.h"
#include "typedef.h"
#include "function.h"
#include "define.h"
#include "varible.h"

/****************************/

void System_data_init(void);
void Data_prc(void);
void Ad_data_prc(void);
float Get_lchen_data(unsigned char address,unsigned char point);
float Get_alarmup_data(void);
float Get_alarmdm_data(void);
float Get_pn_data(unsigned char start_address);
 unsigned long int Get_high_data(float fdata);
 unsigned int Get_low_data(float fdata);
void Modify_adc_gain(unsigned char gain);

/********************************/
/********************************/
void System_data_init(void)
{ 

  dp_point = Read1B(0x0e,0);
  
  if(dp_point > 3)
     {
     	dp_point = 2 ;          //system moren de xiaosudin
        Write1B(dp_point,0x0e,0);
     }
  pulse_dp = Read1B(0x2a,0);
  if(pulse_dp > 3)
     {
     	pulse_dp = 2 ;
        Write1B(pulse_dp,0x2a,0);
    }
  sensor_dp = Read1B(0x34,0) ;
  if(sensor_dp > 3)
    {
     sensor_dp = 2 ;
     Write1B(sensor_dp,0x34,0);
    }
/*  add zero offset set */
       
  sensor_k = Get_lchen_data(0x30,sensor_dp);    
//get liangchen
  lchen_data = Get_lchen_data(0x18,dp_point);
  lchen_data_old = lchen_data ;
//get disp xisu
 // system_k = sensor_k*lchen_data*1.5/0x7fff ; //system_k is designed to sensor_k and lchen 2003-12-10
  system_k = sensor_k*lchen_data/0x7fff ;

  zero_dp = Read1B(0x3d,0);
  zero_symbol = Read1B(0x38,0);
  if(zero_dp > 3)
   {
      zero_dp = 2 ;
      Write1B(zero_dp,0xd,0);
   }
 // zero_offset = Get_lchen_data(0x39,zero_dp);
   
  zero_code = (unsigned int)( Get_lchen_data(0x39,zero_dp)/10.0*32767); 
  pulse_danlan = Get_lchen_data(0x26,pulse_dp);               //calculator danlan 
//get filter zhisu
  filter_data = Read1B(0x1c,0);
//get xiaoliuliang value

  cut_slope = Read1B(0x1d,0);      //xiaoliuliang cut value
  cut_data = (cut_slope/100.0)*lchen_data ;   //this cut_data is used for compare with moment_data 
//get alarm_up_data
  alarm_up_data = Get_alarmup_data();

//get alarm_dm_data
  alarm_dm_data = Get_alarmdm_data();
  data_prc_time = 0 ;
  sec_time = 0;
  adjust_time = 0 ;
 
  system_dp = Read1B(0x24,0);
  system_lchen = Get_lchen_data(0x20,system_dp);

  page1_start_addr = Read1B(0x10,0);   //get need baochen address
  p_count_data = Get_pn_data(page1_start_addr);
  
  n_count_data = Get_pn_data(page1_start_addr+4);
  net_count_data = p_count_data - n_count_data ;
  net_count_data_old = net_count_data ;
  net_cha = 0;

//  consult = 0x4fff;          //test
}

/********************************/
/********************************/

void Data_prc(void)
{
  EE_BUFFER write_data;
  
//  float compare_k;
//  if(data_prc_time != 0)
//     data_prc_time--;
//  else
//  { 
          
		  //judge lchen change
		 if(lchen_data != lchen_data_old)     //if change lianchen range
	        {
	                 lchen_data_old = lchen_data ;
          //           system_k = sensor_k*lchen_data*1.5/0x7fff ;
                     system_k = sensor_k*lchen_data/0x7fff ;         //2003-12-10
                     
	                 cut_data = (cut_slope/100.0)*lchen_data;

                     alarm_up_data = Get_alarmup_data();
                      //get alarm_dm_data
                     alarm_dm_data = Get_alarmdm_data();
           /*          
					 compare_k = lchen_data/system_lchen ;            //calculate lchen changed how much???
					 if((compare_k > 1.5)&&(compare_k < 3))           //lchen range expand one time
					   {
					                                
                          Modify_adc_gain(ADC_GAIN_8);                //adc_gain from 16 to 8
                         
                       }
					 else if(compare_k < 0.67)                        //if //lchen range reduce one timer
					   {
					                          
						  Modify_adc_gain(ADC_GAIN_32);               //changed adc_gain from 16 to 32
						}
					else
					   {
					   	  Modify_adc_gain(ADC_GAIN_16);
					   }                     */                    //update:2003-09-20
	          }
		  
    if(adjust_time != 0)
	   adjust_time--;
	else if(data_prc_time != 0)
	   {
	     self_adj_F = 0;
	     data_prc_time--;
		}
	else
	{
    data_prc_time = TM500MS ;
    Ad_data_prc();                     //500ms precess once
    sec_time++;
    if(sec_time >= 2)                  //1s time up
       { 
	     hour_time++;
         sec_time = 0;
          
//		 page1_start_addr = Read1B(0x10,0);   //get need baochen address
     
              
              net_count_data_old = net_count_data ;
               if(liuxiang_F == POSITIVE)         //baochen zhenxiang leiji liuliang
               {
//                    p_count_data = p_count_data +moment_data*1.025/3600.0;
                   p_count_data = p_count_data +moment_data*1.012/3600.0;
                    if(hour_time%60 == 0)
                    {
                    	write_data.ad_data = p_count_data;
                    	Write1B(write_data.set_data.first_data,page1_start_addr,1);    //save 
				    	Write1B(write_data.set_data.second_data,page1_start_addr+1,1);
				    	Write1B(write_data.set_data.third_data,page1_start_addr+2,1);
				    	Write1B(write_data.set_data.fouth_data,page1_start_addr+3,1);
				    }
                }
               else                              //baochen fanxiang leiji liuliang
               {
//                    n_count_data +=((moment_data*1.025)/3600.0);
                    n_count_data +=((moment_data*1.012)/3600.0);
                    if(hour_time%60 == 0)
                    {
                    	write_data.ad_data = n_count_data ;
                    	Write1B(write_data.set_data.first_data,page1_start_addr+4,1);
				    	Write1B(write_data.set_data.second_data,page1_start_addr+5,1);
				    	Write1B(write_data.set_data.third_data,page1_start_addr+6,1);
				    	Write1B(write_data.set_data.fouth_data,page1_start_addr+7,1);
				    }
                }
               net_count_data = (p_count_data - n_count_data) ;
               //net_cha += (net_count_data - net_count_data_old)*1.004; 
               net_cha += (net_count_data - net_count_data_old) ;  
               
            
         
     
           
		 	
	     
		       
		       
		 
		 if(hour_time >= ONE_HOUR)       //one hour time up
		     {
		        hour_time = 0;     
				Write1B(page1_start_addr+8,0x10,0);     //save xianzhai dizhi
                page1_start_addr += 8 ;
		//		Self_adjust();
		//		adjust_time = 4 ;
             }
         }
	  }
    

  }
   

/********************************/
/********************************/
void Ad_data_prc(void)
{
  unsigned char filter ;   
  /*if(consult < 0)
    {
    	 liuxiang_F = REVERSE ;
    	 consult = fabs(consult) ;	
    }	     
  else  
    {
       
        liuxiang_F = POSITIVE;
        	  
    }*/
  if(empty_pop_F == EMPTY)
  {
  	moment_data = 0;
  	da_data = 0;
  	liuxiang_F = POSITIVE ;
  	return;
  }
  else
  {
  	filter = Two_square();
    EX0 = 0 ;
  	consult =  consult/filter + (1.0 - 1.0/filter)*consult_old;    //lubo zhixu suanfa
  	consult_old = consult ;
 /* 	 	 
  	if(consult < 0)
    {
    	 liuxiang_F = REVERSE ;
    	 consult = fabs(consult) ;	
    }	 
     
  	else  
    {
       
        liuxiang_F = POSITIVE;
       	
   
    }*/
  }
 // da_data = consult ;               //remained /used for da5615 convert */
    if(zero_symbol == ZERO_POSITIVE)
         consult = consult - zero_code;
    else 
         consult = consult + zero_code ;

  	moment_data = consult * system_k;

    EX0 = 1 ;
 /*   if(zero_symbol == POSITIVE)
        moment_data = moment_data - zero_offset;
    else
        moment_data = moment_data+zero_offset;*/

    if(moment_data < 0)
    {
    	 liuxiang_F = REVERSE ;
    	 moment_data = fabs(moment_data) ;	
    }	 
     
  	else  
    {
       
        liuxiang_F = POSITIVE;
       	
   
    }

    if(moment_data>(lchen_data*1.05))
        moment_data=lchen_data*1.05;
 
    if(moment_data <= lchen_data)
  	    da_data =(unsigned int)( (moment_data*0x7fff)/lchen_data) ;
  	else
  	    da_data = 32767;
 	if(moment_data <= cut_data)
	    {
	    	 moment_data = 0;
	    	 da_data = 0 ;
	    	 liuxiang_F = POSITIVE ;
	    }
  
   return;
  } 

 
 
/********************************/
/*******************************/

float Get_lchen_data(unsigned char address,unsigned char point)
{ 
   USER_SET user_data;
  float value;
  user_data.oneseg = Read1B(address,0);
  user_data.twoseg = Read1B(address+1,0);
  user_data.thrseg = Read1B(address+2,0);
  user_data.fouseg = Read1B(address+3,0);
  value = user_data.fouseg *1000 + user_data.thrseg *100+user_data.twoseg*10+user_data.oneseg ;
if(point == 1)
   value=value/10.0;
else if(point == 2)
   value=value/100.0;
else if(point == 3)
   value = value/1000.0;
return(value);
}
 
/*******************************/
/*******************************/
float Get_alarmup_data(void)
{
 float value;
 USER_SET alarm_data;
 alarm_data.oneseg = Read1B(0x12,0); 
 alarm_data.twoseg = Read1B(0x13,0);
 alarm_data.thrseg = Read1B(0x14,0);
 value = ((float)(alarm_data.thrseg*100+alarm_data.twoseg*10+alarm_data.oneseg)/100.0)*lchen_data;
 return(value);
 }

/*******************************/
/*******************************/
float Get_alarmdm_data(void)
{
 float value;
 USER_SET alarm_data;
 alarm_data.oneseg = Read1B(0x15,0); 
 alarm_data.twoseg = Read1B(0x16,0);
 value = ((float)(alarm_data.twoseg*10+alarm_data.oneseg)/100.0)*lchen_data;
 return(value);
 }

/*******************************/
/*******************************/
 unsigned long int Get_high_data(float fdata)
{
  unsigned int high_data;
   if(dp_point == 1)
        high_data =(unsigned int)(fdata/1000);
   else if(dp_point == 2)
        high_data = (unsigned int)(fdata/100);
   else if(dp_point == 3)
        high_data = (unsigned int)(fdata/10);
   else if(dp_point == 0)
        high_data = (unsigned int)(fdata/10000) ;
   if(high_data >= 99999)
      high_data = 99999 ;
   return(high_data);
   
}

/*********************************/
/*********************************/
unsigned int Get_low_data(float fdata)
{   
    float low_data;
    unsigned long int high_data;
   if(dp_point == 1)
        fdata =fdata*10;
   else if(dp_point == 2)
        fdata = fdata*100;     
   else if(dp_point == 3)
        fdata = fdata*1000;
   
        
   
   
   high_data =(unsigned long int)(fdata/10000);
   low_data = fdata-high_data*10000 ;

   if(low_data >= 9999)
      low_data = 9999;
   return(low_data );
   
}

/*********************************/
/*********************************/
float Get_pn_data(unsigned char start_address)
{
 EE_BUFFER p_data;
 p_data.set_data.first_data = Read1B(start_address,1);
 p_data.set_data.second_data = Read1B(start_address+1,1);
 p_data.set_data.third_data = Read1B(start_address+2,1);
 p_data.set_data.fouth_data = Read1B(start_address+3,1);
 return(p_data.ad_data);
 }


/***********************************/
/******** modify adc_gain **********/
/*void Modify_adc_gain(unsigned char gain)
/*{
	adc_gain = gain ;                    //lchen range reduce one time
    Write1B(adc_gain,0x25,0);                  //baochen now gain at eeprom
    Self_adjust();
    adjust_time = 4 ;                          //delay 200ms
    data_prc_time = TM500MS ;
    return;
} */

⌨️ 快捷键说明

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