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

📄 main.c

📁 这是一个单片机的项目
💻 C
📖 第 1 页 / 共 3 页
字号:
   uint address2;
   uint length;
   xdata uchar array[5];
   xdata uchar array2[9];
   length=GetMyDataBytes(MyLenChannelInfo);
   
   if(length > 0)
   {
      address1=MyChannelInfoStart;
      while(address1< (MyChannelInfoStart + length))
      {
         MyReadBytes(address1,array,LenCmdGetChannelPara);

         if((array[0] == 0x2A)  &&  (array[1] == 0xA7) )	
         {
           address2 = Slave1Ws1ChannelInfo + (array[2]-1)*0x500 + (array[3]-1)* 0x100+ array[4]*9 ;
           MyReadBytes(address2,array2,LenCmdChannelPara);
           SendStringCom(array2,LenCmdChannelPara);

         }
         address1 +=LenCmdGetChannelPara;  
      }
   }
   ClearMyRam(MyLenChannelInfo); 
}


/****************************************************************************************
功能:SendSlaveData,把从机采集的数据通过串口发到服务器
描述:实现把从机采集的数据通过串口发到服务器,
参数:AddStart---数据存储的起始地址,AddLen---数据长度的保存地址
返回:无
****************************************************************************************/
void SendSlaveData(uint AddStart,uint AddLen)
{
     uint Len,address;
	 uchar len1,len2,i;
     Len=GetMyDataBytes(AddLen);  //先取得需要发送的字节长度。

     len1=(uchar)(Len / NUM1);    //取得需要拷贝NUM1长度数据的次数
     len2=(uchar)(Len % NUM1);    //取得不足NUM1长度的剩下数据长度

     address=AddStart;

	 if(Len>0)  //验证Len的有效性
	 {  
		if(Len>NUM1)  //要拷贝的数据长度大于NUM1
		{		    
			for(i=0;i<len1;i++)
			{
				MyReadBytes(address,SendSlaveDataBuff,NUM1);   
				SendStringCom(SendSlaveDataBuff,NUM1);                   
                address += NUM1;
			}
			MyReadBytes(address,SendSlaveDataBuff,len2);
			SendStringCom(SendSlaveDataBuff,len2);
		}
		else       //要拷贝的数据长度小于NUM1
	    {
			MyReadBytes(address,SendSlaveDataBuff,Len);
			SendStringCom(SendSlaveDataBuff,Len);
 		}
        ClearMyRam(AddLen);	 //发送完毕之后,清楚字节长度
	 }
}

/****************************************************************************************
功能:CopyToComRam,把自带RAM保存的命令通过缓冲区CopyOrderBuff拷贝到公共RAM区域里面.
描述:实现把自带RAM保存的命令通过缓冲区CopyOrderBuff拷贝到公共RAM区域里面,CopyOrderBuff的
     长度是NUM1,分为要拷贝的数据长度大于和小于NUM1两种情况来处理。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度 
返回:无
****************************************************************************************/
void CopyToComRam(uint address1,uint address2,uint length)
{
   uchar i,len1,len2;


   len1 = (uchar)(length/ NUM1);   //取得需要拷贝NUM1长度数据的次数
   len2 = (uchar)(length % NUM1);  //取得不足NUM1长度的剩下数据长度

   	if(length>0)   //验证length的有效性
	{
		 if(length>NUM1)  //要拷贝的数据长度大于NUM1
		 {
			for(i=0;i<len1;i++)
			{
				MyReadBytes(address1,CopyToComRamBuff,NUM1);        //先读address1开始的NUM1个数据到CopyBuff里面
				ComWriteBytes(address2,CopyToComRamBuff,NUM1);      //先把CopyBuff里面NUM1个数据写入address2开始的地址          
	            address1  += NUM1 ;
	            address2  += NUM1 ;
			}
			MyReadBytes(address1,CopyToComRamBuff,len2);   
			ComWriteBytes(address2,CopyToComRamBuff,len2);
		}
		else             //要拷贝的数据长度小于NUM1
		{	
			MyReadBytes(address1,CopyToComRamBuff,length);           //先读address1开始的length个数据到CopyBuff里面
			ComWriteBytes(address2,CopyToComRamBuff,length);	     //先把CopyBuff里面length个数据写入address2开始的地址 
	 	}	
  	  }	   
}

/****************************************************************************************
功能:CopyToComRam,把公共RAM保存的数据通过CopyOrderBuff拷贝到自带RAM区域里面.
描述:实现把公共RAM保存的数据通过CopyOrderBuff拷贝到自带RAM区域里面,CopyOrderBuff的长度是
     NUM1,分为要拷贝的数据长度大于和小于NUM1两种情况来处理。
参数:address1--自带RAM命令起始地址 address2--公共RAM命令起始地址 lenght--命令字节长度 
返回:无
****************************************************************************************/
void CopyToMyRam(uint address1,uint address2,uint length)
{
    uchar i,len1,len2;

    len1=(uchar)(length / NUM1);  //取得需要拷贝NUM1长度数据的次数
    len2=(uchar)(length % NUM1);  //取得不足NUM1长度的剩下数据长度

	if(length > 0)   //验证length的有效性
	{
		 if(length > NUM1)  //要拷贝的数据长度大于NUM1
		 {
			for(i=0; i<len1; i++)
			{
				ComReadBytes(address1,CopyToMyRamBuff,NUM1);      //先读address1开始的NUM1个数据到CopyBuff里面
				MyWriteBytes(address2,CopyToMyRamBuff,NUM1);      //先把CopyBuff里面NUM1个数据写入address2开始的地址                
	            address1  += NUM1 ;
	            address2  += NUM1 ;
			}
			ComReadBytes(address1,CopyToMyRamBuff,len2);   
			MyWriteBytes(address2,CopyToMyRamBuff,len2);
		}
		else           //要拷贝的数据长度小于NUM1
		{	
			ComReadBytes(address1,CopyToMyRamBuff,length);     //先读address1开始的length个数据到CopyBuff里面
			MyWriteBytes(address2,CopyToMyRamBuff,length);	    //先把CopyBuff里面length个数据写入address2开始的地址
	 	}	
  	}	   	  
}

/****************************************************************************************
功能:CopyAllToComRam,拷贝所有服务器发来的命令到公共RAM区。
描述:拷贝所有服务器发来的命令到公共RAM区,包括命令数据包,时间数据包和输出相关数据包。
参数:无
返回:无
****************************************************************************************/
void CopyAllToComRam()
{
    uint length = 0;
	uchar len = 0;
	
    length=GetMyDataBytes(MyLenOrder);                //再取得需要写入的字节长度
	if((length > 0) && (length <= MaxOrderLen))
	{  
	   ClearComRam(ComLenOrder);                         //先清除公共RAM区命令长度
       CopyToComRam(MyLenOrder,ComLenOrder,2);           //再把字节长度写入公共RAM区命令长度地址中去
       CopyToComRam(MyOrderStart,ComOrderStart,length);  //拷贝数据到公共RAM区相应地址中
	} 
    ClearMyRam(MyLenOrder);                           //清除自带RAM区的字节长度
   
	len = MyReadOneByte(MyLenSlaveEnable);
    if(len == 0x07)
	{  
       CopyToComRam(MySlaveEnable,ComSlaveEnable,LenCmdSlaveEnable);//拷贝数据到公共RAM区相应地址中
       ComWriteOneByte(ComLenSlaveEnable,LenCmdSlaveEnable);         //再把字节长度写入公共RAM区命令长度地址中去
       ComWriteOneByte(ComSlaveEnableNewFlag,1);	
   	   MyWriteOneByte(MyLenSlaveEnable,0);                                                 
	}   
}

/****************************************************************************************
功能:CopyAllToMyRam,拷贝公共RAM数据到自带RAM区中。
描述:从公共RAM区把从机1,从机2,从机3,从机4,从机5采集的数据拷贝到自带RAM中,等待通过串口
     发送给服务器。
参数:无
返回:无
****************************************************************************************/
void CopyAllToMyRam()
{
    uint length = 0;
    
    length = GetComDataBytes(ComSlaveLenAdd1);                  //再取得需要写入从机1的字节长度
    if((length > 0) && (length <= MaxSlaveDataLen))
    {  
	    ClearMyRam(MySlaveLenAdd1);                               //先清除从机1的数据长度
        CopyToMyRam(ComSlaveLenAdd1,MySlaveLenAdd1,2);            //再把从机1字节长度写入自带RAM区命令长度地址中去
        CopyToMyRam(ComSlaveDataStart1,MySlaveDataStart1,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
    }
	ClearComRam(ComSlaveLenAdd1);                             //清除公共RAM区的字节长度
  
	length = 0;
    length=GetComDataBytes(ComSlaveLenAdd2);                     //再取得需要写入从机2的字节长度
    if((length > 0) && (length <= MaxSlaveDataLen))
    {  
	    ClearMyRam(MySlaveLenAdd2);                               //先清除从机2的数据长度
        CopyToMyRam(ComSlaveLenAdd2,MySlaveLenAdd2,2);            //再把从机1字节长度写入自带RAM区命令长度地址中去
        CopyToMyRam(ComSlaveDataStart2,MySlaveDataStart2,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
    }
	ClearComRam(ComSlaveLenAdd2);                             //清除公共RAM区的字节长度
    
	length = 0;
    length=GetComDataBytes(ComSlaveLenAdd3);                    //再取得需要写入从机3的字节长度
    if((length > 0) && (length <= MaxSlaveDataLen))
    {  
	      ClearMyRam(MySlaveLenAdd3);                               //先清除从机3的数据长度
          CopyToMyRam(ComSlaveLenAdd3,MySlaveLenAdd3,2);            //再把从机1字节长度写入自带RAM区命令长度地址中去
          CopyToMyRam(ComSlaveDataStart3,MySlaveDataStart3,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
    } 
	ClearComRam(ComSlaveLenAdd3);                             //清除公共RAM区的字节长度
    
	length = 0;
    length=GetComDataBytes(ComSlaveLenAdd4);                     //再取得需要写入从机4的字节长度
    if((length > 0) && (length <= MaxSlaveDataLen))
    {
	      ClearMyRam(MySlaveLenAdd4);                               //先清除从机4的数据长度
          CopyToMyRam(ComSlaveLenAdd4,MySlaveLenAdd4,2);            //再把从机1字节长度写入自带RAM区命令长度地址中去
          CopyToMyRam(ComSlaveDataStart4,MySlaveDataStart4,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
    }  
	ClearComRam(ComSlaveLenAdd4);                                //清除公共RAM区的字节长度
    
	length = 0;
    length=GetComDataBytes(ComSlaveLenAdd5);                     //再取得需要写入从机5的字节长度
    if((length > 0) && (length <= MaxSlaveDataLen))
    {
	      ClearMyRam(MySlaveLenAdd5);                               //先清除从机5的数据长度
          CopyToMyRam(ComSlaveLenAdd5,MySlaveLenAdd5,2);            //再把从机1字节长度写入自带RAM区命令长度地址中去
          CopyToMyRam(ComSlaveDataStart5,MySlaveDataStart5,length); //从公共RAM拷贝从机数据到自带RAM区相应地址中
    } 
	ClearComRam(ComSlaveLenAdd5);                             //清除公共RAM区的字节长度
}

void main()
{
	 uchar i=0;
	 uint length = 0;
	 uchar xdata array[7];

/****************************************主机默认初始化参数*****************************************/
     InitSerialComm();  //串口初始化。
     Time0Initial();    //定时器0初始化。
	 SCONF |= 0x02;     //使用xdata的使能控制。
     P20 = 1;  
/****************************************主机自带RAM初始化*****************************************/
	 ClearMyRam(MyLenOrder);
	 ClearMyRam(MyLenOutput);
	 ClearMyRam(MyLenTimer); 
	 ClearMyRam(MySlaveLenAdd1);
     ClearMyRam(MySlaveLenAdd2);
	 ClearMyRam(MySlaveLenAdd3);
     ClearMyRam(MySlaveLenAdd4);
	 ClearMyRam(MySlaveLenAdd5);
	 ClearMyRam(MyLenChannelInfo); 
	 ClearMyRam(MyLenSlaveEnable);
/****************************************主机自带RAM初始化*****************************************/	 
	 for(i=0;i<7;i++)
	 {
	    RecvOrderBuff[i]=0;   //初始化外设命令接收数组。
	 }
 
	 for(i=0;i<NUM1;i++)
	 {
	    CopyToComRamBuff[i] = 0;   //初始化外设命令接收数组。
		CopyToMyRamBuff[i] = 0;
		SendSlaveDataBuff[i] = 0;
	 }

    while(1)
    {	 
	    for(i=0;i<7;i++)
	    {
	       array[i]=0;   //初始化外设命令接收数组。
	    }

  		if(FlagSaveSerial)    //命令已接收标识。
		{          
		    FlagSaveSerial=0; //复位命令已接收标识。
			SaveSerial();     //保存命令。	
		}
        
	    if(FlagExt0)          //如果有I2C使用权。
	    {			   			
	        CopyAllToMyRam();  //拷贝所有数据到自带RAM。
		    CopyAllToComRam(); //拷贝所有数据到公共RAM。
            
            FlagSendSlaveData = 1;            
			FlagExt0=0;        //外部中断0标志位复位.
		    P20 = 0;           //释放IIC使用权。
			Delay(DelayTime);
			P20 = 1; 
			P0 = 0xFF;           //設置P0口高阻抗。
            SendCharCom(0x99);
        }

        if(FlagSendSlaveData)
	  	{     
           SendSlaveData(MySlaveDataStart1,MySlaveLenAdd1);//发送从机数据到服务器。
           SendSlaveData(MySlaveDataStart2,MySlaveLenAdd2);//发送从机数据到服务器。
           SendSlaveData(MySlaveDataStart3,MySlaveLenAdd3);//发送从机数据到服务器。
           SendSlaveData(MySlaveDataStart4,MySlaveLenAdd4);//发送从机数据到服务器。
		   SendSlaveData(MySlaveDataStart5,MySlaveLenAdd5);//发送从机数据到服务器。
           FlagSendSlaveData =0;  
	   	}	
	    
		if(FlagTime0)
		{ 	
		   SendChannelPara();
		   FlagTime0=0;       //复位定时器0中断标识置位。
		}
    } 
}

⌨️ 快捷键说明

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