📄 readtemp.c
字号:
/*************************************************************************************************************
* 函数名称 :
* 功能描述 :
* 实际参数 :
* 返回值 :
* 说明 :
**************************************************************************************************************/
#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 + -