📄 spr_ri080526.c
字号:
ansbuf[5] = XPLESL;
}
else
{
ansbuf[4] = 0xff;
ansbuf[5] = 0xff;
}
ansbuf[6] = 0;
ansbuf[7] = XBRIGHT;
ansbuf[8] = 0;
ansbuf[9] = XTIME;
ansbuf[10] = XVOLTH;
ansbuf[11] = XVOLTL;
for(i=0; i<12; i++)
{
check = check ^ ansbuf[i];
TI0 = 0;
SBUF0 = ansbuf[i];
while(TI0 == 0);
}
ansbuf[12] = check;
TI0 = 0;
SBUF0 = check;
while(TI0 == 0);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//最优化设定
///////////////////////////////////////////////////////////////////////////////////////////////
void OptimSet(void)
{
XPLESH = rebuf[6];
XPLESL = rebuf[7];
XBRIGHT = rebuf[9];
XTIME = rebuf[11];
XCOUNT = rebuf[13];
FlashWrite();
}
///////////////////////////////////////////////////////////////////////////////////////////////
//测量暗背景
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginBkdark(void)
{
bright = 0;
time = XTIME; //积分时间
count = XCOUNT; //平均测量次数
Measure(XBKaddr);
}
///////////////////////////////////////////////////////////////////////////////////////////////
//测量空气背景
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginBkair(void)
{
bright = XBRIGHT; //LED亮时测量Ia
time = XTIME; //积分时间
count = XCOUNT; //平均测量次数
Measure(XAIRaddr);
bright = 0; //LED暗时测量Ib
time = XTIME; //积分时间
count = XCOUNT; //平均测量次数
Measure(XBKaddr);
Sub(XAIRaddr,XBKaddr,XAIRaddr); //Ia-Ib,结果存放在XAIRaddr
}
///////////////////////////////////////////////////////////////////////////////////////////////
//单次采样(sa-sb)
///////////////////////////////////////////////////////////////////////////////////////////////
void BeginSingle(void)
{
bright = XBRIGHT; //LED亮时测量Sa
time = XTIME; //积分时间
count = XCOUNT; //平均测量次数
Measure(XORGaddr);
bright = 0; //LED暗时测量Sb
time = XTIME; //积分时间
count = XCOUNT; //平均测量次数
Measure(XSIGaddr);
Sub(XORGaddr,XSIGaddr,XSIGaddr); //Sa-Sb,结果存放在XSIGaddr
}
//////////////////////////////////////////////////////////////////////////////////////////////
//命令继续振接收函数
//功能:接收n个字节的命令帧
//输入:需要继续接收几个字节n
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void Con_receive(unsigned int n)
{
unsigned char data endflag = 0;
time = XTIME;
count = XCOUNT;
TI0 = 0; //T0清零
ES0 = 1; //允许UART0中断
uartrecnum = 4; //已经接收了4个字节rebuf[0]-rebuf[3]
while(endflag == 0)
{
bright = XBRIGHT;
Measure(XORGaddr);
bright = 0;
Measure(XSIGaddr);
Sub(XORGaddr,XSIGaddr,XSIGaddr);
if (uartrecnum == n+4)
endflag = 1;
}
ES0 = 0; //禁止UART0中断
}
//////////////////////////////////////////////////////////////////////////////////////////////
//命令分析函数
//功能:分析从上位机串口接收到的命令
//输入:无
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void commend_analys()
{
unsigned char data check,i;
Num50ms_R=0;
Num1s_R=0;
//WorkFlag=0; //清除各类标志
//TimingIni_F=0;
//SetTime_F=0;
InwaterTime_F=0;
InsampleTime_F=0;
CleanTime_F=0;
TR2=0;
for (i=0;i<4;i++) //接收命令前4个字节
{
while (RI0 == 0);
rebuf[i]=SBUF0;
RI0=0;
}
switch (rebuf[3])
{
case 0x30: //查询版本号
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
CheckVersion();
// trytime();
break;
case 0x51: //开始最优化测量
check=0x00;
Con_receive(15); //根据通信规约
for (i=0;i<18;i++)
check =check^rebuf[i];
if (check!=(rebuf[18]))
senderror();
else
{
SendResponse();
BeginOptim();
}
break;
case 0x52: //查询最优化结果
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
OptimResult();
}
break;
case 0x53: //最优化设定
check=0x00;
Con_receive(15); //根据通信规约
for (i=0;i<18;i++)
check =check^rebuf[i];
if (check!=(rebuf[18]))
senderror();
else
{
SendResponse();
OptimSet();
}
break;
case 0x61: //测量背景
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
SendResponse();
BeginBkdark();
}
break;
case 0x62: //查询测量背景结果
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
UploadData(XBKaddr);
}
break;
case 0x71: //测量空气背景
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
SendResponse();
BeginBkair();
}
break;
case 0x72: //查询测量空气背景结果
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
UploadData(XAIRaddr);
}
break;
case 0x81: //单次采样
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
SendResponse();
BeginSingle();
}
break;
case 0x82: //查询单次采样结果,并回送数据
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else
{
UploadData(XSIGaddr);
}
break;
case 0x91: //单次测量命令
check=0x00;
Con_receive(19); //根据通信规约
for (i=0;i<22;i++)
check =check^rebuf[i];
if (check!=(rebuf[22]))
senderror();
else
{
SendResponse();
single_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
}
break;
case 0x93: //连续测量命令
check=0x00;
Con_receive(19); //根据通信规约
for (i=0;i<22;i++)
check =check^rebuf[i];
if (check!=(rebuf[22]))
senderror();
else
{
SendResponse();
continue_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
}
break;
case 0x94: //进水调试测量命令
check=0x00;
Con_receive(9); //根据通信规约
for (i=0;i<12;i++)
check =check^rebuf[i];
if (check!=(rebuf[12]))
senderror();
else
{
SendResponse();
wateradjust_measure(rebuf[6]*256+rebuf[7]);
}
break;
case 0x95: //进样调试测量命令
check=0x00;
Con_receive(9); //根据通信规约
for (i=0;i<12;i++)
check =check^rebuf[i];
if (check!=(rebuf[12]))
senderror();
else
{
SendResponse();
sampleadjust_measure(rebuf[6]*256+rebuf[7]);
}
break;
/*
case 0x96: //定时测量命令
check=0x00;
Con_receive(26); //根据通信规约
for (i=0;i<29;i++) //计算校验位
check=check^rebuf[i];
if (check!=(rebuf[29]))
senderror();
else
{
//根据上位机的时钟计算Gap的值
GapTime_R=Gap_Calculation(rebuf[21],rebuf[22]);
if (GapTime_R > 30)
single_measure(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9],rebuf[10]*256+rebuf[11],rebuf[12]*256+rebuf[13],rebuf[14]*256+rebuf[15],rebuf[16]*256+rebuf[17]);
}
break;
*/
case 0x98: //清洗命令
check=0x00;
Con_receive(7); //根据通信规约
for (i=0;i<10;i++)
check =check^rebuf[i];
if (check!=(rebuf[10]))
senderror();
else
{
SendResponse();
clean(rebuf[6]*256+rebuf[7],rebuf[8]*256+rebuf[9]);
}
break;
case 0xF0: //终止命令
check=0x00;
Con_receive(3); //根据通信规约
for (i=0;i<6;i++)
check =check^rebuf[i];
if (check!=(rebuf[6]))
senderror();
else SendResponse();
break;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//单次测量函数
//功能:
//输入:V1,T1进水的速度和时间;V2,T2进样速度和的时间;V3,T3清洗的速度和时间
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void single_measure(unsigned int V1,unsigned int T1,unsigned int V2,unsigned int T2,unsigned int V3,unsigned int T3)
{
time = XTIME;
count = XCOUNT;
InwaterTime_R=T1; //设置各步操作所需的时间
InsampleTime_R=T2;
CleanTime_R=T3;
RI0=0;
TR2=1; //打开定时器2
if(RI0==0)
{
sendsignal(0x55,rebuf[6],rebuf[7],rebuf[8],rebuf[9],0x00);
Valve_Switch(1); //切换阀门
PCA0CPH0=V1; //设置进水的速度
CR=1; //启动蠕动泵
}
while ((InwaterTime_F==0)&&(RI0==0))
{
bright = XBRIGHT;
Measure(XORGaddr); //测量原始信号
bright = 0;
Measure(XSIGaddr); //测量背景信号
Sub(XORGaddr,XSIGaddr,XSIGaddr);
UploadData(XSIGaddr);
}
CR=0;
// delay(20);
if(RI0==0)
{
sendsignal(0xff,rebuf[10],rebuf[11],rebuf[12],rebuf[13],0x88);
Valve_Switch(2); //切换阀门
PCA0CPH0=V2; //设置进水的速度
CR=1; //启动蠕动泵
}
while ((InsampleTime_F==0)&&(RI0==0))
{
bright = XBRIGHT;
Measure(XORGaddr); //测量原始信号
bright = 0;
Measure(XSIGaddr);
Sub(XORGaddr,XSIGaddr,XSIGaddr);
UploadData(XSIGaddr);
}
CR=0;
//delay(20);
if(RI0==0)
{
sendsignal(0x55,rebuf[14],rebuf[15],rebuf[16],rebuf[17],0x88);
Valve_Switch(1);
PCA0CPH0=V3; //设置进水的速度
CR=1; //启动蠕动泵
}
while((CleanTime_F==0)&&(RI0==0))
{
bright = XBRIGHT;
Measure(XORGaddr); //测量原始信号
bright = 0;
Measure(XSIGaddr);
Sub(XORGaddr,XSIGaddr,XSIGaddr);
UploadData(XSIGaddr);
}
CR=0;
TR2=0;
RI0 = 0; //软件清除标志位
sendsignal(0,0,0,0,0,0xff);
//delay(20);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//连续测量函数
//功能:
//输入:V1,T1进水的速度和时间;V2,T2进样速度和定时清洗的时间间隔;V3,T3清洗的速度和时间
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void continue_measure(unsigned int V1,unsigned int T1,unsigned int V2,unsigned int T2,unsigned int V3,unsigned int T3)
{
unsigned char data continend_F;
time = XTIME;
count = XCOUNT;
continend_F=1; //连续测量结束标志
InwaterTime_R= T1; //保存进水时间
InsampleTime_R=T2; //保存定时清洗的时间常数
CleanTime_R=T3; //清洗时间
RI0 = 0;
TR2=1; //打开定时器?
if(RI0==0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -