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

📄 readtemp.c

📁 原创
💻 C
📖 第 1 页 / 共 2 页
字号:

/*************************************************************************************************************
*	函数名称 :
*	功能描述 :
*	实际参数 :
*	返回值   :
*	说明     :
**************************************************************************************************************/
    #include <iom16v.h>
    #include <macros.h>  
	#include "Temp.h"   
	
	uint8 Road_Dat ;							// 路数
	uint8 Read_Number ;							// 读温度次数
	uint8 Relay_Number = 0 ;					// 每通一个继电器,读温度次数
	uint8 Read_Time ;				   

	uint8	Time_Int ;		   					// 最小时间定时0.1
	uint8	Old_Time_Int ;	

	uint8  SiteFack_Temp ;  					// 存储设置温度与实际温度相差几度才开始运算 																/* 存储第一路温度在与设置温度差15时,开始控制加温 */	uchar code Road_5s_dat _at_ 0xff01;   					/* 存储第一路温度以5S一个周期控制温度 */
	uint8  Check_TempTimeCycle ;

	uint16  All_Temp[TEMP_NUMBER][ALL_READ] ;				
	
	uint8 Thermocouple_Open[TEMP_NUMBER] ;		// 5路热电偶断开标志

	uint16  Fact_Temp[TEMP_NUMBER] ;				// 5路最终平均后的实际温度
	uint16  Disp_Temp[TEMP_NUMBER] ;				// 实际显示值		
	
	uint16  New_Temp[TEMP_NUMBER] ;				// 瞬间值(最新读出的温度值)

	uint16  Check_TempTime[TEMP_NUMBER] ;			// 检测温度周期时间
	uint16  Old_NewTemp[TEMP_NUMBER] ;			// 在前一周期的瞬间时间
	uint16  HeatUp_Time[TEMP_NUMBER] ;			// 加热时间	
	uint16  Site_Temp[TEMP_NUMBER] ;			    // 设置温度数据	   

	uint8  SiteFack_Temp ; 						// 存储设置温度与实际温度相差几度才开始运算 																/* 存储第一路温度在与设置温度差15时,开始控制加温 */	uchar code Road_5s_dat _at_ 0xff01;   					/* 存储第一路温度以5S一个周期控制温度 */
	uint8  Check_TempTimeCycle;  				// 检测温度时间周期 

	uint8  Road_AdhystSign[TEMP_NUMBER] ;    	// 第一路修正符号,0为加修正值,1为减修正值

	uint8  Road_AdjustDat[TEMP_NUMBER] ;		// 第一路校正值/



/*************************************************************************************************************
*	函数名称 :
*	功能描述 :
*	实际参数 :        
*	返回值   :
*	说明     :	延时子程序 
**************************************************************************************************************/
 
	void Delay0(uint16 a)
	{
		uint8 x ;
	
		for (;a > 0;a--)
		{
			x = 200 ;
			do{x = (x - 1);}
			while (x > 1);
		}
	}
	
/*************************************************************************************************************
*	函数名称 :
*	功能描述 :
*	实际参数 :
*	返回值   :	平均后的实际温度值
*	说明     :	排序,从小到大,在求平均值,
**************************************************************************************************************/
	
	 uint16 FactTempDat(uint16 *addata,uint8 a)						
	{ 					
		uint8 i,j ;
		uint16 t ;												// 排序中的暂存器
		uint16 average_data ;	
		
		average_data = 0 ;							

		for(i = 0;i < a;i++)
		{
			for(j = 0;j < (a -1)-i;j++)
			{			
				if(addata[j] > addata[j + 1])
				{	
					t = addata[j];
					addata[j] = addata[j + 1];
					addata[j + 1] = t;
				}
			}
		} 

		for (i = CLE_TEMPDAT;i < (a - CLE_TEMPDAT);i++)			// 去掉头尾CLE_TEMPDAT个数值求平均值
		{
			average_data += *(addata + i) ;						// 求和
		}		

		j = (a - (CLE_TEMPDAT * 2)) ;		
		t = average_data / j ;
							  	
		addata[a  - 1] =  addata[CLE_TEMPDAT] ;					// 把排列在中间的数值移到后面,为下次求平均用
		addata[a  - 2] =  addata[CLE_TEMPDAT + 1] ;
 
		return(t) ;		
	}

/*************************************************************************************************************
*	函数名称 :  uint ChangeTemp(uint ack_data,uint sit_temp)
*	功能描述 :
*	实际参数 :
*	返回值   :	 
*	说明     :	 处理发送温度数据子程序,
**************************************************************************************************************/

	uint16 ChangeTemp(uint16 ack_data,uint16 sit_temp)
	{
		uint8 temp ;
		uint16 temp_dat; 		
		
		temp_dat = (ack_data >> 2) ;								// 取整数,去小数点
		temp = (uint8)(ack_data & 0x03) ;

 	    if (temp >= 2)												// 四舍五入,2 X 0.25 = 0.5 度
			temp_dat++ ;
		
		if (sit_temp)												// 设置温度不为0时			
		if (temp_dat > sit_temp)									// 实际温度比设置温度大时,
		{
			if (temp_dat > (sit_temp + 3))
			{
				temp_dat -= 3 ;
			} 
			else
			{
				temp_dat = sit_temp ;
			} 				
		}

		return(temp_dat) ;
	} 

/*************************************************************************************************************
*	函数名称 : void NewTemp(uint temp0_dat,uint temp1_dat)
*	功能描述 :
*	实际参数 :
*	返回值   :
*	说明     : 求瞬间温度,每次继电器打通的平均值(每打通一次,读两次温度,才换下个继电器)
**************************************************************************************************************/
	
	void NewTemp(uint16 temp_dat,uint8 road,uint8 number)
	{			
		uint8 d ;  
		uint16 dat ;
	
		if (!(temp_dat & 0x0001))
		{		
			dat = (All_Temp[road][number] + All_Temp[road][number - 1]) ; // 放大十倍,0.25度
		//	temp_dat >>= 1 ;					   			// 去掉断线标志(保留了小数点位,所以实际的温度为增大了4倍)
			New_Temp[road] =  (dat >> 1) ; 		// 此温度值是大了4倍
			if (Thermocouple_Open[road] == TEMP_OPEN)
	    		Thermocouple_Open[road] = TEMP_CLOSE ;	// 没断线标志,0x00为不加热,0x11为加热
		}
		else
		{
			New_Temp[road] = 0 ;						// 有断线,温度为0 	
	
			Thermocouple_Open[road] = TEMP_OPEN ;		// 断线标志,为0x22

			for (d = 0;d < ALL_READ;d++)
				All_Temp[road][d] = 0 ;				    // 全清零
		}	 
	}

/*************************************************************************************************************
*	函数名称 :
*	功能描述 :
*	实际参数 :
*	返回值   :
*	说明     :	读出MAX6675温度数据
**************************************************************************************************************/
				 
    void ReadTempDat(void)
   	{  	      
		uint16 temp_dat ;	
		uint16 temp_dat1 ;
		static uint8  Read_Number = 0 ;	
		
		// 停止MAX6675转换 
		TempCs(OFF) ;
		temp_dat = TempRead6675Dat() ;

		if(temp_dat & 0x01)   // 断线检测 
           temp_dat = 0x01 ;  // 断线,温度为0度	
		   
		// 修正
		temp_dat1 = temp_dat >> 1 ;

		if (Road_AdhystSign[Road_Dat])		 // 方向
		{	  // 减修正温度
			if (Road_AdjustDat[Road_Dat] > MAX_ADJUSTDAT) 		// 保护最大值
			{
				Road_AdjustDat[Road_Dat] = MAX_ADJUSTDAT ;
			}

			if (temp_dat1 > Road_AdjustDat[Road_Dat])			// 当前值大于修正值
				temp_dat1 -= (Road_AdjustDat[Road_Dat] << 2) ;
			else
				temp_dat1 = 0 ;
		}
		else	 // 加修正温度
			temp_dat1 += (Road_AdjustDat[Road_Dat] << 2) ;   			 		
		
		All_Temp[Road_Dat][Read_Number] = temp_dat1 ;			// 第一个MAX6675温度值(从MAX6675读出来的温度是带小数点2位和1位断线标志的) 			

		Read_Number++ ;			  								// 读第二次
		Relay_Number++ ;										// 每通一次继电器读温度次数(现在规定位2次)	
		if (Relay_Number > 1)
		{
			Relay_Number = CLEAR ;								// 清读温度次数	   		

			TempRelayOnoff(0x00,0) ;							// 释放所有继电器  	
			
			NewTemp(temp_dat,Road_Dat,Read_Number) ;			// 读完两次后求瞬间值,在控温里要用来比较		

			if (Read_Number >= 4)								// 读完4次温度新值(平均值)
			{
				Fact_Temp[Road_Dat] = FactTempDat(&All_Temp[Road_Dat][0],ALL_READ) ;
				Disp_Temp[Road_Dat] = ChangeTemp(Fact_Temp[Road_Dat],Site_Temp[Road_Dat]) ;		// 转换温度	 
				
				if (Road_Dat == (TEMP_NUMBER -1)){
				   Read_Number = 0 ;
				   rftempdata();       				   		
				}			
			}				
				

⌨️ 快捷键说明

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