📄 change.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 + -