📄 3-0.c
字号:
for(i=0;i<4;i++)
{da_ee[i]=eeprom_read(231-i);clrwdt();nop();}
a=da_ee[0]*1000;
b=da_ee[1]*100;
c=da_ee[2]*10;
F3=a+b+c+da_ee[3];clrwdt();
for(i=0;i<8;i++)
{da_ee[4+i]=eeprom_read(227-i);clrwdt();nop();}
d=da_ee[4]*1000;clrwdt();
e=da_ee[5]*100;clrwdt();
d=(d+e)*100;
a=da_ee[6]*1000;clrwdt();
b=da_ee[7]*100;clrwdt();
c=da_ee[8]*10;clrwdt();
K3=da_ee[9]+c+b+a+d;clrwdt();
for(i=0;i<4;i++)
{da_ee[i]=eeprom_read(183-i);clrwdt();nop();}
a=da_ee[0]*1000;clrwdt();
b=da_ee[1]*100;clrwdt();
c=da_ee[2]*10;clrwdt();
pulout=a+b+c+da_ee[3];clrwdt();
if(pulout>1000)
{pulout=1000;}
for(i=0;i<4;i++)
{da_ee[i]=eeprom_read(255-i);clrwdt();nop();}
a=da_ee[0]*1000;
b=da_ee[1]*100;
c=da_ee[2]*10;
F1=a+b+c+da_ee[3];clrwdt();
for(i=0;i<8;i++)
{da_ee[4+i]=eeprom_read(251-i);clrwdt();nop();}
d=da_ee[4]*1000;clrwdt();
e=da_ee[5]*100;clrwdt();
d=(d+e)*100;
a=da_ee[6]*1000;clrwdt();
b=da_ee[7]*100;clrwdt();
c=da_ee[8]*10;clrwdt();
K1=da_ee[9]+c+b+a+d;clrwdt();
}
void Caculate_pre()
{
x2=TMR1H;
x2<<=8; clrwdt();
x2+=TMR1L;
fr=x2-x1;
clrwdt();
}
void Caculate(){
int b,c;
float d;
x1=x2;
if(fr>60000) //实验证明有跳变,60000为实验数据,限制脉冲跳变
{fr=frqian;}
frqian=fr;
// if(K1==0)
// {
// Q2=fr;
// Q3INT+=fr;
// disp_buf[12]=0x0e;
// }
// else
// {
disp_buf[12]=0x01;
if(fr<=F1)
{K=K1;nop();clrwdt();} //按降序排列列{Q1=Q1*3600/K3;} clrwdt();
else if(fr<=F2)
{//K=((K2-K1)*(fr-F1)/(F2-F1)+K1);
// a=K2-K1; nop();
b=F2-F1; clrwdt();
c=fr-F1; nop();
clrwdt(); //
d=(K2-K1)*c/b; nop();
clrwdt(); //
K=d+K1; nop();clrwdt();
}
else if(fr<=F3)
{//K=((K3-K2)*(fr-F2)/(F3-F2)+K2);
// a=K3-K2; nop();
b=F3-F2; clrwdt();
c=fr-F2; nop();
clrwdt(); //
d=(K3-K2)*c/b; nop();
clrwdt(); //
K=d+K2; nop();clrwdt();
}
else if(fr<=F4)
{//K=((K4-K3)*(fr-F3)/(F4-F3)+K3);
// a=K4-K3; nop();
b=F4-F3; clrwdt();
c=fr-F3; nop();
clrwdt(); //
d=(K4-K3)*c/b; nop();
clrwdt(); //
K=d+K3; nop();clrwdt();
}
else if(fr<=F5)
{//K=((K5-K4)*(fr-F4)/(F5-F4)+K4);
// a=K5-K4; nop();
b=F5-F4; clrwdt();
c=fr-F4; nop();
clrwdt(); //
d=(K5-K4)*c/b; nop();
clrwdt(); //
K=d+K4; nop();clrwdt();
}
else if(fr<=F6)
{//K=((K6-K5)*(fr-F5)/(F6-F5)+K5);
// a=K6-K5; nop();
b=F6-F5; clrwdt();
c=fr-F5; nop();
clrwdt(); //
d=(K6-K5)*c/b; nop();
clrwdt(); //
K=d+K5; nop();clrwdt();
}
else
{
K=K6; nop();clrwdt();
}
if(F2==0||K2==0)
{K=K1;}
else if(F3==0&&fr>F2)
{K=K2;}
if(set1==3&&fr>F3&&F3!=0)
{K=K3;}
if(set1==4&&fr>F4&&F4!=0)
{K=K4;}
if(set1==5&&fr>F5&&F5!=0)
{K=K5;}
qqq=fr/K;
Q2=3600*qqq;nop();clrwdt();
Q3DEC+=qqq; nop(); clrwdt();
// }
qqq=1000*qqq;
Qpdec+=qqq;
// Qpdec+=fr;
if(Qpdec>=1)
{mm=Qpdec;
Qpint+=mm;
Qpdec=Qpdec-mm;}
mpul=Qpint/pulout;
// mpul=Qpint/10;
if(mpul!=npul)
{numct=mpul-npul;
TMR2ON=1;}
npul=mpul;
if(ti>5)
ti=1;
switch(ti)
{case 1:b0=Q2;
break;
case 2:b1=Q2;
break;
case 3:b2=Q2;
break;
case 4:b3=Q2;
break;
case 5:b4=Q2;
break;
default:
break;
}
Q1=b0+b1;clrwdt();
Q1=Q1+b2;clrwdt();
Q1=Q1+b3;clrwdt();
Q1=Q1+b4;clrwdt();
Q1=Q1/5;clrwdt();
Q2=Q1;
if(Q3DEC>=1)
{
mm=Q3DEC; clrwdt();
Q3INT+=mm;
Q3DEC-=mm; clrwdt();
}
}
void Dis_Buf() //写显示缓冲
{
if(Q2>=10000)
{disp_buf[3]=19; clrwdt();//超出10000,就显示9999.
clrwdt();
disp_buf[2]=9;
clrwdt();
disp_buf[1]=9;
clrwdt();
disp_buf[0]=9;
}
else if(Q2>=1000)
{Q2d=Q2; clrwdt();
disp_buf[3]=Q2d%10; clrwdt();//以下D~A语句置于if(flag_tmr0){中则不可以
Q2d/=10; clrwdt();
disp_buf[2]=Q2d%10;
Q2d/=10; clrwdt();
disp_buf[1]=Q2d%10;
Q2d/=10; clrwdt();
disp_buf[0]=Q2d%10;
}
else if(Q2>=100) //瞬时值取各字符
{Q2d=Q2*10;
disp_buf[3]=Q2d%10; clrwdt();//
Q2d/=10; clrwdt();
disp_buf[2]=(Q2d%10)+10;//0显示字符且带小数点
Q2d/=10;clrwdt();
disp_buf[1]=Q2d%10;
Q2d/=10; clrwdt();
disp_buf[0]=Q2d%10;
}
else if(Q2>=10)
{Q2d=Q2*100;
disp_buf[3]=Q2d%10; clrwdt();//瞬时值取各字符
Q2d/=10; clrwdt();
disp_buf[2]=Q2d%10;
Q2d/=10;clrwdt();
disp_buf[1]=(Q2d%10)+10;//0显示字符且带小数点
Q2d/=10; clrwdt();
disp_buf[0]=Q2d%10;
}
else
{Q2d=Q2*1000; clrwdt();
disp_buf[3]=Q2d%10; clrwdt();//以下D~A语句置于if(flag_tmr0){中则不可以
Q2d/=10; clrwdt();
disp_buf[2]=Q2d%10;
Q2d/=10; clrwdt();
disp_buf[1]=Q2d%10;
Q2d/=10; clrwdt();
disp_buf[0]=(Q2d%10)+10;
}
//累计值取各字符,
Q3nd=Q3INT;
disp_buf[9]=(Q3nd%10)+10; clrwdt();
Q3nd/=10;
disp_buf[8]=Q3nd%10; clrwdt();
Q3nd/=10;
disp_buf[7]=Q3nd%10; clrwdt();
Q3nd/=10;
disp_buf[6]=Q3nd%10; clrwdt();
Q3nd/=10;
disp_buf[5]=Q3nd%10; clrwdt();
Q3nd/=10;
disp_buf[4]=Q3nd%10; clrwdt();
Q3ud=Q3DEC*100;
disp_buf[11]=Q3ud%10;clrwdt();//正数第二位数字带小数点
Q3ud/=10;
disp_buf[10]=Q3ud%10;
clrwdt();
}
void Caculate_Q3() //计算累计流量Q3,误差小,允许
{
Q3=Q3INT+Q3DEC;
}
void Read_Sum_flux() //读累计流量,问题是,只有运行一段时间才能读的出来
{
save_adr=eeprom_read(0);clrwdt();
if(save_adr==0||save_adr>169)
{
save_adr=0x01;
Q3INT=0;
Q3DEC=0;
Q3=0;
eeprom_write(save_adr,0);clrwdt();
eeprom_write(save_adr+1,0);clrwdt();
eeprom_write(save_adr+2,0);clrwdt();
}
else
{
y[0]=eeprom_read(save_adr); clrwdt();
y[1]=eeprom_read(1+save_adr);
y[2]=eeprom_read(2+save_adr); clrwdt();
p2=(float *)y;
Q3=*p2;
Q3INT=(ulong)Q3;
Q3DEC=Q3-Q3INT;
clrwdt();
}
}
void Lcd_Dispay() //液晶显示器显示
{ uchar i;
if(flag_set==1)
{Lcd_Write_Data_Q_or_P(0x00); clrwdt();}
else
{Lcd_Write_Data_Q_or_P(disp_buf[12]); clrwdt();} //显示Q1,或P
for(i=0;i<4;i++)
{Lcd_Write_Data_Contin_u(Ladr[i],disp_buf[i]); clrwdt();}
for(i=0;i<8;i++)
{Lcd_Write_Data_Contin_n(Ladr[4+i],disp_buf[4+i]); clrwdt();}
}
void Cumulation_to_EEPROM() //存累计流量Q3
{
p1=(uchar *)&Q3;
x[0]=*p1;clrwdt();
p1++;
x[1]=*p1;clrwdt();
p1++;
x[2]=*p1;clrwdt();
if(flag_set==0)
{pass_time+=1;
if(pass_time>10)
{
pass_time=0;
save_time+=1;
if(save_time>57) //存57次后移一位EEPROM地址
{
save_time=0;
save_adr+=3;
if(save_adr>164)
{
save_adr=1;
clrwdt();}
eeprom_write(0,save_adr);clrwdt();
}
eeprom_write(save_adr,x[0]);clrwdt();
eeprom_write(1+save_adr,x[1]); clrwdt();
eeprom_write(2+save_adr,x[2]); clrwdt();
}
}
}
void Sum_Q_Clear() //累计流量清0
{
if(key_f)
{flag_mid=0;
Q3INT=0;
Q3DEC=0;
}
if(Q3>=99999999) //累计值超过10000000时清0,从头开始计数
{Q3INT=0;
Q3DEC=0;
//Q3=0;
}
}
void Parameter_Set() //设置仪表系数模块
{uchar i;
if(key_f)
{n2=m2^key_f;nop();clrwdt();
if(n2)
{
no_f++;
time_sr=0;nop();clrwdt();
if(no_f>set1+1)
{
no_f=1;
}
}
}
m2=key_f;
switch(no_f) //确定并读出某一点系数
{
case 1: eeadr=255;
break;
case 2: eeadr=243;
break;
case 3: eeadr=231;
break;
case 4: eeadr=183;
break;
default:
break;
}
if(no_f==set1+1)
{clrwdt(); nop();
for(i=0;i<4;i++)
{disp_buf[i]=eeprom_read(183-i); clrwdt();}
// disp_buf[4]=20;
// disp_buf[5]=20;
for(i=0;i<8;i++)
{disp_buf[4+i]=20; clrwdt();}
}
else
{
for(i=0;i<12;i++)
{disp_buf[i]=eeprom_read(eeadr-i); clrwdt();}
disp_buf[9]=eeprom_read(eeadr-9)+10;nop();clrwdt();
}
Lcd_Write_Data_Contin_u(Ladr[12],no_f);nop();clrwdt();//表明点数
if(key_sr)
{n3=m3^key_sr; nop();clrwdt();
if(n3)
{
time_sr+=1; nop();clrwdt();
if(no_f==set1+1)
{
if(time_sr==4)
{time_sr=0;}
}
if(time_sr>11)
{time_sr=0;}
}
}
m3=key_sr;
disp=disp_buf[time_sr];
if(key_add)
{n4=m4^key_add;
if(n4)
{
disp_buf[time_sr]+=1; nop();clrwdt();
if(no_f<set1+1)
{
if(time_sr==9)
{if(disp_buf[time_sr]>19)
disp_buf[time_sr]=10;
}
else
{if(disp_buf[time_sr]>9)
{
disp_buf[time_sr]=0;//带不带小数点,可归纳为该同一表达式
nop();clrwdt();}
}
}
else
{if(disp_buf[time_sr]>9)
{
disp_buf[time_sr]=0;//带不带小数点,可归纳为该同一表达式
nop();clrwdt();}
}
}
}
m4=key_add;
if(disp!=disp_buf[time_sr])
{if(no_f<set1+1)
{eeprom_write(eeadr-time_sr,disp_buf[time_sr]);nop();clrwdt();
eeprom_write(eeadr-9,disp_buf[9]-10);nop();clrwdt();}
else
{eeprom_write(183-time_sr,disp_buf[time_sr]);nop();clrwdt();}
}
if(flag_turn) //闪烁
{
disp_buf[time_sr]=20;
// flag_tmr1=0;
}
}
void Eeprom_Initia()
{ uchar i;
i=0;
jc=eeprom_read(255);
jm=eeprom_read(178);
if(jc==0xFF)
{
do
{
eeprom_write(255-i,0);nop();clrwdt();
i++;
}while(jm==0xFF);
}
}
/*
void ccp2_out()
{ if(Q2>=Qfull)
{gao=1023;}
else
{ //默认值自己设定
gao=1024*Q2/Qfull; clrwdt();
}
ff=gao;
ff<<=4;
cp=ff&0x30;
CCP2CON=0x0C|cp;
gao>>=2;
CCPR2L=gao;
PR2=0xFF;
TRISC=0x01;
T2CON=0x04;
}
*/
void main(void)
{
TRISB=0xf0;
TRISC=0x01;
Eeprom_Initia();
nop();
Lcd_Init();
Timer_Init();
//T2CON=0x04;
//CCP2CON=0x0C;
loop: nop();
Read_Sum_flux();
nop();nop();nop();
Read_Fre_K();
nop();
pass_time=0;
flag_mid=0;
while(1){
// ccp2_out();
Caculate_pre();
if(key_f_sr)
{n1=m1^key_f_sr;
if(n1)
{time_f_sr+=1;
flag_set^=key_f_sr;
}
}
m1=key_f_sr;
if(flag_set==1)
{Parameter_Set();//设置仪表系数
Lcd_Dispay();
}
if(time_f_sr>1)
{
time_f_sr=0;
Lcd_Black();//黑平刷新一下
goto loop;}//flag_set=0;//退出仪表系数设置有效退出
// flag_tmr1=0;
if(flag_tmr0)
{
flag_tmr0=0;
ti++;
Caculate();
Q3INT=pulout;
// Q3DEC=K1-Q3INT;
Dis_Buf();
nop();
RB0=0;
Caculate_Q3();
Sum_Q_Clear();
Cumulation_to_EEPROM();
if(flag_set==0)
{
nop();
Lcd_Dispay();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -