📄 spr_ri080526.c
字号:
{
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;
while(continend_F)
{
InsampleTime_R=T2; //保存定时清洗的时间间隔
CleanTime_R=T3; //保存清洗时间
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;
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;
if (RI0==1) //上位机有新命令从串口下发,则停止连续测量
{
continend_F=0;
RI0 = 0;
}
InsampleTime_F=0; //否则,继续进样进行连续测量
CleanTime_F=0;
}
CR=0;
TR2=0;
RI0=0;
sendsignal(0,0,0,0,0,0xff);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//进水调试
//功能:仪器进行使用前的校准
//输入:V1为进水的速度
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void wateradjust_measure(unsigned int V1)
{
time = XTIME;
count = XCOUNT;
sendsignal(0x55,rebuf[6],rebuf[7],0,0,0x00);
Valve_Switch(1);
PCA0CPH0=V1; //设置进水的速度
CR=1; //启动蠕动泵
while(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);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//进样调试
//功能:仪器进行使用前的校准
//输入:V2为进样的速度
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void sampleadjust_measure(unsigned int V2)
{
time = XTIME;
count = XCOUNT;
sendsignal(0xff,rebuf[6],rebuf[7],0,0,0x00);
Valve_Switch(2);
PCA0CPH0=V2; //设置进水的速度
CR=1; //启动蠕动泵
while(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);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//清洗
//功能:清洗管道
//输入:V3,T3清洗的速度和时间
//输出:无
//////////////////////////////////////////////////////////////////////////////////////////////
void clean(unsigned int V3,unsigned int T3)
{
//SetTime_F=1;
time = XTIME;
count = XCOUNT;
InwaterTime_F=1;
InsampleTime_F=1;
CleanTime_R=T3; //保存清洗时间
TR2=1; //打开定时器
sendsignal(0x55,rebuf[6],rebuf[7],rebuf[8],rebuf[9],0x00);
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;
if (RI0==1)
RI0=0;
sendsignal(0,0,0,0,0,0xff);
}
//////////////////////////////////////////////////////////////////////////////////////////////
//数据采集、处理、上传函数
//功能:Measure()、uploaddata()、Sub()
// 输入:测量结果存放的地址add
// 输出:
//////////////////////////////////////////////////////////////////////////////////////////////
void Measure(unsigned int addr)
{
unsigned int data i,j,temp=0;
unsigned char data th,tl,led,k;
unsigned int data t;
unsigned int xdata temp1[128];
t = 65536 - time * 922; //根据积分时间计算定时器的计数初值
TR0 = 0; //设置定时器0
TMOD |= 0x01; //T0工作于方式1(16位定时器)
th = t/256;
tl = t%256;
ET0 = 1; //允许T0中断
for(i=0; i<128; i++) //清空128个像素的缓存区
temp1[i] = 0;
AMX0SL = 0x00; //选择通道0
for(j=0; j<count+1; j++) //平均测量次数
{
S_START = HIGH;
TH0 = th;
TL0 = tl;
for(k=0; k<8; k++); //空语句?
time_flag = 0;
for(i=0; i<128; i++)
{
S_CLOCK = HIGH;
for(k=0; k<20; k++); //? ? ?产生方波
S_CLOCK = LOW;
if(i == 0)
{
S_START = LOW;
}
if(i == 17)
{
led = P3;
led = ( led & 0xF0) + bright;
P3 = led;
TR0 = 1; //开始计时
}
if(j==0)
{
for(k=0; k<30; k++); //保持样品数据准确,第一次采集的数据不进行AD转换
}
else
{
AD0BUSY = 1; //AD转换开始
while(AD0INT == 0); //查询ADC0标志位,等待转换结束
AD0INT = 0;
//转换结果暂存
temp = ADC0H * 256;
temp = temp + ADC0L;
temp1[i] = temp1[i] + temp;
}
}
S_CLOCK = HIGH; //产生一个高脉冲
for(k=0; k<30; k++);
S_CLOCK = LOW;
for(k=0; k<30; k++);
while(time_flag==0) //积分时间到否,等待定时器中断
_nop_();
led = P3; //关闭LED
led = led & 0xF0;
P3 = led;
}
for(i=0; i<128; i++)
{
temp1[i] = temp1[i] / count;
j = i + i;
XBYTE[addr+j] = temp1[i] / 256; //存放结果
XBYTE[addr+j+1] = temp1[i] % 256;
}
}
void Sub(unsigned int addr1, unsigned int addr2, unsigned int addr3)
{
signed int data temp3,temp4;
unsigned int data i;
for(i=0; i<256; i++)
{
temp3 = XBYTE[addr1+i] * 256 + XBYTE[addr1+i+1];
temp4 = XBYTE[addr2+i] * 256 + XBYTE[addr2+i+1];
temp3 = temp3 - temp4;
if(temp3<0)
{
XBYTE[addr3+i]=0;
XBYTE[addr3+i+1]=0;
}
else
{
XBYTE[addr3+i]=temp3/256;
XBYTE[addr3+i+1]=temp3%256;
}
i++;
}
}
//////////////////////////////////////////////////////////////////////////////////////////////
//上传数据
//功能:
// 输入:
// 输出:
//////////////////////////////////////////////////////////////////////////////////////////////
void UploadData(unsigned int addr)
{
unsigned int data i;
unsigned char data check = 0,temp;
ansbuf[0]=0x01; //本机地址
ansbuf[1]=0x03; //响应代码03
ansbuf[2]=0x01; //数据长度
ansbuf[3]=0x00;
for(i=0; i<4; i++) //上传前4个字节,从机地址、功能码、到数据长度
{
check = check ^ ansbuf[i]; //异或校验
TI0 = 0;
SBUF0 = ansbuf[i];
while(TI0 == 0);
}
for(i=0; i<256; i++) //上传数据128像素共256个字节
{
temp = XBYTE[addr+i];
check = check ^ temp;
TI0 = 0;
SBUF0 = temp;
while(TI0 == 0);
}
TI0 = 0;
SBUF0 = check; //最后上传校验位
while(TI0 == 0); //查询上传完毕
}
///////////////////////////////////////////////////////////////////////////////////////////////
//多位阀口n选择函数
//使用全局变量:Uart0Tbuf[]
//入口条件:液体通道号port 1代表A;2代表B
//出口条件:无
//功能:发送阀门口选择命令给阀
///////////////////////////////////////////////////////////////////////////////////////////////
void Valve_Switch(unsigned int port)
{
unsigned char data i=0,j,temp;
unsigned char idata T; //通道口缓冲区
T='@'+port; //ASCII码“@”
Uart1Tbuf[i++]=0x47; //C
Uart1Tbuf[i++]=0x4f; //W 告知阀以顺时针转到对应的口
Uart1Tbuf[i++]=T;
Uart1Tbuf[i++]=0x0d;
for(j=0; j<i; j++)
{
SCON1 &= 0xfd;
SBUF1 = Uart1Tbuf[j];
temp = SCON1; //将SCON1的值赋给temp
temp &= 0x02; //屏蔽除TI1位以外的所有位
while(temp == 0) //查询是否发送完毕
{
temp = SCON1;
temp &= 0x02;
}
}
for (i=0;i<10;i++) //发送缓冲区清零
Uart1Tbuf[i]=0x00;
}
/*
//////////////////////////////////////////////////////////////////////////////////////////////
//时间间隔计算函数
//功能:根据上位机的时钟计算距离下一个整点的时间间隔(分钟)
//输入:上位机时间 time_Now
//输出:
//////////////////////////////////////////////////////////////////////////////////////////////
int Gap_Calculation(unsigned int hour,unsigned int minute)
{
unsigned int gap;
gap = 60 - minute;
return gap;
}*/
//////////////////////////////////////////////////////////////////////////////////////////////
//外部flash读写程序
//功能:
// 输入:
// 输出:
//////////////////////////////////////////////////////////////////////////////////////////////
void FlashWrite(void)
{
bit EA_SAVE = EA;
unsigned char xdata *pwrite;
EA = 0;
FLSCL |= 0x01; //FLSCL中的FLWE置1
PSCTL |= 0x07; //PSCTL中的SFLE、PSEE。PSWE置1
pwrite = ( unsigned char xdata * ) 0x00;
*pwrite = 0; //擦除操作
PSCTL &= ~0x02; //清除PSEE,禁止擦除FLASH存储器
*pwrite++ = XPLESH;
*pwrite++ = XPLESL;
*pwrite++ = XBRIGHT;
*pwrite++ = XTIME;
*pwrite++ = XCOUNT;
*pwrite++ = XVOLTH;
*pwrite++ = XVOLTL;
PSCTL = 0; //清除SFLE、PSWE
FLSCL &= ~0x01; //清除FLWE
EA = EA_SAVE;
}
//////////////////////////////////////////////////////////////////////////////////////////////
//中断服务程序
//功能:建立标志位
//使用定时器2
//////////////////////////////////////////////////////////////////////////////////////////////
void timing() interrupt 5 using 2
{
TR2=0;
Num50ms_R++;
if (Num50ms_R==20)
{
Num50ms_R=0;
Num1s_R++;
if(Num1s_R==60)
{
Num1s_R=0;
if(InwaterTime_F==0)
{
InwaterTime_R--;
if(InwaterTime_R==0)
InwaterTime_F=1;
}
else if (InsampleTime_F==0)
{
InsampleTime_R--;
if(InsampleTime_R==0)
InsampleTime_F=1;
}
else if (CleanTime_F==0)
{
CleanTime_R--;
if(CleanTime_R==0)
CleanTime_F=1;
}
}
}
TR2=1;
TF2=0;
return ;
}
//////////////////////////////////////////////////////////////////////////////////////////////
//功能:积分时间定时器
//使用定时器0
//////////////////////////////////////////////////////////////////////////////////////////////
void timer0() interrupt 1 using 3
{
TR0 = 0; //定时器0停止工作
time_flag = 1; //积分时间到
tenmillisec_flag = 1;
}
///////////////////////////////////////////////////////////////////////////////////////////////
//延时函数
//入口条件:延时次数
//出口条件:无
//使用全局变量:无
//功能:软件延时,延时时间为 n*50ms
///////////////////////////////////////////////////////////////////////////////////////////////
void delay(unsigned int n)
{
TR0 = 0; //定时器0停止工作
TMOD |= 0x01; //设置定时器0
ET0 = 1; //允许T0中断
while(n != 0)
{
tenmillisec_flag = 0;
TH0 = 0x4c;
TL0 = 0xf6;
TR0 = 1; //定时器0开始工作
while(tenmillisec_flag == 0) {_nop_();}
n--;
}
}
void UART0() interrupt 4
{
rebuf[uartrecnum] = SBUF0;
uartrecnum++;
RI0 = 0; //UART0接收中断清零
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -