www.pudn.com > EFA.rar > Change.c
#include#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); } }