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

📄 main.c

📁 此源代码为电力系统中的RTU终端反馈!具有GPRS通讯功能!
💻 C
📖 第 1 页 / 共 2 页
字号:
     
  clr_watchdog();               //看门狗计数清零
  if(SpecialFlag.TTUParamChangeFlag==1)
  {
    SpecialFlag.TTUParamChangeFlag = 0;
    CommState.U0SEnd = 0;   
     clr_watchdog();
    t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A0/1000;
    KP_A0=(t>>4);
    t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B0/1000;
    KP_B0= (t>>4);
     clr_watchdog();
    t= (long)TTU_RunParam.KV_C * TTU_RunParam.KI_C0/1000;
    KP_C0=  t>>4;
    t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A1/1000;
    KP_A1 = t>>4;
     clr_watchdog();
    t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B1/1000;
    KP_B1= t>>4;
     t= (long) TTU_RunParam.KV_C * TTU_RunParam.KI_C1/1000;
    KP_C1= t>>4;  
     clr_watchdog();
  }   
  if(DeviceState.Minutef0==1)
  {  
    DeviceState.Minutef0 = 0;
    if( DisDelay == 5 )
    { 
      DeviceState.DisPlay_Lcd = 0; DisDelay = 0;       
    }
    else
    {
     DisDelay++; 
    }     
  }
  if(DeviceState.TenSecf==1)  	 
  {
    DeviceState.TenSecf=0;
    if(DeviceState.DisPlay_Lcd == 0)
    {        
       Display();
       P1Counter ++;
       if(P1Counter > menu[P2Counter-1])
       {
         P1Counter = 1;
         P2Counter ++;
       }
       if(P2Counter > KEYMAX2)
       {
         P2Counter =1;
       } 
    }
  }
      
  if(DeviceState.Secondf==1)  	   //秒处理开始
  {
     RefreshTimer();           //1s 时钟更新 
     
     if((Count4 <= 22223)&&(Count4 >= 18181))  //在 45Hz 到 55Hz 之间     
       Freq = 100000000L/Count4;                //计算频率
     else  
       Freq = 5000;
     BD_data.Frequence = Freq;
     Temp = (Temp*3000)>>12;     //温度测量
     BD_data.IT = (Temp - 986)/3.55;   
           
    /* if(stDateTime.second == 28)     //        计算 统计数据记录
        GetStaticRecord();         
        */
     SpecialFlag.YCChangeFlag = 1;

     if( stDateTime.second   == 29)   // 计算电压谐波
     {    
       if(Ua_base>20)
         BD_data.Ua1_n=1000*(unsigned long)Uan/Ua_base;        //电压的谐波率
       else 
         BD_data.Ua1_n=0;
       if(Ub_base>20) 
         BD_data.Ub1_n=1000*(unsigned long)Ubn/Ub_base;
       else 
         BD_data.Ub1_n=0;
       if(Uc_base>20) 
         BD_data.Uc1_n=1000*(unsigned long)Ucn/Uc_base;
       else 
         BD_data.Uc1_n=0;
       if(Ia_base>10)          
         BD_data.Ia1_n=1000*(unsigned long)Ian/Ia_base;             //电流的谐波率
       else 
         BD_data.Ia1_n=0;
       if(Ib_base>10)  
         BD_data.Ib1_n=1000*(unsigned long)Ibn/Ib_base;
       else 
         BD_data.Ib1_n=0;
       if(Ic_base>10)     
         BD_data.Ic1_n=1000*(unsigned long)Icn/Ic_base;
       else 
         BD_data.Ic1_n=0;
      }        
      DeviceState.Secondf=0;
      if((P2IN & BIT3)== 0)
      {
         I0 = 0;
      }
      P2OUT ^= BIT3;
      //液晶显示 
      if(DeviceState.DisPlay_Lcd == 1)
      {   
         Display();
      }   
      
   }   //秒处理结束    
   
   if(DeviceState.doSaveHisdata)    // 存储历史数据
   {
      DeviceState.doSaveHisdata = 0;
      SavePower();
      SaveHisData();
   } 
  
  if(DeviceState.Cal_FFT)        //计算常用电参量
  { 
     //if(Uabc.Ua>POFFVALUE) TimerInitCap();     // TimerA :capture mode   
     CalPowerpara();
     DeviceState.Cal_FFT=0;
     GetMaxMinValue();  
     GetStaticRecord();  //11-05-16
     GetYxIn() ;  //内部遥信处理
  }
  
  // 数据不变化保护   
   if(Uaold == BD_data.Ua + BD_data.Ub + BD_data.Uc) 
   {
   
      if(numconst) numconst--;   
   }
   else 
   {
     Uaold = BD_data.Ua + BD_data.Ub + BD_data.Uc;
     numconst = 60000;
    }
  
 if(DeviceState.DoClearDay)  //清当天的历史数据和统计数据
 {
  ClearDayData();
  DeviceState.DoClearDay=0; 
 }
 
 if(DeviceState.DoClearAll)  //清所有天的历史数据和统计数据
 {
  ClearAllData();
  DeviceState.DoClearAll=0; 
 }
   
   //保存历史数据时间到 
  /*if(DeviceState.Hourf == 1)
  {
      SavePower();
      SaveHisData();  
      DeviceState.Hourf=0;     
  }*/
  
   //保存统计数据时间到  
   if((DeviceState.Datef==1)&&(stDateTime.second >= 58))       
   {
       //ptr_1024=Get1024Page(stDateTime,1);
       //WriteStaticsData(0xff);  
       DeviceState.Datef=0;
    } 
    if(DeviceState.Timef)
    {
       GetPCF8563(2,InitTime,7);            //读出时钟 ,每小时较时
       TimerDataHandle();                   //bcd code conversion
       DeviceState.Timef=0;
    }
     
    if(DeviceState.NewData==1)  
     {
    //   ClearDayData();                //清当天的历史数据和统计数据
       DeviceState.NewData=0;
     }

   //遥控操作
  if(( YKoperate) && (YKselect ) )
  {  
    DoOperate(YKObj);
    YKselect=0;           
  }
 
    
  if((delayoperate == 0) && YKoperate )
  {
      CloseOperate(YKObj);
      YKoperate = 0;
      EncodeVariableLenFrame(46,10,0,0);  //遥控操作结束帧
      nYKObject=0;
      nYKQualifier=0;          
  }
      //与主站通讯部分

    //多帧发送的特殊处理
   if(CommState.DoIniCom0)
   {
     CommState.DoIniCom0=0;
     switch(TTU_RunParam.Bauds0)
       {
          case 1:t = 300; break;                                      
          case 2:t = 600; break;                                 
          case 3:t = 1200;break;                                   
          case 4:t = 2400;break;                                   
          case 5:t = 4800;break;                                    
          case 6:t = 9600;break;                                   
          default:t = 1200;break;                                 
       }
     SetCOM0BT(t);   
   }
   
   if(CommState.DoIniCom1)
   {
     CommState.DoIniCom1=0;
     switch(TTU_RunParam.Bauds1)
       {
          case 1:t = 300; break;                                      
          case 2:t = 600; break;                                 
          case 3:t = 1200;break;                                   
          case 4:t = 2400;break;                                   
          case 5:t = 4800;break;                                    
          case 6:t = 9600;break;                                   
          default:t = 1200;break;                                 
       }
     SetCOM1BT(t);   
   }  
   
  
   if((SpecialFlag.nIdleTime==0) && (CommState.TxWait==0)  )
    {
       manyframe(); 
    }
   
 } 
}
 
void  DoOperate(BYTE nChannel)
{
  if( (YKoperate & 0x3)!=2 ) return;
   if(nChannel==1)
   {
     P3DIR |= BIT4 ;    //输出
     P3OUT &= ~BIT4;  
   }
   
   if(nChannel==2)
   {
    P3DIR |= BIT5 ;    //输出
    P3OUT &= ~BIT5;     
   }
}    
 
void  CloseOperate(BYTE nChannel)
{
     if(nChannel==1)
     {
        P3OUT |= BIT4;
        P3DIR &= ~BIT4 ;    //输入
     }
     if(nChannel==2)
     {
        P3OUT |= BIT5;
        P3DIR &= ~BIT5 ;    //输出           
     }
}


void main(void)
{  
   WDTCTL = WDTPW + WDTHOLD;	
   clr_watchdog();               //看门狗计数清零      
   Init();
   clr_watchdog();               //看门狗计数清零      
   DeviceState.DisPlay_Lcd = 1;
   _EINT();  
   ADC12CTL0 |= ADC12SC;
   switch(TTU_RunParam.nIntervalOfSave)  //历史数据存储模式:15分钟为1,30分钟为2,一个小时为4
   {
     case 15:  HisCate = 1;break;
     case 30:  HisCate = 2;break;
     default:  HisCate = 4;break;
   }
   MainDo();  
}

void manyframe()  //多侦处理
{                 
  //主站发总召唤 命令
  if((SpecialFlag.CallAll_YCFlag==1) && (CommState.TxWait==0))
  {     
     SpecialFlag.CallAll_YCFlag=0;
     CommState.TxWait=1;           
     EncodeVariableLenFrame(21,20,8,0);  //不带品质描述的遥测帧         
  }
         
  if((SpecialFlag.CallAll_YXFlag == 1) && (CommState.TxWait==0))
  {  
    SpecialFlag.CallAll_YXFlag = 0;
    CommState.TxWait=1;
    EncodeVariableLenFrame(1,20,8,0);   //遥信帧      
  }
  
  if((SpecialFlag.CallAll_EndFlag==1) && (CommState.TxWait==0) )
  {     
    CommState.TxWait=1;
    EncodeVariableLenFrame(100,0xA,8,20);  //总召唤结束帧
    SpecialFlag.CallAll_EndFlag = 0;       
  } 

    if((SpecialFlag.FileTxFlag==1)  && (CommState.TxWait==0)) //err??
    {
      CommState.TxWait=1;
      SpecialFlag.nSGCount++;  //05-11-5
      EncodeVariableLenFrame(125,13,8,0);	   
						//05-11-5
       if(SpecialFlag.nSGCount >= (32/HisCate-1))
        {
         SpecialFlag.FileTxFlag=0;
         SpecialFlag.nSGCount=0;
         SpecialFlag.F_LS_NA_F=1;
        }
 						//05-11-5
      if(SpecialFlag.DataType ==2)
       {
         if(SpecialFlag.nSGCount >=4)
          {
           SpecialFlag.FileTxFlag=0;
           SpecialFlag.nSGCount=0;
           SpecialFlag.F_LS_NA_F=1;
          }
        }
       
       if(SpecialFlag.DataType ==3)
       {
         if(SpecialFlag.nSGCount >=1)
          {
           SpecialFlag.FileTxFlag=0;
           SpecialFlag.nSGCount=0;
           SpecialFlag.F_LS_NA_F=1;
          }
       }
    } 
    
    if((SpecialFlag.F_LS_NA_F==1) && (CommState.TxWait==0))
    {
      SpecialFlag.F_LS_NA_F=0;      
      SpecialFlag.LSQ =4;      //最后的节和段限定词 2-节,4-段
      CommState.TxWait=1;
      EncodeVariableLenFrame(123,13,0,0);  //最后段或节确认帧    
    }   
}


void TimerInitCap()         //捕获
{
  TACTL |= MC1 ;                      //连续计数模式 
  TACTL &= ~MC0;   
  CCTL0 |= CM1 + CAP ;
  DeviceState.Capture = 1;                           //采完 32 点后转入捕获处理 twq
  P1SEL |= BIT0;
  CCTL0 |= CCIE;                         // CCR0 interrupt enabled  
  CapDelay=0;
}

void TimerInit1()
{
  if((Count4 <= 22223)&&(Count4 >= 18181))  //在 45Hz 到 55Hz 之间
      CCR0 = (Count4>>5); 
   else 
      CCR0=625;
  TACTL |= MC0;                    //增计数模式 
  TACTL &= ~MC1 ; 
  CCTL0 &= ~CAP ;
  P1SEL &= ~BIT0;
  DeviceState.Capture = 0;                    //捕获完成 转入计数处理                                       
}



⌨️ 快捷键说明

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