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

📄 init.c

📁 此源代码为电力系统中的RTU终端反馈!具有GPRS通讯功能!
💻 C
字号:
#include "Init.h"
#include "yx_key.h"
//对定时器进行操作
void TimerInit()
{
  unsigned char i;
  ///////////////////////////////
 // P2DIR &= ~BIT6;
  //////////////////////////////
 FLL_CTL1 = XT2OFF ;   
 FLL_CTL0 |= XTS_FLL;
 clr_watchdog(); 
 FLL_CTL1 |= SELS + SELM_XT2 ;              //选择高频晶振
 //==========对TIMER A中断设置========================
   TACTL |= TASSEL1 + TACLR + ID1 + ID0;   //使用SMCLK时钟,八分频,清除TAR值
   TACTL |= MC0;                         //增计数模式  
   CCR0 = 625;                         //定时秒,625uS  
   //.......................................  
   TBCTL |= TBSSEL1 + TBCLR+ ID1 + ID0;
   TBCTL |= MC0;
   TBCCR0 = 1000; 
   TBCCTL0 |= CCIE;
      
//==========对基础时钟设置============================
  BTCTL = BTDIV + BTIP1;                // 62.5ms interrupt     
  IE2 |= BTIE;                          // Enable BT interrupt
}

void clr_Syswtdog()
{
    WDTCTL = WDTPW + WDTCNTCL + WDTSSEL;   //1000ms
}

 //设置 串口1 速率

void SetCOM0BT( int bt)
{
     UTCTL1 |= SSEL0 + SSEL1;               // UCLK = SMCLK
     UCTL1 &= ~SWRST; // SWRST复位,USART允许  
     switch (bt)
     {  
          case 300:  UBR11=UBR10_300; UBR01=UBR00_300; 
	                UMCTL1=UMCTL0_300; break;
	  case 600:  UBR11=UBR10_600; UBR01=UBR00_600; 
	  	        UMCTL1=UMCTL0_600; break;
	  case 1200: UBR11=UBR10_1200; UBR01=UBR00_1200;		
	                UMCTL1=UMCTL0_1200; break;
	  case 2400: UBR11=UBR10_2400; UBR01=UBR00_2400; 
	  	        UMCTL1=UMCTL0_2400; break;
	  case 4800: UBR11=UBR10_4800; UBR01=UBR00_4800;		
	                UMCTL1=UMCTL0_4800; break;
	  case 9600: UBR11=UBR10_9600; UBR01=UBR00_9600; 
	  	        UMCTL1=UMCTL0_9600; break;
    }
    

  
   WP_OUT  ;             
   WP_Enable  ;            //1024写保护 
   
   ME2 |= URXE1 + UTXE1;               // Enable USART1 TXD/RXD
   IE2 |= URXIE1;                      // Enable USART11 RX interrupt 
   UCTL1  |= CHAR + PENA + PEV;           // 8-bit character	
   P2SEL |= BIT4 + BIT5 ;              //P2.4,P2.5 = USART0 TXD/RXD    
   P2DIR |= BIT4;                      //P2.4为输出
              
   //串口0初始化 
   UTCTL0 |= SSEL0 + SSEL1;               // UCLK = SMCLK
   UCTL0 =~SWRST;                       // SWRST复位,USART允许     
   //UCTL0 &= ~SWRST; // SWRST复位,USART允许  
   UBR10=UBR11;UBR00=UBR01;UMCTL0=UMCTL1;	
   ME1 |= URXE0 + UTXE0;               // Enable USART1 TXD/RXD
   IE1 |= URXIE0;   
    
   UCTL0=UCTL1;  
   P4SEL |=  BIT0 + BIT1 ;              //P4.0,P4.1 = USART1 TXD/RXD    
   P4DIR |= BIT0;       
   LinkState=0x0E;       
}

void SetCOM1BT( int bt)
{
   P4SEL |= BIT0 + BIT1 ;              //P4.0,P4.1 = USART1 TXD/RXD    
   P4DIR |= BIT0;    
}

void ADCInit()
{
 //===============ADC12设置(序列通道A0->A9多次转换)
 P6SEL = 0XFF;                  //所有P6口线均为ADC模块
 ADC12CTL0 &=~ENC;              //在改变设置前首地址为ADC12MEM0 停止A/D转换

 ADC12CTL0 = ADC12ON +MSC+SHT0_2 + SHT1_7;   //开A/D,无转换溢出中断,无溢出中断,允许多次采样
 ADC12CTL1 = CONSEQ_3 + SHP + ADC12SSEL_3;  //序列通道重复,采样定时输出为采样信号(SAMPSON)
                                            //转换存储寄存器
 ADC12IE = BIT6;                                          
 ADC12MCTL0 = 0x20;                         //参考电压分别为AVCC,AVSS
 ADC12MCTL1 = 0x21; 
 ADC12MCTL2 = 0x24;                                                     
 ADC12MCTL3 = 0x22;            
 ADC12MCTL4 = 0x25;                                                      
 ADC12MCTL5 = 0x23;
 ADC12MCTL6 = 0x26; 
 ADC12MCTL7 = 0x27;
 ADC12MCTL8 = 0xaa; 
// ADC12CTL0 |= ENC;        //允许转换开始
}

//对Port口进行设置
void Port1Init()
{
     P1IE  |= BIT0;          
     P1IES |= BIT0;     
     P1DIR &= ~0x1F;         //除了P1.5,P1.6,P1.7其他口都不变
     P1DIR |= 0xE0;          //用于改变测量电流的量程
     P1OUT &=  ~(BIT5 + BIT6 + BIT7);       
}

void Port2Init(void)
{
   P2DIR &=  ~BIT0; //输入
   P2DIR |= BIT7;   //输出
   P2DIR |= BIT1 + BIT3 ; 
   P3DIR &=  ~BIT3; //输入
   P3DIR &= ~(BIT4 +BIT5) ;    //输出
   keyold= (P3IN & KEYBIT);  
    
   CS485OUT ; 
   CS485ReceiveEnable ;        //485接收使能
   
}

void SetP1Trig(void)
{
  if((P1IN&BIT1)!=0)   //为高电平,则设为下降沿触发
   P1IES|=BIT1;
  else                //低电平,设为上升沿触发
   P1IES&=~BIT1;
  if((P1IN&BIT2)!=0) 
   P1IES|=BIT2;
  else
   P1IES&=~BIT2;
  if((P1IN&BIT3)!=0) 
   P1IES|=BIT3;
  else
   P1IES&=~BIT3;
  if((P1IN&BIT4)!=0) 
   P1IES|=BIT4;
  else
   P1IES&=~BIT4;
}


//运行参数设置
void SetRunParam(void)
{
    BYTE chrk,p0ok,p505ok,chk;
    long t;
    ReadParam(0);
    Read1024(0,CHECK_PARAM,&chrk,1);
    chk=GetCheckParam();
    if(chk==chrk) 
       p0ok=1;
    else  p0ok=0;
    
    ReadParam(505);
    Read1024(505,CHECK_PARAM,&chrk,1);
    chk=GetCheckParam();
    if(chk==chrk) 
       p505ok=1;
    else   p505ok=0;
    
     if(p0ok  &&(!p505ok))
     {
      ReadParam(0);
      CopyParam(505);
      chk=GetCheckParam();
      Write1024(505,CHECK_PARAM, &chk,1,TRUE);
     }  
     if((!p0ok) &&p505ok)
     {
      ReadParam(505);
      CopyParam(0);
      chk=GetCheckParam();
      Write1024(0,CHECK_PARAM, &chk,1,TRUE);
     }     
     if((!p0ok) &&(!p505ok))
     {; }
      CheckData(0);
      CheckData(1);
      CheckData(2); 
           
    /*  
    t=Read1024(0,PUHIGHV,(BYTE*)&(TTU_RunParam.UHighV),6); ////UHighV;Load0;  YKSelectTim
    if(!t)  
    { MCUState |= BIT1;
      TTU_RunParam.AddrOfTTU=1;                           //默认参数设置
      TTU_RunParam.Bauds0=4; 
      SetCOM0BT(2400);  
      return;
    
    }
      MCUState &=  ~BIT1;
    */
      if(TTU_RunParam.YKSelectTime<160) TTU_RunParam.YKSelectTime= 160;
      if(TTU_RunParam.YKExcecuteTime<5) TTU_RunParam.YKExcecuteTime=5;
      if(TTU_RunParam.PWM_SET<2)  TTU_RunParam.PWM_SET=2;
      if(TTU_RunParam.PWM_SET>50)  TTU_RunParam.PWM_SET=50;
      TxGap=TTU_RunParam.PWM_SET; ; //发送间隙
      ReadPower();
       clr_watchdog(); 
      t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A0/1000;
      KP_A0=(t>>4);
       clr_watchdog();
      t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B0/1000;
      KP_B0= (t>>4);
      t= (long)TTU_RunParam.KV_C * TTU_RunParam.KI_C0/1000;
      KP_C0=  t>>4;
       clr_watchdog();
      t= (long)TTU_RunParam.KV_A * TTU_RunParam.KI_A1/1000;
      KP_A1 = t>>4;
      t= (long)TTU_RunParam.KV_B * TTU_RunParam.KI_B1/1000;
      KP_B1= t>>4;
       clr_watchdog();
       t= (long) TTU_RunParam.KV_C * TTU_RunParam.KI_C1/1000;
      KP_C1= t>>4;  
         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=2400;TTU_RunParam.Bauds0=4; TTU_RunParam.AddrOfTTU=1;  break;                                 
         }  
         SetCOM0BT(t); 
         
      nhighV = TTU_RunParam.UHighV*10 ;
      if(nhighV<2200) nhighV=2200;
      if(nhighV>2700) nhighV=2700;            
        nlowV = TTU_RunParam.ULowV*10 ;
      if(nlowV>2200)  nlowV=2200;
      if(nlowV<1800)  nlowV=1800;   
       TTU_RunParam.VersionOfSoft=SOFTVERSION ;
}

//定时喂狗
void  clr_watchdog()
{
  if(numconst)
  {
   clr_Syswtdog();
   P2OUT^=BIT1;
  }
}

//LCD液晶显示
void LcdInit(void)
{
  unsigned int d;
  char *LCD = LCDMEM;
  LCDCTL |=LCDON+LCD4MUX+LCDSG0_7;    // Initialize LCD driver (4Mux mode) 
  BTCTL  |= BTFRFQ1;                  // set LCD frame freq = ACLK
  P5SEL  = 0xFC;                      // set Rxx and COM pins for LCD
  P2Counter=1;
  P1Counter=1;
  for(d=0;d<20;d++)                   // clear LCD memory to clear displa
  {
   LCD[d]=0;
  }
}

void Init()    //初始化模块
{
//=====================初始化所有的 I/O 口线==============================
 Port1Init();                              //P1口初始化
 Port2Init();                              //P2口初始化           
 clr_watchdog();                           //喂狗
 TimerInit();                              //时钟初始化
 ADCInit();                                //AD初始化  
 clr_watchdog();                           //喂狗
 SetRunParam();                            //运行参数初始化
 SpecialFlag.nIdleTime=0;
 CommState.DoSendLubo=0;
 CommState.DoWrParm=0; 
 CommState.TxWait=0;
///////////////////////////////////
 SpecialFlag.DoSendClass1Data=0;
///////////////////////////////////
DeviceState.Capture=0;
DeviceState.In_phase=1;
DeviceState.Cal_FFT=0;
DeviceState.doSaveHisdata = 0;

 LcdInit();                             //液晶显示初始化 
 ResumeStaticData();      //来电统计数据恢复
 RunState.nResetNum ++ ;
 WriteStaticsData(0);
}

int CheckData(int Flag)
{
 int *P,mid,ParamMax,ParamMin,ParamMid;
 if(Flag == 0)
 {
  P = &TTU_RunParam.KV_A;
  ParamMax = 4000;
  ParamMin = 2000;
  ParamMid = 3200;
 }
 if(Flag == 1)
 {
  P = &TTU_RunParam.KI_A0;
  ParamMax = 12000;
  ParamMin = 9000;
  ParamMid = 10200;
 }
 if(Flag == 2)
 {
  P = &TTU_RunParam.KI_A1;
  ParamMax = 3000;
  ParamMin = 1000;
  ParamMid = 2400;
 }
 
  if((*P >= *(P+1)) && (*P >= *(P+2)))
  {

    if(*(P+1) >= *(P+2) ) { mid = *(P+1); }
    if(*(P+2) >= *(P+1) ) { mid = *(P+2); }
  }
  
  if((*(P+1) >= *P) && (*(P+1) >= *(P+2)))
  {
    if(*P >= *(P+2) ) { mid = *P;}
    if(*(P+2) >= *P ) { mid = *(P+2); }
  }
  
  if((*(P+2) >= *P) && (*(P+2) >= *(P+1)))
  {
    
    if(*P >= *(P+1) ) { mid = *P; }
    if(*(P+1) >= *P ) { mid = *(P+1); }
  }
  
  //if((max - min) < 1000) return 0;
  if(mid > ParamMax || mid < ParamMin) mid = ParamMid;
  if(((*P ) >mid + 1000) || ((*P ) < mid - 1000) ) *P = mid;
  if(((*(P+1) ) >mid + 1000) || ((*(P+1) ) < mid - 1000) ) *(P+1) = mid;
  if(((*(P+2) ) >mid + 1000) || ((*(P+2) ) < mid - 1000) ) *(P+2) = mid;
    return 0;
}









⌨️ 快捷键说明

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