📄 dataprc.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 + -