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

📄 change.c

📁 一套MSP430单片机完整程序
💻 C
字号:
#include <msp430x14x.h>
#include "define.h"
#include "Global.h"

/*********************************************************************
// 数据转换 
// 功能说明: 转换三种气体数据为显示值
// 全局变量: Value_O2_Cur1,Value_N2O_Air_Cur1,
             Value_O2_Cur2,Value_N2O_Air_Cur2,
             O2_Column_Cur, N2O_Air_Column_Cur,
             Qfg_Flow_Cur,  FiO2_Cur
// 算法说明: 将采样缓冲区去除最大值最小值然后求平均值
**********************************************************************/
void Value_Change(void)
{
    unsigned int Temp_Max;
    unsigned char i,j;
    unsigned long temp;
    if(Value_Change_En != 0x01) return;
    Value_Change_En = 0x0;
    
    _DINT();
    
    // 氧气转换
    Temp_Max=0,temp=0;
    for(i=0;i<23;i++)
    for(j=0;j<23-i;j++)
    {
        if(Value_O2_Cur1[j] > Value_O2_Cur1[j+1])
        { 
            Temp_Max = Value_O2_Cur1[j];
            Value_O2_Cur1[j] = Value_O2_Cur1[j+1];
            Value_O2_Cur1[j+1] = Temp_Max;
        }
    }
    for(i=2;i<22;i++)
    temp += (unsigned long)Value_O2_Cur1[i];
                   
    temp = temp * 50 / 1843;                // /20*(2000/3686)                  
    Value_O2_Cur2 = Modify_Data(temp);      // 加入修正系数
    if(Value_O2_Cur2 > 1200) Value_O2_Cur2 = 1200;
        
    // 笑气或空气转换
    Temp_Max=0,temp=0;
    for(i=0;i<23;i++)
    for(j=0;j<23-i;j++)
    {
        if(Value_N2O_Air_Cur1[j] > Value_N2O_Air_Cur1[j+1])
        { 
            Temp_Max = Value_N2O_Air_Cur1[j];
            Value_N2O_Air_Cur1[j] = Value_N2O_Air_Cur1[j+1];
            Value_N2O_Air_Cur1[j+1] = Temp_Max;
        }
    }
    for(i=2;i<22;i++)
    temp += (unsigned long)Value_N2O_Air_Cur1[i];                    
    temp = temp * 50 / 1843;                // /20*(2000/3686)
    Value_N2O_Air_Cur2 = Modify_Data(temp); // 加入修正系数
    if(Value_N2O_Air_Cur2 > 1200) Value_N2O_Air_Cur2 = 1200;
    
    _EINT();
    
    // 计算光柱值
    O2_Column_Cur = Column_Change(Value_O2_Cur2);
    N2O_Air_Column_Cur = Column_Change(Value_N2O_Air_Cur2); 
    
    // 计算Qfg值
    Qfg_Flow_Cur = Value_O2_Cur2 + Value_N2O_Air_Cur2;
    
    // 计算FiO2值   // (O2*1000+N2O*209*LED3)/(O2*1000+N2O)
    temp = ((unsigned long)Value_O2_Cur2*1000+(unsigned long)Value_N2O_Air_Cur2*209*(unsigned long)LED3)    
          /((unsigned long)Value_O2_Cur2+(unsigned long)Value_N2O_Air_Cur2);          
    if(((unsigned long)Value_O2_Cur2 + (unsigned long)Value_N2O_Air_Cur2) == 0) FiO2_Cur = 0;
    else FiO2_Cur = (unsigned int)temp;   
    if(FiO2_Cur > 1000) FiO2_Cur = 1000;
    
    // 串口发送缓冲数组填充
    Buffer[1] = (unsigned char)(Value_O2_Cur2 >> 8);
    Buffer[2] = (unsigned char)Value_O2_Cur2;
    
    Buffer[4] = 0x3A*LED2+0xA3*LED3;
    Buffer[5] = (unsigned char)(Value_N2O_Air_Cur2 >> 8);
    Buffer[6] = (unsigned char)Value_N2O_Air_Cur2;
    
    Buffer[8] = (unsigned char)(Qfg_Flow_Cur >> 8);
    Buffer[9] = (unsigned char)Qfg_Flow_Cur;
    
    Buffer[11] = (unsigned char)(FiO2_Cur >> 8);
    Buffer[12] = (unsigned char)FiO2_Cur;                            
}

/*********************************************************************
* 补偿运算 
* 功能说明: y=0.0004*x^2+0.7462*x+52
**********************************************************************/
unsigned int Modify_Data(unsigned long dat)
{
    unsigned long temp1,temp2;
    
    temp2 = dat;
    if(temp2 < 10)  return 0;
    else if((temp2 >= 10) && (temp2 < 250)) return (unsigned int)temp2;
    else
    {
        temp1 = temp2*temp2*0.0004 + temp2*0.7462 + 52;
        return (unsigned int)temp1;
    }
}

/*********************************************************************
* 光柱值转换 
* 功能说明: 将LED显示值转换为闪烁的光柱值
* dat: 显示值
* 返回值:光柱值
**********************************************************************/
unsigned char Column_Change(unsigned int dat)
{
    unsigned int temp1;
    unsigned char temp2;
    
    temp1 = dat;
    if(temp1 >= 700) 
        temp2 = (unsigned char)(temp1 / 100) + 18;
    else if((temp1 < 700) && (temp1 >= 200)) 
        temp2 = (unsigned char)((temp1*2) / 100) + 11;
    else if((temp1 < 200) && (temp1 >= 120)) 
        temp2 = (unsigned char)((temp1*5) / 100) + 5;
    else if((temp1 < 120) && (temp1 >= 90)) 
        temp2 = (unsigned char)(temp1 / 15) + 3;
    else 
        temp2 = (unsigned char)(temp1 / 10);
    return temp2;
}

/*********************************************************************
* 状态检测         
* 功能说明: 检测三个灯的状态及控制两个阀的开合 
**********************************************************************/
void Status_Check(void)
{
    if(Status_Check_En != 0x01) return;
    Status_Check_En = 0x00;
    
    // 笑气、空气气道切换及指示灯切换
    if(key == ON)               
    {
        key = OFF;
        LED2 ^= BIT0;
        LED3 ^= BIT0;
        P1OUT ^= BIT0;
        N2O_Air_Column_Pre = N2O_Air_Column_Cur + 1;
        Display_N2O_Air_Column(N2O_Air_Column_Cur);
    }
    
    // 氧笑联动
    if(LED1 == ON && FiO2_Cur > 260)
    {
        LED1 = OFF;
        P1OUT &= ~BIT1;             // 笑气阀打开   
        O2_Column_Pre = O2_Column_Cur + 1;
        Display_O2_Column(O2_Column_Cur);               
    }
    else if(LED1 == OFF && FiO2_Cur < 250)
    {
        LED1 = ON;                  // 氧压过低报警
        P1OUT |= BIT1;              // 笑气阀关闭
        O2_Column_Pre = O2_Column_Cur + 1;
        Display_O2_Column(O2_Column_Cur);               
    }  
}

⌨️ 快捷键说明

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