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

📄 slave.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 5 页
字号:
        }
        ClearMyRam(MyDataLenAdd);                                //写完后,原来的计数值清零,重新存储. 
		/********************************************从机外设数据******************************************/

		/********************************************从机报警数据******************************************/
        len = MyReadOneByte(WsAlarmLen);                 //取出从机1报警动作号长度. 
	    CopyToComRam(WsAlarm,ComAlarmStart3,len);        //拷贝从机的报警动作号到公共RAM中. 
	    ComWriteOneByte(ComAlarmLenAdd3,len);             //从机报警动作号长度写入公共RAM中.
	    MyWriteOneByte(WsAlarmLen,0x00);                 //清除从机1报警动作号长度. 
       /********************************************从机报警数据******************************************/
	}

	if(SlaveCode == SlaveCode4)
	{
	    /********************************************从机外设数据******************************************/
	    length=GetMyDataBytes(MyDataLenAdd);                    //再取出从机1数据的长度。
        if((length > 0) && (length <= MaxSlaveDataLen))
        {
          ClearComRam(ComSlaveLenAdd4);                          //先清除公共RAM数据区从机1数据的长度。
	      CopyToComRam(MyDataLenAdd,ComSlaveLenAdd4,2);         //再把长度写入公共RAM区从机1的长度地址中。
	      CopyToComRam(MyDataStart,ComSlaveDataStart4,length);  //再把从机的数据拷贝到公共RAM中去。
        }
        ClearMyRam(MyDataLenAdd);                                //写完后,原来的计数值清零,重新存储. 
		/********************************************从机外设数据******************************************/

		/********************************************从机报警数据******************************************/
        len = MyReadOneByte(WsAlarmLen);                 //取出从机1报警动作号长度. 
	    CopyToComRam(WsAlarm,ComAlarmStart4,len);        //拷贝从机的报警动作号到公共RAM中. 
	    ComWriteOneByte(ComAlarmLenAdd4,len);             //从机报警动作号长度写入公共RAM中.
	    MyWriteOneByte(WsAlarmLen,0x00);                 //清除从机1报警动作号长度. 
       /********************************************从机报警数据******************************************/
	}

	if(SlaveCode == SlaveCode5)
	{
	    /********************************************从机外设数据******************************************/
	    length=GetMyDataBytes(MyDataLenAdd);                    //再取出从机1数据的长度。
        if((length > 0) && (length <= MaxSlaveDataLen))
        {
          ClearComRam(ComSlaveLenAdd5);                          //先清除公共RAM数据区从机1数据的长度。
	      CopyToComRam(MyDataLenAdd,ComSlaveLenAdd5,2);         //再把长度写入公共RAM区从机1的长度地址中。
	      CopyToComRam(MyDataStart,ComSlaveDataStart5,length);  //再把从机的数据拷贝到公共RAM中去。
        }
        ClearMyRam(MyDataLenAdd);                                //写完后,原来的计数值清零,重新存储. 
		/********************************************从机外设数据******************************************/

		/********************************************从机报警数据******************************************/
        len = MyReadOneByte(WsAlarmLen);                 //取出从机1报警动作号长度. 
	    CopyToComRam(WsAlarm,ComAlarmStart5,len);        //拷贝从机的报警动作号到公共RAM中. 
	    ComWriteOneByte(ComAlarmLenAdd5,len);             //从机报警动作号长度写入公共RAM中.
	    MyWriteOneByte(WsAlarmLen,0x00);                 //清除从机1报警动作号长度. 
       /********************************************从机报警数据******************************************/
	}                                    	
}

/***********************************************************************************************************
功能:CopyAllToMyRam(),把公共RAM中所有相应的数据拷贝到再带RAM中去。
描述:实现把公共RAM中所有相应的数据拷贝到再带RAM中去,主要是拷贝服务器发来的存储在公共RAM中的命令。
参数:无
返回:无
************************************************************************************************************/
void CopyAllToMyRam()
{	
    uint length = 0; 
    length = GetComDataBytes(ComLenOrder);            //再取出公共RAM中命令的长度。
	if((length > 0) && (length <= MaxOrderLen))
	{
	    ClearMyRam(MyOrderLen);                           //先清楚自带RAM中的长度。
	    CopyToMyRam(ComLenOrder,MyOrderLen,2);          //再把公共RAM的长度写入再带RAM的长度中去。
	    CopyToMyRam(ComOrderStart,MyOrderStart,length); //从公共RAM拷贝命令到自带RAM中去。
	    FlagProcessOrderStart = 1;                                   //置位拷贝标志位。
	}       
}
	               
/***********************************************************************************************************
功能:SetSampleRate,设置采集外设数据的速率。
描述:设置采集外设数据的速率。
参数:无
返回:无
************************************************************************************************************/
void SetSampleRate(uint rate)
{
   Sample = rate/SampleBase;
}
/***********************************************************************************************************
功能:SendOrder,发送外设采集数据命令。
描述:实现根据外设类型的不同发送不同的外设数据采集命令。
参数:无
返回:无
************************************************************************************************************/
void SendOrder(uchar n)
{
   if(WsType == WsType1)
   {
	  Send7017Order(n);
   }
   else if(WsType == WsType2)
  {
	  Send7053Order(n);
  }
}

/***********************************************************************************************************
功能:SendAllOrder,发送所有外设的数据采集命令。
描述:实现不同外设数目的数据采集命令,在同一个从机外设类型是一样的。按从机1-从机2-从机3-从机4-从机5-从机1的顺
     序发送,假如外设个数小于5个,按同样的顺序处理。每一个外设命令的发送都要满足一定的条件:1.前面的外设数据
     已返回,通过FlagWsSend[]数组来判断;2.假如前面的外设没有返回,而且时间超过了WaitLen个周期,则自动发送下
	 一个外设的数据采集命令。n-表示当前正在采集数据的外设编号。
参数:无
返回:无
************************************************************************************************************/
void SendAllOrder()
{
           if(n==WsNumber)             //当到了一轮的最后一个外设的时候。
		   {
		     if(FlagWsSend[n-1])       //如果前一个外设的数据已返回。
			 { 
			   n=1;                    //则下一个采集的是1号从机。
			   SendOrder(n);           //发送数据采集命令。
               FlagWsSend[n-1] = 0;    //复位前一个从机的数据返回标志。
			   TimesNum = 0;
			 }
			 else
			 {
			   if(TimesNum > WaitLen)  //如果到了规定的时间前一个从机数据依然没有返回。
			   {
			     n=1;                  //则下一个采集的是1号从机。
			     SendOrder(n);         //发送数据采集命令。
                 FlagWsSend[n-1] = 0;  //复位前一个从机的数据返回标志。
				 TimesNum = 0;
			   }
			 }		     
		   }

		   if(n==1 && n<WsNumber)     //当到了第1个外设的时候,而且外设的数目大于1.
		   {
		     if(FlagWsSend[0])        //如果1号外设的数据已返回。
			 { 
			   n=2;                   //则下一个采集的是2号从机。
			   SendOrder(n);          //发送数据采集命令。
               FlagWsSend[0] = 0;     //复位1号外设的数据返回标志。
			   TimesNum = 0;
			 }
			 else
			 {
			   if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
			   {
			     n=2;                 //则下一个采集的是2号从机。
			     SendOrder(n);        //发送数据采集命令。
                 FlagWsSend[0] = 0;   //复位1号外设的数据返回标志。
				 TimesNum = 0;
			   }
			 }		     
		   }

		   if(n==2 && n<WsNumber)    //当到了第2个外设的时候,而且外设的数目大于2。
		   {
		     if(FlagWsSend[1])       //如果2号外设的数据已返回。
			 { 
			   n=3;                  //则下一个采集的是3号从机。
			   SendOrder(n);         //发送数据采集命令。
               FlagWsSend[1] = 0;    //复位2号外设的数据返回标志。
			   TimesNum = 0;
			 }
			 else
			 {
			   if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
			   {
			     n=3;                 //如果2号外设的数据已返回。
			     SendOrder(n);        //发送数据采集命令。
                 FlagWsSend[1] = 0;   //复位2号外设的数据返回标志。
				 TimesNum = 0;
			   }
			 }		     
		   }

		   if(n==3 && n<WsNumber)     //当到了第3个外设的时候,而且外设的数目大于3。
		   {
		     if(FlagWsSend[2])        //如果3号外设的数据已返回。
			 { 
			   n=4;                   //则下一个采集的是4号从机。
			   SendOrder(n);          //发送数据采集命令。
               FlagWsSend[2] = 0;     //复位3号外设的数据返回标志。
			   TimesNum = 0;
			 }
			 else
			 {
			   if(TimesNum > WaitLen) //如果到了规定的时间前一个从机数据依然没有返回。
			   {
			     n=4;                 //则下一个采集的是4号从机。
			     SendOrder(n);        //发送数据采集命令。
                 FlagWsSend[2] = 0;   //复位3号外设的数据返回标志。
				 TimesNum = 0;
			   }
			 }		     
		   }

		   if(n==4 && n<WsNumber)      //当到了第4个外设的时候,而且外设的数目大于4。
		   {
		     if(FlagWsSend[3])         //如果4号外设的数据已返回。
			 { 
			   n=5;                    //则下一个采集的是5号从机。
			   SendOrder(n);           //发送数据采集命令。
               FlagWsSend[3] = 0;      //复位4号外设的数据返回标志。
			   TimesNum = 0;
			 }
			 else
			 {
			   if(TimesNum > WaitLen)  //如果到了规定的时间前一个从机数据依然没有返回。
			   {
			     n=5;                  //则下一个采集的是5号从机。
			     SendOrder(n);         //发送数据采集命令。
                 FlagWsSend[3] = 0;    //复位4号外设的数据返回标志。
				 TimesNum = 0;
			   }
			 }		     
		   }
}

/***********************************************************************************************************
功能:main
描述:
参数:无
返回:无
************************************************************************************************************/ 
void main()
{	
	xdata uchar DefaultConfig[SlaveParaLen];
    uint i = 0;
	n = 1;
    
    InitSerialCom();      //串口初始化。
    Time0Initial();        //定时器0初始化。
	SCONF |= 0x02;         //使用xdata的使能控制.
	P20 = 1; 
    DefaultConfig[0] = 0x02;  //波特率。
	DefaultConfig[1] = 0x02;  //外设的类型,WsType1(0x01)表示外设是7017,WsType2(0x02)表示外设是7053
	DefaultConfig[2] = 0x02;  //从机的外设个数
	DefaultConfig[3] = 0x10;  //读取外设数据的时间间隔
	DefaultConfig[4] = 0x00;  //读取外设数据的时间间隔
/****************************************从机默认初始化参数*****************************************/
    MyWriteBytes(MySlaveParaStart,DefaultConfig,SlaveParaLen);
    MyReadBytes(MySlaveParaStart,DefaultConfig,SlaveParaLen);    //读取默认从机配置信息到配置数组。
	BodeRate = DefaultConfig[0];                                 //从机与外设通讯的波特率
    WsType = DefaultConfig[1];                                   //外设的类型,WsType1(0x01)表示外设是7017,WsType2(0x02)表示外设是7053    
    WsNumber = DefaultConfig[2];                                 //从机的外设个数
    ReadDataRate = DefaultConfig[3] * 0x100 + DefaultConfig[4];  //读取外设数据的时间间隔
	SetBodeRate(BodeRate);//设置波特率。
    SetSampleRate(ReadDataRate);//设置采集数据的频率。
/****************************************从机默认初始化参数*****************************************/
/****************************************从机自带RAM初始化*****************************************/
	ClearMyRam(MyDataLenAdd);
	ClearMyRam(MyOrderLen);	
	MyWriteOneByte(WsAlarmLen,0x00);

/****************************************从机自带RAM初始化*****************************************/
	if(WsType == WsType1)       //如果外设是7017,则RecvDataSize==56。
	{
	   RecvDataSize = LenRecvWsType1;
	}
	else if(WsType == WsType2)  //如果外设是7053,则RecvDataSize==4。
	{
	   RecvDataSize = LenRecvWsType2;
	}

	for(i=0;i<RecvDataSize;i++)
	{
	   RecvDataBuff[i]=0;        //初始化外设数据接收数组。
	}

    while(1)
    {     
		if(FlagProcessRecvData)   //如果外设数据已接收在数组中。
	    {
		   if(WsType == WsType1)
		   {
		     Process7017RecvData(n); //处理外设n7017的数据。
		   }
		   else if(WsType == WsType2)

⌨️ 快捷键说明

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