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

📄 spr_ri080526.c

📁 基于F020的UART,232通讯例程代码
💻 C
📖 第 1 页 / 共 3 页
字号:
 	{
	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 + -