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

📄 temp_mod.c

📁 msp430F435做的医疗器械,包括语音模块,知识源于网络
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************
            discrible:温度计算主程序

            author   :Ye Yun Kai

            date     :05.04.15(yy.mm.dd)
****************************************************************/
#include "msp430x42x.h"
#include "Sys_data.h"
#include "Sys_fun.h"


void Temp_Mod(void)
{
    unsigned char M_temp_Sub,H_temp_Sub,L_temp_Sub;
    unsigned char i,temp_A;
    unsigned char In_Temp1,In_Temp0,Out_Temp1,Out_Temp0;

    P2OUT |= 0x08;             //开启温度测试电路电源
    Delay(10);                 //延时 20*4 ms

    SD16CTL |= 0x0008;         //开启bit.3:即Vmin (bit.3影响功耗)

    SD16CCTL0 |= 0x0002;       //通道0启动转换
    SD16CCTL1 |= 0x0002;       //通道1启动转换
    SD16CCTL2 |= 0x0002;       //通道2启动转换

//    IE2 |= BTIE;             // Enable BT interrupt//测SD采样一次所用时间用
//    key_timers = 0;
    
//----------排序算法拿到中断外面来,减少中断执行时间,防止丢脉冲(50次排序算法需:80ms;30次排序算法需:30ms)
    if(BasicSamps>=100)//校准采样
    {
        Value_Mem0 = Sum_samp0/BasicSamps;           //BasicSamps次求平均
        Value_Mem1 = Sum_samp1/BasicSamps;           //BasicSamps次求平均
        Value_Mem2 = Sum_samp2/BasicSamps;           //BasicSamps次求平均            
    }
    else
    {
        Queue_SDvalue();//对3个SD数组中的SD值进行排序,并取中间30个值累加        
        Value_Mem0 = Sum_samp0/(BasicSamps-20);      //BasicSamps次求平均
        Value_Mem1 = Sum_samp1/(BasicSamps-20);      //BasicSamps次求平均
        Value_Mem2 = Sum_samp2/(BasicSamps-20);      //BasicSamps次求平均
    }

    Sum_samp0 = 0;                               //清0
    Sum_samp1 = 0;                               //清0
    Sum_samp2 = 0;                               //清0
//------------------------------------------------------------------------------------------------------

    BasicValue[0] = (unsigned char)Value_Mem0;            //基准口温度SD值
    BasicValue[1] = (unsigned char)(Value_Mem0 >> 8);

    In_SD16Value[0] = (unsigned char)Value_Mem1;          //进口温度SD值
    In_SD16Value[1] = (unsigned char)(Value_Mem1 >> 8);

    Out_SD16Value[0] = (unsigned char)Value_Mem2;         //出口温度SD值
    Out_SD16Value[1] = (unsigned char)(Value_Mem2 >> 8);

/**************入口温度处理(温度计算,温度校准)***************/
    if(Value_Mem1 >= Value_Mem0)//----入口SD值大于基准值才去算温度
    {
        Cal_InOutTemp(In_Temp);     //计算进水口温度
        Cal_InSub_temp();           //计算5~95之间的进口温度漂移量
        AdjustIn_Temp();            //入口温度校准
        Up_Datebuffer(In_Temp,3);   //更新进水温度到Data_buffer
    }
    else//---------------------------入口SD值小于基准值则出错(即小于0度,则出错)
    {
        In_Temp[2] =0x00;
        In_Temp[1] =0x0E;
        In_Temp[0] =0x01;

        Up_Datebuffer(In_Temp,3);   //更新进水温度到Data_buffer
    }
/**************出口温度处理(温度计算,温度校准)***************/
    if(Value_Mem2 >= Value_Mem0)//----出口SD值大于基准值才去算温度
    {
        Cal_InOutTemp(Out_Temp);    //计算出水口温度
        Cal_OutSub_temp();          //计算5~95之间的出口温度漂移量
        AdjustOut_Temp();           //出口温度校准
        Up_Datebuffer(Out_Temp,3);  //更新出水温度到Data_buffer
    }
    else//---------------------------出口SD值小于基准值则出错(即小于0度,则出错)
    {
        Out_Temp[2] =0x00;
        Out_Temp[1] =0x0E;
        Out_Temp[0] =0x02;

        Up_Datebuffer(Out_Temp,3);   //更新进水温度到Data_buffer
    }
/**********************入口出口温差计算***********************/
    if( (In_Temp[1] !=0x0E) &&(Out_Temp[1] !=0x0E) )//入口出口温度没出错时才去算温差
    {
//        M_temp_Sub = In_Temp[2] - Out_Temp[2];             //温差百位数
        if(In_Temp[1]>Out_Temp[1])//入口In_Temp[1]>出口Out_Temp[1]
        {
            In_Temp1 = In_Temp[1];
            In_Temp0 = In_Temp[0];
            Out_Temp1 = Out_Temp[1];

            Out_Temp0 = Out_Temp[0];
        }
        else if(Out_Temp[1]>In_Temp[1])//出口Out_Temp[1]>入口In_Temp[1]
        {
            In_Temp1 = Out_Temp[1];
            In_Temp0 = Out_Temp[0];
            Out_Temp1 = In_Temp[1];
            Out_Temp0 = In_Temp[0];
        }
        else//--------------------------入口In_Temp[1]大==出口Out_Temp[1]
        {
            if(In_Temp[0]>=Out_Temp[0])//入口大于出口
            {
                In_Temp1 = In_Temp[1];
                In_Temp0 = In_Temp[0];
                Out_Temp1 = Out_Temp[1];

                Out_Temp0 = Out_Temp[0];
            }
            else//-----------------------出口大于入口
            {
                In_Temp1 = Out_Temp[1];
                In_Temp0 = Out_Temp[0];
                Out_Temp1 = In_Temp[1];

                Out_Temp0 = In_Temp[0];
            } 
        }            
            
        if(In_Temp0 >= Out_Temp0)                      //入口小数点>=出口小数点
        {
            if((In_Temp1&0x0F) >= (Out_Temp1&0x0F))    //温差整数位
                H_temp_Sub = In_Temp1 - Out_Temp1;
            else
                H_temp_Sub = In_Temp1 - Out_Temp1 - 6;

            if((In_Temp0&0x0F) >= (Out_Temp0&0x0F))     //温差小数位
                L_temp_Sub = In_Temp0 - Out_Temp0;
            else
                L_temp_Sub = In_Temp0 - Out_Temp0 - 6;
        }
        else                                                //入口小数点<出口小数点
        {
            if((In_Temp1&0x0F) > (Out_Temp1&0x0F))      //温差整数位
                H_temp_Sub = In_Temp1 - Out_Temp1 - 1;
            else
            {
                if((In_Temp1&0xF0) < (Out_Temp1&0xF0))
                    H_temp_Sub = 0x99-Out_Temp1+In_Temp1;
                else
                    H_temp_Sub = In_Temp1 - Out_Temp1 - 7;
            }

            L_temp_Sub = In_Temp0 + ((0x99 - Out_Temp0)&0xF0);//小数高位先加
            temp_A = ((0x99 - Out_Temp0)&0x0F) + 0x01;          //再将temp_A加到小数低位

            for(i=0;i<temp_A;i++)
            {
                L_temp_Sub++;
                if((L_temp_Sub&0x0F) > 0x09)//若加过9,即有A出现
                {
                    L_temp_Sub &= 0xF0;
                    L_temp_Sub += 0x10;
                }
            }
        }

//        Sub_Temp[2] = M_temp_Sub; //温差百位数
        Sub_Temp[1] = H_temp_Sub; //温差整数位
        Sub_Temp[0] = L_temp_Sub; //温差小数位

        if( (Sub_Temp[2]>0)||(Sub_Temp[1]>0x99) )//--"E 3" 大于99度出错 (这种出错情况为出口温度比入口高)
        {
            Sub_Temp[2] =0x00;
            Sub_Temp[1] =0x0E;
            Sub_Temp[0] =0x03;
        }
        Up_Datebuffer(Sub_Temp,3); //更新温差到Data_buffer
    }
    else//若入口出口温度有一个出错,则温差不去算,并也出错
    {
        Sub_Temp[2] =0x00;
        Sub_Temp[1] =0x0E;
        Sub_Temp[0] =0x03;
        Up_Datebuffer(Sub_Temp,3); //更新温差到Data_buffer
    }
}

/***************************************************
        discrible:计算入口或出口温度值

        date     :2005-8-16
***************************************************/
void Cal_InOutTemp(unsigned char *add)
{
    unsigned int temp_SD,temp_Basic,Temp;
    unsigned char L_Temp,H_Temp,M_Temp;

    if(add == In_Temp)
        temp_SD = In_SD16Value[1]*256 + In_SD16Value[0];  //入口的SD值
    else
        temp_SD = Out_SD16Value[1]*256 + Out_SD16Value[0];//出口的SD值

    temp_Basic = BasicValue[1]*256 + BasicValue[0];       //基准口SD值

    A = ((temp_SD - temp_Basic) *100000) / (temp_Basic - 0x8000);//计算A值
    search_Q();     //根据A值查找Q值

    MPY = A;
    OP2 = Q;
    Temp = (RESHI*65536 + RESLO)/100000;//A*Q,即得到温度值

    M_Temp = Temp/10000;                  //温度百位数
    H_Temp = (Temp/100)%100;              //温度整数位
    L_Temp = Temp%100;                    //温度小数位

    if(add == In_Temp)
    {
        In_Temp[2] = M_Temp;                       //百位十进制转换成十六进制
        In_Temp[1] = (H_Temp/10)*16 + (H_Temp%10); //十位十进制转换成十六进制
        In_Temp[0] = (L_Temp/10)*16 + (L_Temp%10); //小数位十进制转换成十六进制
    }
    else
    {
        Out_Temp[2] = M_Temp;                       //百位十进制转换成十六进制
        Out_Temp[1] = (H_Temp/10)*16 + (H_Temp%10); //十位十进制转换成十六进制
        Out_Temp[0] = (L_Temp/10)*16 + (L_Temp%10); //小数位十进制转换成十六进制
    }
}

/***************************************************

⌨️ 快捷键说明

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