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

📄 slave.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 5 页
字号:
					        address1++;                            //地址向后移一个字节.
					        Len=MyReadOneByte(address1);           //取出命令长度.
                            address1++;                            //地址向后移一个字节.
                            MyReadBytes(address1,ProcessBuff,Len); //然后把包读到ProcessBuff中。
                            SendStringCom(ProcessBuff,Len);        //发送命令到外设。               
                            address1+=Len;                         //更新地址.
                            break;
		               default:
		                    break;
		         }         
		     }

			 else   //所取的命令不是该从机的处理情况
			 {
			      switch(BagFlagTemp)               //判断包标识
	               {
	   	               case CmdWs:                   //若是外设参数包
					        Len=LenCmdWs-2;          //取出除掉前3个字节之后的包的长度。
					        address1+=Len;          //更新地址
					        break;
                       case CmdSlave:               //若是从机参数包
					        Len=LenCmdSlave-2;      //取出除掉前3个字节之后的包的长度。
                            address1+=Len;   //更新地址
					        break;       
	                   case CmdWsControl:                          //若是外设控制包.
					        Len=MyReadOneByte(address1 + 2);           //取出命令长度.              
                            address1+=(Len+3);                         //更新地址.
                            break;
		               default:
		                    break;
		         }         
			    				    
			 }
		
         }
		
      }  
   }
}

/***********************************************************************************************************
功能:SetBodeRate
描述:设置波特率,假设晶振为12MHZ
参数:boderate---波特率编号
返回:无
************************************************************************************************************/
void SetBodeRate(uchar boderate)
{
   switch(boderate)
   {
	case 0x01:            //2400
              TH1=0xE6;
	          break;      
	case 0x02:            //4800
              TH1=0xF3;
	          break;     
	case 0x03:            //9600
              TH1=0xF9;
	          break;          
      default:
	          break;
    }

     TR1=1;//定时器1开
}

/***********************************************************************************************************
功能:Send7017Order,发送7017外设数据采集命令。
描述:通过外设号给7017类型的外设发送采集数据的命令。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void  Send7017Order(uchar wsaddress)
{
   switch(wsaddress)
   {
		   case 01: //外设1
		   {
				SendBuff[0]=0x23;  SendBuff[1]=0x30;   SendBuff[2]=0x31;  SendBuff[3]=0x0D;  //#01
			}   
			break;
				
			case 02: //外设2
			{
				SendBuff[0]=0x23;  SendBuff[1]=0x30;   SendBuff[2]=0x32;  SendBuff[3]=0x0D;  //#02
			}   
			break;
				
			case 03: //外设3
			{
				SendBuff[0]=0x23;  SendBuff[1]=0x30;  SendBuff[2]=0x33;	 SendBuff[3]=0x0D;  //#03
			}   
			break;
				
		    case 04: //外设4
			{
				SendBuff[0]=0x23;  SendBuff[1]=0x30;  SendBuff[2]=0x34;	 SendBuff[3]=0x0D;  //#04
			}   
			break;
				
		    case 05: //外设5
			{
				SendBuff[0]=0x23;  SendBuff[1]=0x30;  SendBuff[2]=0x35;	 SendBuff[3]=0x0D;  //#05
			}   
			break;

			default:
			  break;
				
	}
	SendStringCom(SendBuff,4);
}

/***********************************************************************************************************
功能:Send7053Order,发送7053外设数据采集命令。
描述:通过外设号给7053类型的外设发送采集数据的命令。
参数:wsaddress---外设编号
返回:无
************************************************************************************************************/
void  Send7053Order(uchar wsaddress)
{
    switch(wsaddress)
	{
			case 01: //外设1
			{
				SendBuff[0]=0x40;  SendBuff[1]=0x30;  SendBuff[2]=0x31;	 SendBuff[3]=0x0D;  //@01
			}                
			break;
				
			case 02: //外设2
			{
				SendBuff[0]=0x40;  SendBuff[1]=0x30;  SendBuff[2]=0x32;	 SendBuff[3]=0x0D;  //@02
			}
			break;
				
			case 03: //外设3
			{
				SendBuff[0]=0x40;  SendBuff[1]=0x30;  SendBuff[2]=0x33;	 SendBuff[3]=0x0D;  //@03
			}
			break;
				
			case 04: //外设4
			{
				SendBuff[0]=0x40;  SendBuff[1]=0x30;  SendBuff[2]=0x34;	 SendBuff[3]=0x0D;  //@04
			}
			break;
				
			case 05: //外设5
			{
				SendBuff[0]=0x40;  SendBuff[1]=0x30;  SendBuff[2]=0x35;	 SendBuff[3]=0x0D;  //@05
			}
			break;
				
			default:
			  break;
	}
	SendStringCom(SendBuff,4);
}

/***********************************************************************************************************
功能:WsSerialRecieve,接收外设发送来的数据。
描述:通过串口中断接收外设发送过来的数据,保存在RecvDataBuff数组里,数据接收完毕时通过标识FlagProcessRecvData
     通知Process7017RecvData或者Process7053RecvData函数来打包接收的数据。
参数:无
返回:无
************************************************************************************************************/
void WsSerialRecieve() interrupt 4 using 3    
{ 
   if(RI) 
   {  
     uchar ch;
	 RI = 0; 
     ch = SBUF; 
     if(ch==0x3E)                   //若第一个字符为数据开始字符">"。
     { 
	   FlagStartRecv=1;             //开始接收标志置位。
	   RecvDataCount = -1;          //第一个字符不接收。
 	 }

     if(FlagStartRecv)              //若可以开始接收
	 {         
	   if(RecvDataCount >=0)        //若接收的个数大于0,验证接收个数的有效性。
	   {
	     RecvDataBuff[RecvDataCount]=ch;    //保存接收的数据
	   }
	   RecvDataCount++;                     //接收的个数加一
	   if(RecvDataCount > (RecvDataSize-1)) //如果接收的数据已经接收完毕
       {
		   FlagProcessRecvData=1;           //FlagProcessRecvData置位,通知函数来打包该数据。		   
           FlagStartRecv=0;                 //开始接收标识复位,暂时不接受外设数据。
           RecvDataCount=-1;                //接收个数也复位为-1.
	   }
	  }
    }
}

/***********************************************************************************************************
功能:Process7017RecvData,打包7017的外设数据。
描述:当外设为7017,且FlagProcessRecvData==1时,调用该函数来打包外设7017的数据,并且保存在相应的存储器中。
参数:wsaddress---外设编号
返回:无
***********************************************************************************************************/
void Process7017RecvData(uchar wsaddress)
{
    uchar j=0,len=0;           //通道值
	uchar Output = 0;          //保存输出动作号。
	uchar TempH,TempL;     //TempH---用来保存整数,TempL---用来保存小数	
	uint Max,Min;	
	uint length;
	uint Temp1;
	uint address1;     //原来的外设的最大最小等信息的存储地址
	uint address2;     //从机的数据存储地址 ; 
	uint address3;     //报警值存储地址。
	xdata uchar TempBuff[WsChannelParaLen];
	xdata uchar TiJiaoDataBuff[7];
	for(j = Channel1 ;j <= Channel8;j++)
	{
	    TempH=(RecvDataBuff[j*7+1]-0x30)*10+(RecvDataBuff[j*7+2]-0x30);//取出2为整数,并且转化为数值。
		if(RecvDataBuff[j*7] == 0x2D)//判断数据的符号,若为负。
		TempH=TempH|0x80;      //将最高位置1,标识该值为负。

		TempL=(RecvDataBuff[j*7+4]-0x30)*10+(RecvDataBuff[j*7+5]-0x30);  //除掉小数点,取出2位小数位(有3位)。

        address1=Ws1channel1 +(wsaddress-1)* 0x100+ j * 0x10;

	 	MyReadBytes(address1,TempBuff,WsChannelParaLen);//读原来的最大,最小值等信息

        //通道j的参数    最大值整数,最大值小数,最小值整数,最小值小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超低报警动作号,超低报警动作号。
		//  TempBuff[i]       0         1          2          3           4          5          6          7       8         9               10
		if(1/*TempBuff[8]*/) //使能位为1,提交数据包
		{
			TiJiaoDataBuff[0]=StartFlag;     //包开始标识
            TiJiaoDataBuff[1]=CmdSendSlave;  //包标志
            TiJiaoDataBuff[2]=SlaveCode;     //从机编号
            TiJiaoDataBuff[3]=wsaddress;     //外设编号
            TiJiaoDataBuff[4]=j;             //通道编号
            TiJiaoDataBuff[5]=TempH;         //整数数值
            TiJiaoDataBuff[6]=TempL;         //小数数值

            length=GetMyDataBytes(MyDataLenAdd); //取出当前已保存的数据长度,用来计算下一次的保存地址。
 		    if((length +7) > DataLen7017)
			{
			   address2 = MyDataStart;
			   MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave);     //以数据包的形式存储到存储器。
			   MyWriteOneByte(MyDataLenAdd,(DataLen7017%256));           //设置新的数据长度。
			   MyWriteOneByte(MyDataLenAdd+1,(DataLen7017/256));         //设置新的数据长度。
			}
			else
			{
			   address2 = MyDataStart + length;       //计算保存的地址。
               MyWriteBytes(address2,TiJiaoDataBuff,LenCmdSendSlave); //以数据包的形式存储到存储器。
               SetMyDataBytes(MyDataLenAdd,LenCmdSendSlave);         //设置新的数据长度。
			}
            
            //通道j参数   最大值整数,最大值小数,最小值整数,最小值小数,超高报警高,超高报警低,超低报警高,超低报警低,使能,超高报警动作号,超低报警动作号。
		    //TempBuff[i]     0         1          2          3           4          5          6          7       8         9               10
            Temp1=TempH*100+TempL; //比较是否报警
		    Max=TempBuff[0]*100+TempBuff[1];
		    Min=TempBuff[2]*100+TempBuff[3];    
          
			if(Temp1 >= Max)   //如果大于最大值,则超高报警
			{
				Output = TempBuff[9];   //取出报警号
				if(Output != 0xFF)
				{
				   len=MyReadOneByte(WsAlarmLen);
			       address3=WsAlarm + len;
                   MyWriteOneByte(address3,Output);
			       MyWriteOneByte(WsAlarmLen,len + 1);
				}				
			}
            else if (Temp1 <= Min)
			{
				Output = TempBuff[10];  //超低报警
                
				if(Output != 0xFF)
				{
				   len=MyReadOneByte(WsAlarmLen);
			       address3=WsAlarm + len ;
                   MyWriteOneByte(address3,Output);
			       MyWriteOneByte(WsAlarmLen,len + 1);

⌨️ 快捷键说明

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