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

📄 process.c

📁 用于GPRS远程电力抄表系统中采集器端的程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*****--------------文件信息--------------------------------------------------------------------------------
**文   件   名: process.C
**最后修改日期: 2005-11-10
**描        述: 对串口接收的数据进行处理
**设计者      : jxf
*****************************************************************************************************/
#include "process.h"
#include "proccomm.h"
#include "recframe.h"
#include "ds1302.h"
#include "io.h"
#include "time.h"
#include "hash.h"
/*******************************************************************
                     哈希函数               
函数原型: uchar hash(uchar ,uchar ,uchar) 
功  能:       
  
*******************************************************************
uchar Hash(uchar *Data,uchar table_len)
{
	register uint hash = 0;
	uint x = 0, i=0;
	for(i = 0; i < 3; i++) 
	{
		hash = (hash << 2) + Data[i]+TH0+TL0;
		if((x = hash & 0xF000) != 0)
	 	{
			hash ^= (x >> 8);
			hash &= ~x;
		}
	}
	return ((hash & 0x7FFF) % table_len) ;
}
*/


/*******************************************************************
                     用户通断电操作函数               
函数原型: void User_contr()
功  能:       
  
********************************************************************/
void User_contr()
{
	switch(wr_switch)
	{
		case 1:
			TimeStart=1;
			delay_30ms=0;
			LightFlashStart=0;
			if(bport07)
			{
				if(bwary00)
				{
					P0=0;
			   		P2=0;
					P1_2=0;
				}
				else
				{
					P0=0xff;
			    	P2=0xff;
					P1_2=1;
				}
				P0_0=bwary00;
				P1_2=~bwary00;
				wr_switch++;
		
			}
			else wr_switch++;
			break;

		case 2:
			if(bport06)
			{
				if(delay_30ms>20)
				{ 
					delay_30ms=0;
					if(bwary01)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					
					P0_1=bwary01;
					P1_2=~bwary01;
					wr_switch++;
				}
			}
			else wr_switch++; 
			break;

		case 3:
			if(bport05)
			{
				if(delay_30ms>20)
				{	
					delay_30ms=0;
					if(bwary02)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			   		 	P2=0xff;
						P1_2=1;
					}
					
					P0_2=bwary02;
					P1_2=~bwary02;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 4:
			if(bport04)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary03)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P0_3=bwary03;
					P1_2=~bwary03;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 5:
			if(bport03)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary04)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P0_4=bwary04;
					P1_2=~bwary04;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 6:
			if(bport02)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary05)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P0_5=bwary05;
					P1_2=~bwary05;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 7:
			if(bport01)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary06)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P0_6=bwary06;
					P1_2=~bwary06;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 8:
			if(bport00)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary07)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P0_7=bwary07;
					P1_2=~bwary07;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;

		case 9:
			if(bport17)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary10)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_0=bwary10;
					P1_2=~bwary10;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 10:
			if(bport16)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary11)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_1=bwary11;
					P1_2=~bwary11;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 11:
			if(bport15)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary12)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_2=bwary12;
					P1_2=~bwary12;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 12:
			if(bport14)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary13)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_3=bwary13;
					P1_2=~bwary13;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 13:
			if(bport13)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary14)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_4=bwary14;
					P1_2=~bwary14;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 14:
			if(bport12)
			{
	   			if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary15)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_5=bwary15;
					P1_2=~bwary15;
					wr_switch++;
				}
			}
			else wr_switch++;
			break;
		case 15:
			if(bport11)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary16)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_6=bwary16;
					P1_2=~bwary16;
					wr_switch++;	
				}
			}
			else wr_switch++;
			break;
		case 16:
			if(bport10)
			{
				if(delay_30ms>20)
				{
					delay_30ms=0;
					if(bwary17)
					{
						P0=0;
			   			P2=0;
						P1_2=0;
					}
					else
					{
						P0=0xff;
			    		P2=0xff;
						P1_2=1;
					}
					P2_7=bwary17;
					P1_2=~bwary17;
			    	wr_switch++;
				}
			}
			else 	wr_switch++;
					
			break;

		case 17:
			if(delay_30ms>20)
			{
				delay_30ms=0;
				P2=0;
				P0=0;
				P1_2=0;
		    	wr_switch=0;
				TimeStart=0;
				LightFlashStart=1;

			}

		}
}

/*******************************************************************
                     用户通断电显示函数               
函数原型: void UserLight_Flash()
功  能:       
  
********************************************************************/

void UserLight_Flash()
{
	static uchar  maskdisp=1; 
	static uchar  state=0;

	switch(state)
	{
		case 0:
 
			if((delay_25ms>=28)&&(delay_25ms<=32))
			{
 	 			if(maskdisp==0x00)
				{
		    		P0=0;
					state=1;
					maskdisp=1;
				    break;	
				}

		  		delay_25ms=33;
				if (bwary[0]&maskdisp)  P0 =maskdisp;
				else P0=0;
		  		    
		   		maskdisp <<=1;

		  	}
           else	 if(delay_25ms>=100)  	P0=0;	  ////////zjs added on 20060711
		        
							
		   	break;



		case  1:
			if((delay_25ms>=28)&&(delay_25ms<=32))
			{
  				if(maskdisp==0x00)
				{
			    	P2=0;
					state=0;
					maskdisp=1;
			  		break;	
				}

		   		delay_25ms=33;
				if (bwary[1]&maskdisp)  P2 =maskdisp;
				else P2=0;
		  		    
		 	  	maskdisp <<=1;
		   	
		  	}
			else  if(delay_25ms>=100) 	P2=0;	  ////////zjs added on 20060711

		    break;
		}	
}
/*******************************************************************
                     写端口函数               
函数原型: void Wr_port()
功  能:       
  
********************************************************************/

void Wr_port()
{ 
	static uchar wport_flag=0;
	uchar wport_end;

	switch(wport_flag)
    {
		case 0: 
			W_block(WPAGE0,i2c_addr_io,bwary,2);
		    wport_end=1;
		    W_block(WPAGE0,i2c_addr_portflag,&wport_end,1);  
		    wport_flag=1;
		    break;
         case 1: 
            W_block(WPAGE1,i2c_addr_io,bwary,2);
		    wport_end=0;
		    W_block(WPAGE0,i2c_addr_portflag,&wport_end,1); 
		    wport_flag=0; 
		    break;
	}

	SenBuf[5]=(RecBuf[5]|0x80);
    cs+=SenBuf[5];
    SenBuf[6]=0;
    SenBuf[SenBuf[6]+7]=cs;
	SenBuf[SenBuf[6]+8]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;
}

/*******************************************************************
                     读端口函数               
函数原型: void  Rd_port(void)
功  能:       
  
********************************************************************/

void  Rd_port(void)
{
    register uchar k;

  	brary00=bwary07;
	brary01=bwary06;
	brary02=bwary05;
	brary03=bwary04;
	brary04=bwary03;
	brary05=bwary02;
	brary06=bwary01;
	brary07=bwary00;
	brary10=bwary17;
	brary11=bwary16;
	brary12=bwary15;
	brary13=bwary14;
	brary14=bwary13;
	brary15=bwary12;
	brary16=bwary11;
	brary17=bwary10;

    SenBuf[7]=brary[0];
	SenBuf[8]=brary[1];
    SenBuf[5]=(RecBuf[5]|0x80);
    cs+=SenBuf[5];
    SenBuf[6]=2;
    cs+=SenBuf[6];
      
    for(k=0;k<2;k++)
		cs+=SenBuf[k+7];
       
    SenBuf[SenBuf[6]+7]=cs;
    SenBuf[SenBuf[6]+8]=FRAME_END_CHAR;
    Senlen=SenBuf[6]+9;
}

/*******************************************************************
                     读累加数据函数               
函数原型: void Radd_data()
功  能:       
  
********************************************************************/
void Radd_data(void)
{
	register uchar i,j;
   
    SenBuf[5]=(RecBuf[5]|0x80);
    cs+=SenBuf[5];

	SenBuf[6]=RecBuf[7]*6;
	for(i=0;i<RecBuf[7];i++)
 		for(j=0;j<6;j++)
 			SenBuf[j+7+i*6]=sum[i][j];

    for(i=0;i<SenBuf[6];i++)
		cs+=SenBuf[7+i];               
	cs+=SenBuf[6];
	SenBuf[7+SenBuf[6]]=cs;
	SenBuf[8+SenBuf[6]]=FRAME_END_CHAR;
	Senlen=SenBuf[6]+9;
       
}

/*******************************************************************
                     轮询一周结束函数               
函数原型: void Cyc_end()
功  能:       
  
********************************************************************/
void Cyc_end()
{
	
	if(CycleFlag)
	{
		CycleFlag=0;
		CheckInFlag=0;	
	}
	else
		CheckInFlag=1; //注册标志

	FreezeClass=RecBuf[7];


			
}

/*******************************************************************
                     设置时段冻结函数               
函数原型: void S_time(void)
功  能:       
  
********************************************************************/
void S_time(void)
{
	uchar freezetime_end=0;
	static freezetime_flag;
// 	for(i=0;i<16;i++)
//		for(j=0;j<6;j++)
// 			FreezeData[j+i*6]=freezesum[i][j];

	switch(freezetime_flag)
	{
		case 0: 
			W_block(WPAGE0,i2c_time_freeze,&freezesum[0][0],96);
			freezetime_end=1; 
			W_block(WPAGE0,i2c_time_flag,&freezetime_end,1);
			freezetime_flag=1;
			break;
		case 1: 
			W_block(WPAGE1,i2c_time_freeze,&freezesum[0][0],96);
			freezetime_end=0;
			W_block(WPAGE0,i2c_time_flag,&freezetime_end,1);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -