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

📄 adandkeyau.c

📁 ads7809采样程序 ads7809采样程序
💻 C
📖 第 1 页 / 共 2 页
字号:
       	        }*/
               back_count=0;
             }
	  }

ES=1;
}

//***********************读取参数滤波函数***********************
//功能描述:数据存储的数组从小到大排序
// 去掉最大值和最小值, 然后返回平均值
	uint Compositor(uint *x)
	{
	 uchar i, j;
	 uint value=0;
	 ulong add_sum=0;
	 for(i=0; i<10; i++)       //数组中数据排序
	  {
	  for(j=i+1; j<11; j++)
	   {
	     if(x[i]>x[j])
	       {
	         value=x[i];
	         x[i]=x[j];
	         x[j]=value;             
	       }
	    }
	   }
     for(i=1; i<10; i++)      //除掉最大值,最小值求和
	  {
	  add_sum=add_sum+x[i];      	   
	  }
     value=add_sum/9;
	 return value;            //取平均,返回参数
	}

//***********************读取电源电压函数*********************** 
	uint GatherValue(uint pama)	    
	{
	  ulong Fy;
	  uint y;
	  Fy = (ulong)pama;
      R_buf_G=Compositor(a);
      b[(Rec4Buf_G[2])-1]=R_buf_G;
	  Fy = (ulong)(R_buf_G*Fy);
	  if(((Fy/1000)%10)<5)  { y = (uint)(Fy/10000); }  
	  else
	    {
	      if(((Fy/1000)%10)>5)  y = (uint)((Fy/10000)+1);
	      else
	        {
			  y = (uint)((Fy/10000)+1);
	         }
	     }	  
	  return y;
	}

//***********************电源电压还原函数*********************** 
	uint GatherValue_back(uint pama,uint R_buf_G)	    
	{
	  ulong Fy;
	  uint y;
	  Fy = (ulong)pama;
	  Fy = (ulong)(R_buf_G*Fy);
	  if(((Fy/1000)%10)<5)  { y = (uint)(Fy/10000); }  
	  else
	    {
	      if(((Fy/1000)%10)>5)  y = (uint)((Fy/10000)+1);
	      else
	        {
			  y = (uint)((Fy/10000)+1);
	         }
	     }	  
	  return y;
	}


//***********************读取电源电流函数*********************** 
	uint Gathercurrent(uint pama)	   
	{
	  ulong Fy;
	  uint y;
	  Fy = (ulong)pama;
      R_buf_G=Compositor(c);
      if((Rec4Buf_G[2]==1)||(Rec4Buf_G[2]==2))
       {if(R_buf_G<=800)
        R_buf_G=0;
       }
      if(Rec4Buf_G[2]==3)
       {if(R_buf_G<=493)
        R_buf_G=0;
       }
      if(Rec4Buf_G[2]==4)
       {if(R_buf_G<=293)
        R_buf_G=0;
       }
     
      if(Rec4Buf_G[2]==5)
       {if(R_buf_G<=100)
        R_buf_G=0;
       }
      if(Rec4Buf_G[2]==6)
       {if(R_buf_G<=800)
        R_buf_G=0;
       }
	  Fy = (ulong)(R_buf_G*Fy);
	  if(((Fy/1000)%10)<5)  { y = (uint)(Fy/10000); }  //*****
	  else
	    {
	      if(((Fy/1000)%10)>5)  y = (uint)((Fy/10000)+1);
	      else
	        {
			  y = (uint)((Fy/10000)+1);
	         }
	     }
	  
	  return y;
	}

//***********************串口接收中断函数*********************** 
void SerialFunc(void) interrupt 4 // using 1
{
  uchar temp;
  //uint t;
//===========================输出中断
  if(_testbit_(TI))                     //输出中断
  	{    
 	  TI=0;
      TransCtr_G++;                     //输出缓冲区指针加1
	  if(TransState==1)
	  {
       if(TransCtr_G < TransSize_G)     //数据是否输出完毕
  	  	{
          SBUF = TransBuf_G[TransCtr_G];//输出当前字节
		}
       else
        {
         TransState=0;
         TransCtr_G=0;
         RecvState_G=0;
        }
	  }
  	}
//============================接收中断
  if(_testbit_(RI))//接收中断
  	{
  	  RI=0;
      temp = SBUF;
      
	  switch(RecvState_G)
	  	{
	  	 case FSA_INIT :
              if(temp==0x8a)
                {
				 
			    
				  PAMA_OK1=1;
				 
				 //Init3100();       //向电源控制部件发送控制信息
                  //Send3100(0x80,0x00);Send3100(0x80,0x00); Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);
				  //Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x80,0x00);
				  //Send3100(0x80,0x00);
				  EX1=0;
				  TH0=0x7f;
                  TL0=0x00;       //定时计数器50ms;
                  TR0=1;                  //启动定时计数器0;
                  ET0=1;
				  RecvCtr_G=0;              //数据长度复位
				  RecvBuf_G[RecvCtr_G++]=temp;
			      RecvState_G=FSA_COMMAND;//设置状态位
                  Recv_flag_G=0;          //设置接收位,0为未接收完
                  Rec2_flag_G=0;
                }
			    break;
		 case FSA_COMMAND :
		      if(RecvCtr_G<12)            //判断接收数据是否完毕,长度12
			   {
                  RecvBuf_G[RecvCtr_G++]=temp;
			   }
			   else
			   {
			    RecvCtr_G=0;              //数据长度复位
                RecvState_G=FSA_INIT;     //设置状态位
                Recv_flag_G=1;            //设置接收位,1为接收完
                Rec2_flag_G=1; 
			   } 
		      break;
    	}
    }
}
//***********************定时中断响应函数***********************
void timer0(void) interrupt 1 //using 1 
{
   TR0=0;
   
   if(RecvState_G==FSA_INIT && Recv_flag_G==1)//接收完毕
    {    
     RecvChksum_G=RecvBuf_G[5]+RecvBuf_G[6]+RecvBuf_G[7]+RecvBuf_G[8]+RecvBuf_G[9]+RecvBuf_G[10];//求取校验和
     if(RecvChksum_G==RecvBuf_G[11])     
      {
         if(RecvBuf_G[3] == 1 || RecvBuf_G[3] == 3) //判断是否为控制帧命令
       	  {
              Res_flag_G=1;     //置自动控制模式标志位
            
              wait_back=1;
			 
			  EX1=1;
			  Init3100();
			  Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
              Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
              Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
			  
			 // EX1=1;
			  TR2=0;
			  TH2=0x8f;
              TL2=0x00;
			  TR2=1;
			  Delay1335(0xff);
			  Delay1335(0xff);
              Delay1335(0xff);
             
           if(Rec2_flag_G == 1)
              {
              TransBuf_G[0]=0x55;//发送接收正确标志
	     	  TransBuf_G[1]=0x55;
	    	  TransBuf_G[2]=0x55;
	    	  TransSize_G=3;
	    	  TransState=1;
              SBUF=TransBuf_G[0];//启动发送
              Rec2_flag_G=0;
              } 	 
          }
        if(RecvBuf_G[3] == 2 && Rec2_flag_G == 1)  //判断是否为读取信息帧命令
          { 
		      PAMA_OK1=0;
              TransBuf_G[0]=0x8a;TransBuf_G[1]=0x0c;TransBuf_G[2]=RecvBuf_G[2];TransBuf_G[3]=0x02;TransBuf_G[4]=0xaa;            
              TransBuf_G[5]=(b[RecvBuf_G[2]-1])%256;TransBuf_G[6]=(b[RecvBuf_G[2]-1])/256;
              TransBuf_G[7]=(d[RecvBuf_G[2]-1])%256;TransBuf_G[8]=(d[RecvBuf_G[2]-1])/256;
              TransBuf_G[9]=0x00;TransBuf_G[10]=0x00;TransBuf_G[11]=0x00;TransBuf_G[12]=0x00;
	    	  TransSize_G=13;
	    	  TransState=1;
              SBUF=TransBuf_G[0];//启动发送
              Rec2_flag_G=0; 
           
           }
        }
	  
      else//校验码错误
        {
         if( Rec2_flag_G == 1)
          {
          TransBuf_G[0]=0xaa;//发送接收错误标志
       	  TransBuf_G[1]=0xaa;
	   	  TransBuf_G[2]=0xaa;
          Rec2_flag_G=0; 
	   	  TransSize_G=3;
	   	  TransState=1;
	   	  SBUF=TransBuf_G[0];//启动发送
	       }
         } 
      
	   }    
       else //未接收完毕
        {
         RecvCtr_G=0;
		 RecvState_G=FSA_INIT;
	      
        }
      
	    EX1=1;
}
//***********************定时2中断响应函数***********************
void timer2(void) interrupt 5 //using 1 
{    auto_back=auto_back+1;
     TR2=0;
     TH2=0x00;
     TL2=0x00;
     TF2=0;
	 RecvCtr_G1=0;
     RecvState_G1=FSA_INIT;
	 //wait_back_count=wait_back_count+1;
	//if(wait_back_count>=30)
	// {wait_back_count=0;
     if (wait_back==1)
	  {
      Init3100();
	  Send3100(0x80,0x5a);Send3100(0x80,0x06);Send3100(0x80,RecvBuf_G[2]);Send3100(0x80,0x01);Send3100(0x80,RecvBuf_G[4]); //写数据0x80 00, RTS在Cs上升沿时置高 ,19200bps
      Send3100(0x80,RecvBuf_G[5]);Send3100(0x80,RecvBuf_G[6]);Send3100(0x80,RecvBuf_G[7]);Send3100(0x80,RecvBuf_G[8]);Send3100(0x80,RecvBuf_G[9]);
      Send3100(0x80,RecvBuf_G[10]);Send3100(0x80,0x00);Send3100(0x80,0x00);Send3100(0x86,0x00);
      TH2=0x8f;
      TL2=0x00;
	 /* TransBuf_G[0]=0xbb;//发送接收错误标志
       	  TransBuf_G[1]=0xbb;
	   	  TransBuf_G[2]=0xbb;
          Rec2_flag_G=0; 
	   	  TransSize_G=3;
	   	  TransState=1;
	   	  SBUF=TransBuf_G[0];//启动发送//*/
	  }
	  
	 // }
	//send_wait=1;
     if(auto_back>=400)
        {set_flag_G=0;
         auto_back=0;
         Kset_buf_G=0x29;
        }
		TR2=1;
}	 

⌨️ 快捷键说明

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