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

📄 fssf.c

📁 经典的奇偶输出控制源代码.里面有比较典型的对两处理器通讯速度不匹配的处理模式。好好看看吧!
💻 C
📖 第 1 页 / 共 2 页
字号:
//Com3 接收命令模块 
void Com3RD_P(void)
    {
    int i,j;
    if(get3i==SendTLen)     //如果接收完毕,则进行指令分析
        {
        if((GCom3getCmd[1]==2) && (GCom3getCmd[2]==0xfd))  //起始符正确
            if(GCom3getCmd[5]==(GCom3getCmd[3]^GCom3getCmd[4]))  //效验和正确
                CAflag3=1;  //允许分析
            else  //效验和不正确,则重新定位起始符位置
                {
                for(i=3;i<SendTLen;i++)
                    {if(GCom3getCmd[i]==2) break;}
                get3i=SendTLen-i+1;
                for(j=1;j<get3i;i++,j++)                     
                    {GCom3getCmd[j]=GCom3getCmd[i];}
                CAflag3=0;   
                }
        else  //起始符不正确,则重新定位起始符位置
            {
            for(i=2;i<SendTLen;i++)
                {if(GCom3getCmd[i]==2) break;}
            get3i=SendTLen-i+1;
            for(j=1;j<get3i;i++,j++)                     
                {GCom3getCmd[j]=GCom3getCmd[i];}
            CAflag3=0;
            }
        if(CAflag3==1)
            {
            CAflag3=0;get3i=1;Com3Flag=1;
            Gcmd3=GCom3getCmd[3];
            if(Gcmd3==6)
            	{Gcheci3=GCom3getCmd[4];}
			Gcmd3_P();
            }
        else
            Com3Flag=0;
        }        
    }
//串口3命令转换    	
void	Com3toCom1Edit(void)
	{
		SendCom1Para3[1]=GCom3getCmd[1];
        SendCom1Para3[2]=GCom3getCmd[2];
        SendCom1Para3[3]=GCom3getCmd[3];
        SendCom1Para3[4]=GCom3getCmd[4];
        SendCom1Para3[5]=GCom3getCmd[5];
     }
//串口1缓存清零
void  clearhc(void)
	{int i;
	  for (i=1;i<=48;i++)
	     {GCom1get[i]=0;}
	}
//COM2命令处理	
void	Gcmd2_P(void)
	{	int	i;
		switch (Gcmd2)
        			{
        				case 1 :
        				 	THR2=0x03;THR2=0xfc;THR2=0x01;THR2=0x00;THR2=0x01;
        					break;
        				case 2 :
							THR2=0x03;THR2=0xfc;THR2=0x02;THR2=0x00;THR2=0x02;
        					break;
        				case 3 :
        					THR2=0x03;THR2=0xfc;THR2=0x03;THR2=0x00;THR2=0x03;
        					break;
        				case 4 :           //返回串口2假删除
        					THR2=0x03;THR2=0xfc;THR2=0x04;THR2=0x00;THR2=0x04;
        					if(DFchoose==1)			//dan
        						{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;}
        						else  if (DFchoose==0)		//fu  有可能缺次扫描
        								{if(Cmd6OKF2==1)
											{Com2DelOK=1;Cmd6OKF2=0;}
										}       									
        					break;
        				case 5 :
        					//THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2D;THR2=0x05^Car2D;
        					if(DFchoose==1)			//dan
        						{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2D;THR2=0x05^Car2D;}
        					else if((DFchoose==0)&&(Com2DelOK==0))		//fu
        						{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=Car2F;THR2=0x05^Car2F;}
        						else if((DFchoose==0)&&(Com2DelOK==1))
        							{THR2=0x03;THR2=0xfc;THR2=0x05;THR2=0x00;THR2=0x05;}
        					break;
        				case 6 :
        					port6=1;
        					if(DFchoose==1)			//dan
	        					{
	        					for(i=1;i<=48;i++)
	        						{Sendcom2char[i]=GCom1Array[Gcheci2][i];}	
	        					 //getonecar(Sendcom2char,GCom1Array,Gcheci2);
	        				 	 //Sendcom2char[48]=JYH_P();
	        					 Uart2_Txd_Data(Sendcom2char);
        						}
        					if(DFchoose==0)			//fu
	        					{
	        					for(i=1;i<=48;i++)
	        						{Sendcom2char[i]=GCom1Array[2][i];}
	        					 //getonecar(Sendcom2char,GCom1Array,2);	
	        					 Sendcom2char[4]=1;
	        				 	 //Sendcom2char[48]=JYH_P();
	        				 	 Uart2_Txd_Data(Sendcom2char);	
        						}
        					Cmd6OKF2=1;		
        				 	break;			
        			}//switch
		
	}
//COM3命令处理	
void	Gcmd3_P(void)
	{	int	i;
		switch (Gcmd3)
        			{
        				case 1 :
        				 	THR3=0x03;THR3=0xfc;THR3=0x01;THR3=0x00;THR3=0x01;
        					break;
        				case 2 :
        					THR3=0x03;THR3=0xfc;THR3=0x02;THR3=0x00;THR3=0x02;
        					break;
        				case 3 :
        					THR3=0x03;THR3=0xfc;THR3=0x03;THR3=0x00;THR3=0x03;
        					break;
        				case 4 :                 //返回串口3假删除
        					THR3=0x03;THR3=0xfc;THR3=0x04;THR3=0x00;THR3=0x04;
        					if(DFchoose==1)
        						{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;}
        						else  if (DFchoose==0)
        								{if(Cmd6OKF3==1)
											{Com3DelOK=1;Cmd6OKF3=0;}
										}       									
        					break;
        				case 5 :           
        					if(DFchoose==1)			//dan
        						{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=Car3D;THR3=0x05^Car3D;}
        					else if((DFchoose==0)&&(Com3DelOK==0))		//fu
        						{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=Car3F;THR3=0x05^Car3F;}
        						else if((DFchoose==0)&&(Com3DelOK==1))  //删除过 返回0
        							{THR3=0x03;THR3=0xfc;THR3=0x05;THR3=0x00;THR3=0x05;}
        					break;
        				case 6 :
        					port6=0;
        					if(DFchoose==1)			//dan
	        					{
	        						for(i=1;i<=48;i++)
	        						{Sendcom3char[i]=GCom1Array[Gcheci3][i];}
	        						//getonecar(Sendcom3char,GCom1Array,Gcheci3);
	        						//Sendcom3char[48]=JYH_P();
	        						Uart3_Txd_Data(Sendcom3char);
        						}
        					if(DFchoose==0)			//fu
	        					{
	        						for(i=1;i<=48;i++)
	        						{Sendcom3char[i]=GCom1Array[1][i];}
	        						//getonecar(Sendcom3char,GCom1Array,1);
	        					 	Sendcom3char[4]=1;
	        				 	 	//Sendcom3char[48]=JYH_P();
	        				 	 	Uart3_Txd_Data(Sendcom3char);	
        						}
        					Cmd6OKF3=1;		
        				 	break;			
        			}     	
	}

unsigned char	JYH_P()
	{int	jy,i;
		jy=0;
		for(i=3;i<=47;i++)
			{
				jy=jy^GCom1getchar[i];
			}
		return(jy);	
	}
void	getallche(void)
	{	int	i,j;
		THR1=0x02;THR1=0xfd;THR1=0x05;THR1=0x00;THR1=0x05;
	    ScanCom1(GCom1getchar,5);
	    DqCarsum=GCom1getchar[4];		//当前车道车辆总数
	    for(i=1;i<=DqCarsum;i++)
	    	{	THR1=0x02;
			    THR1=0xfd;
			    THR1=0x06;
			    THR1=i;
			    THR1=0x06^i;
			    ScanCom1(GCom1getchar,48);
			    for(j=1;j<=48;j++)
			    	{GCom1Array[i][j]=GCom1getchar[j];
			    	}
			 //delay();   	
	    	}
	}
/*void	getonecar(unsigned	char buf1[],unsigned char buf2[][],int checi)
	{	int	i;
		for(i=1;i<=48;i++)
	        {buf1[i]=buf2[checi][i];}
	}*/	
void	DFmodle(void)
	{	int p;
		p=signal;
		signal=port7007;
		if((signal&0x02)^(p&0x02)==1)
			{Com2DelOK=0;Com3DelOK=0;}
     	if((signal&0x02)==2) 			
     		{DFchoose=1;}			//单收费
     		else if((signal&0x02)!=2)					
     			{DFchoose=0;}		//复收费
	}

void	CarSet(void)
	{
		if(DFchoose==1)
			{Car2D=DqCarsum;Car3D=0;}
			else if (DFchoose==0)
					{	if(DqCarsum==0)
							{Car2F=0;Car3F=0;}
							else if(DqCarsum==1)
								{Car2F=0;Car3F=1;}
								else if (DqCarsum>=2)
									{Car2F=1;Car3F=1;}
					}
	}

void	Del_P(void)
	{                                     //串口3和串口2都发过删除车辆命令时
		if((DFchoose==0)&&(Com3DelOK==1)&&(Com2DelOK==1))  //发给工控机(串口1)两次删除命令
			{THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;
			 ScanCom1(GCom1getchar,5);
			 if(ScanOK==1)
				 {THR1=0x02;THR1=0xfd;THR1=0x04;THR1=0x00;THR1=0x04;
				 	ScanCom1(GCom1getchar,5);
				    Com3DelOK=0;Com2DelOK=0;}
		     }	
	}		
	
void UART_SETUP()  
{   
//串口1配置
	LCR1 = 0x80;  //DLAB=1 访问除数和功能切换寄存器
	DLL1 = 0x18;//18==9600,02==115200;    
	DLM1 = 0x00;  //波特率=9600
    LCR1 = 0x03;  //WLS1,WLS0=11,数据长度为8位  
	FCR1 = 0x01;  //使能FIFO发送和接收
	//MCR1 = 0x20;  //AUTO-CTS ENABLED
	IER1 = 0x00;  //开550接收中断
//串口2配置	
	LCR2 = 0x80;  //DLAB=1 访问除数和功能切换寄存器
	DLL2 = 0x18;//18==9600,02==115200;    
	DLM2 = 0x00;  //波特率=9600
    LCR2 = 0x03;  //WLS1,WLS0=11,数据长度为8位  
	FCR2 = 0x01;  //使能FIFO发送和接收
	//MCR2 = 0x20;  //AUTO-CTS ENABLED
	IER2 = 0x01;  //开550接收中断
//串口3配置	
	LCR3 = 0x80;  //DLAB=1 访问除数和功能切换寄存器
	DLL3 = 0x18;//18==9600,02==115200;    
	DLM3 = 0x00;  //波特率=9600
    LCR3 = 0x03;  //WLS1,WLS0=11,数据长度为8位  
	FCR3 = 0x01;  //使能FIFO发送和接收
	//MCR3 = 0x20;  //AUTO-CTS ENABLED
	IER3 = 0x01;  //开550接收中断
	    
    asm("	ssbx	INTM");	// 关中断,进行关键设置时不许打扰
	uWork=PMST;			// 设置PMST寄存器
	PMST =uWork&0xff;	// 中断向量表起始地址=80H
	
	IMR=0x0f;
	//IMR = 0x7;			// 使能INT0
	TCR = 0x41f;		// 预分频系数为16
	TIM = 0xf000;		// 时钟计数器清0
	PRD = 0x0f423;		// 周期寄存器为0ffH
	TCR = 0x42f;		// 复位、启动
	IFR = 0xff;		// 清中断标志位
	asm("	rsbx	INTM");	// 开中断
}
	
void	ledf(int fsum)
	{	int i;
		for(i=1;i<fsum;i++); 
		{	asm("  RSBX  XF ");       
       		delay();
       		delay();
       		delay();
       		delay();
       		asm("  SSBX  XF ");       
		    delay();
		    delay();
		    delay();
		    delay();
		 }    
	}	

void  delay()
{   int j=0,k=0;
     for(j=0;j<30000;j++);
     for(k=0;k<30000;k++);
    
}
	
void  f_w_p(int i,int addr,int data)	//写具体页具体地址具体数据
	{	
		port5=i;
		flash[0x555]=0xaa;
		flash[0x2aa]=0x55;
		flash[0x555]=0xa0;
		flash[addr]=data; 
            
            timeoutcount = 0;
			do timeoutcount += 1;
			while(flash[addr] != data && timeoutcount < 0xffffff);						
        port5=0;    
            //if(timeoutcount == 0xffff)
            	//break;
	}	
	
					
void	flash_sector_erase(int i)	//段擦除
	{
		port5=i;
		flash[0x555]=0xaa;delay();
		flash[0x2aa]=0x55;delay();
		flash[0x555]=0x80;delay();
		flash[0x555]=0xaa;delay();
		flash[0x2aa]=0x55;delay();
		flash[i]=0x30;delay();
		port5=0;
	}											
void wait(int nWait)
{
	int i,j,k=0;
	for ( i=0;i<nWait;i++ )
		for ( j=0;j<15;j++ )
			k++;
}

//模拟软件正常工作。
//080601  串口2、3分别用SWITCH函数来处理
//080602  初步调试成功,双串口能协调删除车辆,我太高兴了
//080604  单复收费调试初步成功,等待检测BUG,我真高兴~~~~~	   
//080609  再次验证单复联合工作情况  基本没问题,待后续验证
//080609a 从复进入单模式时,清除Com2DelOK、Com3DelOK,新旧亭要车辆数据时,对应的灯亮  主(旧)亭 port6=1  辅(新)亭 port6=0
//080609c 初步定为正式试用版
//080610a  解决自启动不运行的问题
//080610c  加入JYH_P()  计算3-47校验和,并存放在第48字节数,然后发送
//080614	修改串口1扫描函数超时计数植为4000  原来为5FFF 操他娘的!!
//080722   命令处理放入中断函数中处理  未调试
//080725   已经调试通过



⌨️ 快捷键说明

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