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

📄 3-0.c

📁 PIC单片机编写显示表头,用于测量脉冲输出式速度信号
💻 C
📖 第 1 页 / 共 2 页
字号:
	
	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 + -