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

📄 math.c

📁 这是一种温度变送器的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
	,	4178			//8.357		700		14
	,	4657			//9.315		750		15
	,	5148			//10.296	800		16
	,	5648			//11.297	850		17
	,	6157			//12.315	900		18
	,	6673			//13.347	950		19
	,	7194			//14.389	1000	20
	,	7824			//15.649	1050	21
	,	8247			//16.494	1100	22
	,	8881			//17.762	1150	23
	,	9303			//18.607	1200	24
	,	9831			//19.662	1250	25
	,	10356			//20.713	1300	26
	,	10878			//21.757	1350	27
	,	11396			//22.793	1400	28
	,	11909			//23.819	1450	29
	,	12416			//24.833	1500	30
	,	12917			//25.834	1550	31
	,	13410			//26.821	1600	32
	,	13895			//27.791	1650	33
	,	14372			//28.744	1700	34
	,	14839			//29.678	1750	35
	,	15295			//30.591	1800	36
	,	15742			//31.484	1850	37
	,	16177			//32.354	1900	38
	,	16600			//33.201	1950	39
	,	17011			//34.023	2000	40
	,	17409			//34.818	2050	41
	,	17793			//35.587	2100	42
	,	18164			//36.328	2150	43
	,	18519			//37.039	2200	44
	,	18860			//37.720	2250	45
	,	19247			//38.495	2300	46
	};
//==============================================================================
// Pt100(RTD)热电阻分度表(℃) //(型号代码:	P100)
//==============================================================================
//	--------------------------------------------------------------------
//		电阻值(Ω)X50	电阻值(Ω)	温度(℃)序号
//	--------------------------------------------------------------------
  int code tab_sn_pt1h[22]=
 {
		926				//18.52		-200	0
	,	1986			//39.72		-150	1
	,	3013			//60.26		-100	2
	,	4015			//80.31		-50		3
	,	5000			//100		0		4
	,	5970			//119.4		50		5
	,	6925			//138.51	100		6
	,	7866			//157.33	150		7
	,	8793			//175.86	200		8
	,	9705			//194.1		250		9
	,	10602			//212.05	300		10
	,	11486			//229.72	350		11
	,	12354			//247.09	400		12
	,	13209			//264.18	450		13
	,	14049			//280.98	500		14
	,	14874			//297.49	550		15
	,	15685			//313.71	600		16
	,	16482			//329.64	650		17
	,	17264			//345.28	700		18
	,	18032			//360.64	750		19
	,	18785			//375.70	800		20
	,	19524			//390.48	850		21
	};
//==============================================================================
// Cu100铜热电阻分度表 //(型号代码:	C100)
//==============================================================================
//	--------------------------------------------------------------------
//		电阻值(Ω)X100	电阻值(Ω)	温度(℃)序号
//	--------------------------------------------------------------------
  int code tab_sn_cu1h[5]=
 {
		7848			//78.48		-50		1
	,	10000			//100.00	0		2
	,	12141			//121.41	50		3
	,	14280			//142.80	100		4
	,	16427			//164.27	150		5
};
//==============================================================================
// Cu50铜热电阻分度表 //(型号代码:	C50)
//==============================================================================
//	--------------------------------------------------------------------
//		电阻值(Ω)X200	电阻值(Ω)	温度(℃)序号
//	--------------------------------------------------------------------
int  code tab_sn_cu50[5]=
 {
		7848			//39.242	-50		1
	,	10000			//50.000	0		2
	,	12140			//60.704	50		3
	,	14280			//71.400	100		4
	,	16426			//82.134	150		5
};
//	--------------------------------------------------------------------
//		分度索引表
//	--------------------------------------------------------------------

int code  tab_sn_ref[15][3]=
{
//	s
		36										//点数
	,	1000									//倍率
	,	-50										//起始点数值
//	r               							
	,	37										//点数      		
	,	1000									//倍率      			
	,	-50										//起始点数值		
//	b												
	,	23										//点数      		
	,	1000									//倍率      			
	,	700										//起始点数值		
//	k												
	,	30										//点数      		
	,	500										//倍率      		
	,	-100									//起始点数值			
//	e												
	,	23										//点数      		
	,	400										//倍率      		
	,	-100									//起始点数值			
//	j												
	,	27										//点数      		
	,	400										//倍率      		
	,	-100									//起始点数值			
//	n												
	,	29										//点数      		
	,	500										//倍率      		
	,	-100									//起始点数值			
//	t												
	,	11										//点数      		
	,	1000									//倍率      			
	,	-100									//起始点数值			
//	tu3												
	,	47										//点数      		
	,	500										//倍率      		
	,	0										//起始点数值		
//	tu5												
	,	47										//点数      							
	,	500										//倍率      		
	,	0										//起始点数值		
//	tu20																											
	,	41										//点数      		
	,	1000									//倍率      			
	,	0										//起始点数值		
//	tu26												
	,	47										//点数      		
	,	500										//倍率      		
	,	0										//起始点数值		
//	pt100												
	,	22										//点数 		
	,	50										//倍率  							
	,	-2000									//由于精度原因 * 10, 应为 -200
//	cu100					
	,	5										//点数 
	,	100										//倍率  
	,	-500									//由于精度原因 * 10, 应为 -50
//	cu50										
	,	5										//点数 
	,	200										//倍率  
	,	-500									//由于精度原因 * 10, 应为 -50
};

//=========================================================================================
//阻型电阻表
 int unsigned code  Tab_rt[5]=  //wint
{
			18
	,		70
	,		170
	,		270
	,		350
	
};

/*************************************************************************************
	函数名			mat_scale
	功能			标度变换
	入口条件		tt				目标标度高端
					tb				目标标度低端
					st				源标度高端
					sb				源标度低端											
**************************************************************************************/	
int mat_scale(int  temp_value)   //stt
	{
		if(temp_value>st)
			{	
				temp_value=st;
			}
		if(temp_value<sb)
			{
				temp_value=sb;
			}
			return mat_calculate(temp_value,1);
	}

int mat_calculate(int temp_value,int multiple)
{
	calculate=(long)(temp_value-sb)*(tt-tb)*multiple/(st-sb)+tb*multiple;//
	return (int)calculate;	
}

/**************************************************************************************
	函数名			mat_du_add	
	功能			对当前的温度进行修正,根据du0,duf,sc0,scf进行修正	
	入口条件		当前的温度
	出口条件		修正后的温度	
***************************************************************************************/	
int mat_du_add(int temp_value)
{	
	int data cycle_value;
	cycle_value=temp_value;
	tb=ref_table[ref_du0]+1000;
	tt=ref_table[ref_duf]+1000;
	sb=ref_table[ref_sc0];
	st=ref_table[ref_scf];
	temp_value=	mat_scale(temp_value);	
	return 	(temp_value+cycle_value-1000);
}

/****************************************************************************************
	函数名			choose_range
	功能			根据分度号类型和量程选择不同的AD放大倍数
	//////current 指向要查的表项
****************************************************************************************/		
void choose_range(void)
{
	unsigned char data temp=ref_table[ref_sn];
	switch(temp)
			{
				//	s
				case 0: current=tab_sn_s;   // 铂铑10-铂热电偶分度表(℃) ;( 型号代码:	S )
					choose_range_sub(1700,0,0,0);    
					break;   							
				//	r               							
				case 1: current=tab_sn_r;
					choose_range_sub(1750,0,0,0); 		 
					 break;										
				//	b												
				case 2: current=tab_sn_b;
					choose_range_sub(1800,0,0,0); 		  
					break;										
				//	k												
				case 3: current=tab_sn_k;	
					choose_range_sub(484,967,1350,0);	  
					break;										
				//	e												
				case 4: current=tab_sn_e;	
					choose_range_sub(286,536,787,1000);		
					break;									
				//	j												
				case 5: current=tab_sn_j;
					choose_range_sub(366,713,1034,1200);			
					break;								
				//	n												
				case 6: current=tab_sn_n;
					choose_range_sub(584,1100,1300,0);			
					break;									
				//	t												
				case 7: current=tab_sn_t;	
					choose_range_sub(400,0,0,0); 		
					break;									
				//	tu3												
				case 8: current=tab_sn_tu3;
					choose_range_sub(1089,2300,0,0);	  
					break;									
				//	tu5												
				case 9: current=tab_sn_tu5;	
					choose_range_sub(1096,2300,0,0); 
					break;														
				//	tu20																											
				case 10: current=tab_sn_tu20;
					choose_range_sub(1254,2000,0,0);	
					break;														
				//	tu26												
				case 11: current=tab_sn_tu26;
					choose_range_sub(1266,2300,0,0);	
					break;								
				//	pt100												
				case 12: current=tab_sn_pt1h;
					choose_range_sub(0,185,467,850); 	
					break;		
				//	cu100					
				case 13: current=tab_sn_cu1h;
					choose_range_sub(0,150,0,0); 	
					break;			
				//	cu50										
				case 14: current=tab_sn_cu50; 
					choose_range_sub(150,0,0,0); 
					break;
			}

}
/*----------------------------------------------------------*/
///ref_table_temp[40]//参数存储数组
///ref_scf = 3  标称/变送的高端
////led_degree///	//计算出来的温度值
////degree_overflow   0x7fff     //表示这个数值不再显示
/*-----------------------------------------------------------*/
void choose_range_sub(unsigned int a,unsigned int b,unsigned int c,unsigned int d)
{
	unsigned int data temp=ref_table[ref_scf]; //量程上限  
	ADC0MD = 0x80; // 使能ADC0 ADC0=空闲模式
	b_o_flag=1;
	if(ref_table[ref_sn]>=rt_start)
		{
			
			temp=temp/10;				//阻型
		}	
			
	if(temp<a)//10mv
		{
			ADC0CN = 0x16;//3;       //////增益8
  	 		volt_range=1;
  	 		ADC0MD |= 0x83;     // 启动连续转换       
  	 		return;
		}
	if(temp<b)//20mv
		{
			ADC0CN = 0x15;//2;    /////// 增益4
  	 		volt_range=2;
  	 		ADC0MD |= 0x83;     // 启动连续转换
  	 		return;
		}
	if(temp<c)//40mv
		{
			ADC0CN = 0x14;//1;
  	 		volt_range=3;      ////////增益2
  	 		ADC0MD |= 0x83;     // 启动连续转换
  	 		return;
		}
	if(temp<d)//80mv
		{
			ADC0CN = 0x14;//0;     ////////增益1
  	 		volt_range=4;
  	 		ADC0MD |= 0x83;     // 启动连续转换
  	 		return;
		}
	ADC0CN = 0x10;
  	volt_range=4;
  	//led_degree=sc_overflow;
  	b_o_flag=0;
   ADC0MD |= 0x83;     // 启动连续转换
	
}

/********************************************
函数名: temp_proccess
功能: 数据处理
形式参数:无
返回值:无
********************************************/
void temp_process(void)
{
	unsigned char data cycle_value;
	unsigned char data temp=ref_table[ref_sn];
	unsigned char data counter=volt_range+1;	
	//int data temp_value;
	if(temp>=rt_start)  //  0为阻处理
	{
		t_flag=0;
		cal_mod_value=Adc0_hdl(0x67);
		//			led_degree=cal_mod_value;
		//return;
		if(cal_mod_value>0x6d00)//0x0614)//
		{
			//t_flag=1;//下断线
			led_degree=degree_brok;
			return;//goto end;												
		}
		else						
		{		
			//temp_value=tab_sn_ref[ref_table[ref_sn]][1];
			ref_buffer=ref_rt1+volt_range-1;  //选择头地址
			for(cycle_value=0;cycle_value<counter;cycle_value++)
			{
				if(ref_table[ref_buffer]>cal_mod_value)
					break;
				ref_buffer +=4-cycle_value;   //遍历查表相关值
			}
			if(cycle_value==counter)		  //超上限时的处理,始终使ref_buffer存的为较大值
			{
				cycle_value--;
				ref_buffer -=(4-cycle_value);				
			}
			if(cycle_value==0)
			{
				cycle_value++;
				ref_buffer +=4;     //超下限的处理,始终使ref_buffer存的为较大值
			}
		
			tt=Tab_rt[cycle_value];		//阻值查询的高		
			tb=Tab_rt[cycle_value-1];	//阻值查询的低
			st=ref_table[ref_buffer];  //AD 值高
			sb=ref_table[ref_buffer-(5-cycle_value)];//4-(cycle_value-1)
			cal_mod_value=mat_calculate(cal_mod_value,tab_sn_ref[temp][1]);
		//					led_degree=cal_mod_value;
		//return;	
		}				 							
	}			
	else						//偶型
	{	
		t_flag=1;
		cal_mod_value=Adc0_hdl(0x45);
		if(cal_mod_value<0)
		{
			//t_flag=0;			//下断线
			led_degree=degree_brok;
			return;//goto end;	
		}
		else
		{	
			tt=20*volt_range;
			tb=0;
			st=ref_table[ref_tcf+volt_range-1];
			sb=ref_table[ref_tc0+volt_range-1];
			cal_mod_value=mat_calculate(cal_mod_value,tab_sn_ref[temp][1]);
		}			
	}	
		//led_degree=cal_mod_value;
		//return;
	//查表   偶阻公共部分
	for(cycle_value=0;cycle_value<tab_sn_ref[temp][0];cycle_value++)
	{
		if(*current<cal_mod_value)
			{current++;}
		else break;
	}

	//阻处理
	if(t_flag==0)
		{
			if(cycle_value==tab_sn_ref[temp][0])  //上断线处理 0为点数
				{
					led_degree=degree_overflow;
					return;//goto end;
				}
			if(cycle_value==0)	//下断线处理,
				{					
					led_degree=degree_overflow;
					return;//goto end;
				}	
			//正常							
			tt=500;
			tb=0;
			st=*current;										
			current--;
			sb=*current;					
			cal_mod_value=mat_scale(cal_mod_value);
			cycle_value--;								
			cal_mod_value=500*cycle_value+tab_sn_ref[temp][2]+cal_mod_value;  //safe					
		}
			
	else
		{
			if(cycle_value==tab_sn_ref[temp][0])  //上断线处理
				{
					//t_flag=1;//上断线
					led_degree=degree_overflow;
					return;//goto end;
				}
			if(cycle_value==0)										//下断线处理
				{					
					//t_flag=0; // 下断线
					led_degree=degree_overflow;
					return;//goto end;
				}
			//正常					
			tt=50;
			tb=0;
			st=*current;
			current--;
			sb=*current;
			cal_mod_value=mat_scale(cal_mod_value);				
			cycle_value--;
			cal_mod_value=50*cycle_value+tab_sn_ref[temp][2]+cal_mod_value;  //safe					
			//mat_t_fb();
			//cal_mod_value +=run_t;
		}
		//du修正 偶阻公共部分
		cal_mod_value=mat_du_add(cal_mod_value);
		//显示温度值 偶阻公共部分
		led_degree=cal_mod_value;
		//lcd_show_dec(cal_mod_value)
	} 

⌨️ 快捷键说明

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