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

📄 msp430f135pro.txt

📁 MSP430F135的一些C源代码子程序
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    if(fredata_a!=1)sum_a=sum_a+t;
    
    
  if(fredata_a>=51)			//1000ms计算频率
  {
    sum_a=sum_a/50;
    f=100000000/sum_a;                  //用uint型计算只能精确到个位,用ulong型计算能够精确到小数点后一位
    //f=f-20;
    f=(FRE_A+f)>>1;
    FRE_A=(uint)f;
    sum_a=0;
    fredata_a=0;
    prea_time=cura_time=0;

   }
  }
  
  
 }
 else if((P1IFG&0x04)==0x04)
 {
 
 P1IFG=P1IFG&0xFB;
 
 /*
 if(B_W<2000)//原来为小于100V,改为小于20V频率上传为0
    {
      FRE_B=0;
      return;
    }
  */
  curb_time=TBR;			           //中断后读取T0时间为当前时间
  if(curb_time>preb_time)t=curb_time-preb_time;	   //如果没有溢出,当前时间-上次时间=周期
  else                   t=65535-preb_time+curb_time;	   //如果溢出,65536-上次时间+当前时间=周期
  
  
  //if((t>=30000)||(t<=15000))t=20000;  
  
  preb_time=curb_time;

  if((t<=30000)&&(t>=15000))
  {
    fredata_b++;    
    if(fredata_b!=1)sum_b=sum_b+t;
    
    
  if(fredata_b>=51)			//1000ms计算频率
  {
    sum_b=sum_b/50;
    f=100000000/sum_b;                 //用uint型计算只能精确到个位,用ulong型计算能够精确到小数点后一位
    //f=f-20;
    f=(FRE_B+f)>>1;
    FRE_B=(uint)f;
    sum_b=0;
    fredata_b=0;
    preb_time=curb_time=0;

   }
  }
 
 }
 else    
 {
 P1IFG=0x00;
 }
 
  
  

}



void main_init(void)
{ 
  _DINT();
  
  BCSCTL1 |=XTS;
  BCSCTL2 |=SELM1+SELM0;
  
  U0CTL&=~SWRST;
  
  com_flag=bittest(P3IN,6);
  
  
  U0CTL  |= MM+CHAR;                    // Address Mode on ; 8-bits ; 1-SP  ; 1-ST
  U0TCTL |=SSEL0;                       // System clock ACLK 
  U0RCTL |=URXWIE;                      //set URXWIE=1, RX Wake up interrupt enable with adddress
  UBR00 =0xA0;                          // 19200=8000000/(416+m),UBR=416
  UBR10 =0x01;
  UMCTL0 |=0x57;                        // m=(m7+m6+m5+m4+m3+m2+m1+m0)/8=0.625
  
  P6SEL |= 0x3F;                        // P6.0-P6.5 ADC option select Enable A/D channel inputs
  //P6SEL |= 0xFF;                      // P6.0-P6.7 ADC option select Enable A/D channel inputs
  
  ADC12CTL0 |= ADC12ON+MSC+REFON+SHT0_4; // Set sampling time, turn on ADC12
  ADC12CTL1 |= SHP+CONSEQ_1;             // Use sampling timer
  
  ADC12MCTL0|=SREF_0+INCH_0;             // ref+=AVCC, channel = A0
  ADC12MCTL1|=SREF_0+INCH_1;             // ref+=AVCC, channel = A1
  ADC12MCTL2|=SREF_0+INCH_2;             // ref+=AVCC, channel = A2
  ADC12MCTL3|=SREF_0+INCH_3;             // ref+=AVCC, channel = A3
  ADC12MCTL4|=SREF_0+INCH_4;             // ref+=AVCC, channel = A4
  ADC12MCTL5|=EOS+SREF_0+INCH_5;         // ref+=AVCC, channel = A5
  //ADC12MCTL6|=SREF_0+INCH_6;           // ref+=AVCC, channel = A6
  //ADC12MCTL7|=EOS+SREF_0+INCH_7;       // ref+=AVCC, channel = A7
  
  //ADC12IE   |=BIT7;                     //Enable ADC12IFG.7
  ADC12IE   |=BIT5;                       //Enable ADC12IFG.5  
  ADC12CTL0 |=ENC+ADC12SC;                //Enable conversions+Start conversion 
       
       
  
  
  TACTL|=TASSEL0+MC1+TAIE;   
  TAR=1328;                               //166us
  
  TBCTL|=TBSSEL0+MC1+ID0+ID1;
  
  
  P5DIR |= 0xF8;                          // Set P5.3-P5.7 to output direction
  P3SEL |=BIT5+BIT4;
  
  
  P5OUT=0x08;   
  
    
               
  ME1 |= URXIE0;                            // Enable WDT/RXD interrupt
  IE1 |= URXE0+UTXE0; 
  
  
  
  P1IE |= 0x06;                             // Set P1.1-P1.2 Interrupt Enable,rising edge
  
  load_info();
     
   _EINT();
   
   
   DIS_485;
   
}

void clear_watchdog()			     /*清看门狗子程序*/
{
 uint t; 
  
 t=(WDTCTL)&0x00ff;
 WDTCTL =t+WDTPW +WDTCNTCL;
  
}



void ad_convert(void)
{ 
 
 float a0,a1,b1,sum;
 uchar i;
 int  w,w0[6];   
 
 
 
  for(a0=0,i=0;i<=MAX_AD_COUNT;i++)
  { xx[i]=xx[i]-2048;
    a0=a0+xx[i];
  }
  
  a0=a0/MAX_AD_COUNT;  
  
            
  for(a1=0,b1=0,sum=0,i=0;i<=MAX_AD_COUNT;i++)
   {
     w=i*3;
   sum=xx[i];
   if(w<=90)sum=sum*SINBOM[w/3];
   else if((w>90)&&(w<=180))sum=sum*SINBOM[(180-w)/3];
   else if((w>180)&&(w<=270)){sum=sum*SINBOM[(w-180)/3];sum=0-sum;}
   else if((w>270)&&(w<=360)){sum=sum*SINBOM[(360-w)/3];sum=0-sum;}
   
   sum=sum/65535;
   a1=a1+sum;  
  
        
   sum=xx[i];
   
   if(w<=90)sum=sum*SINBOM[(90-w)/3];
   else if((w>90)&&(w<=180)){sum=sum*SINBOM[(90-(180-w))/3];sum=0-sum;}
   else if((w>180)&&(w<=270)){sum=sum*SINBOM[(90-(w-180))/3];sum=0-sum;}
   else if((w>270)&&(w<=360))sum=sum*SINBOM[(90-(360-w))/3];
   
   sum=sum/65535;
   b1=b1+sum;            
             
   }  
   
            
   a1=a1*2/(MAX_AD_COUNT);   
            
   b1=b1*2/(MAX_AD_COUNT);    
   
            
  sum=sqrt(a0*a0+a1*a1+b1*b1);    
  
  
  if(b1!=0x00)
  w0[adc_step]=atan(a1/b1)*180.0/__PI;   
          
  
  *(adsum+adc_step)+=sum;
  
  adc_step=(++adc_step)%9;
    
   
   
 if(adcount==0x01)
 {
  
  pha=0;  
  w=w0[0]-w0[1];
  if((fabs(w))<60)pha=1;
  w=w0[1]-w0[2];
  if((fabs(w))<60)pha=1;
  w=w0[0]-w0[2];
  if((fabs(w))<60)pha=1;
  
  phb=0;  
  w=w0[3]-w0[4];
  if((fabs(w))<60)phb=1;
  w=w0[4]-w0[5];
  if((fabs(w))<60)phb=1;
  w=w0[3]-w0[5];
  if((fabs(w))<60)phb=1;
  
  
    
    for(i=0;i<9;i++)
    {     
      
      if(*(adresult+i)!=0x00)*(adresult+i)=(*(adresult+i)+(*(adsum+i)>>1))/2;
      else                   *(adresult+i)=*(adsum+i)>>1;
           
      *(adsum+i)=0;
      }
    ad_end=1;
    }
  
  
  if(adc_step==0x08)adcount=(++adcount)%2;
  
  if(adc_step<=0x02)P5OUT=P5OUT&0x1F;
  else              P5OUT=P5OUT|0xEF;
  
  adc_count=0;
  ad_begin=0;
  

 
}


void ad_process50(void)
{
  ulong t;
  uchar i,l;
  for(i=0;i<6;i++)
  {
    t=*(adresult+i);			                        //通信协议规定0-FFFFH表示0-655.36,因此数据应乘以100
    *(adv_result+i)=(t*707*100/2048);	                        //测量最大值为707V对应2048
    if((*(adv_result+i)>50000)||(*(adv_result+i)<2000))		//电压超过500V上传0,小于20V上传0
    *(adv_result+i)=0;
    
    *(adv_result+i)=*(adv_result+i)+(int)adjust[i]*100;
    
    }
    
    
    
  A_U=*(adv_result);
  A_V=*(adv_result+1);
  A_W=*(adv_result+2);
  B_U=*(adv_result+3);
  B_V=*(adv_result+4);
  B_W=*(adv_result+5);
  if((k_data&0x20)==0x20)
  {
    l=hgq_i[hgq_adr];                                             //根据不同的互感器规格,系数有所变化
    for(i=0;i<3;i++)
    {
      t=*(adresult+6+i);
      *(adi_result+i)=(t*141*100*2*l/2048);                        //系统最大电流600A*48V/220V=130A,100A作为电流上限可以满足
      if((*(adi_result+i)>(10000*l))||(*(adi_result+i)<(200*l)))   //电流超过100A上传0,小于2A上传0
      *(adi_result+i)=0;
      
      *(adi_result+i)=*(adi_result+i)+(int)adjust[i+6]*100;
      
    }
    I_U=*(adi_result);
    I_V=*(adi_result+1);
    I_W=*(adi_result+2);
  }
  else
  {
    I_U=0;
    I_V=0;
    I_W=0;
  }


}

void main(void)
{  

 WDTCTL = WDTPW + WDTHOLD;               // Stop watchdog timer
 main_init();
 //WDTCTL = WDT_ARST_1000;                // WDT 8ms, ACLK, interval timer
 
 
 
 
  
 
  while(1)  
  {
    clear_watchdog();
    
     
   
    
    k_data=read_k();                       //拨码设置    
    
    if((k_data|0x3F)==0xFF)txd_adr=0x01;   //交流检测板地址
    if((k_data|0x3F)==0x7F)txd_adr=0x02;
    if((k_data|0x3F)==0xBF)txd_adr=0x03;
    if((k_data|0x3F)==0x3F)txd_adr=0x04;
    
    if((k_data|0xDF)==0xFF)
    {
      hgq_adr=k_data&0x0E;
      hgq_adr>>=1;
    }
    
    
    
    if((k_data&0x10)!=0x10)
    {
     P1IE=0x00;
     FRE_A=FRE_B=5000;
    }
     
    if(fl_count<100)
    {
      if(fl_data!=read_fl())
        {
          fl_count=0;
          fl_data=read_fl();
          }
      else fl_count++;
       }
    else
    {
      fl_count=0;
      fig_1=fl_data;
       }

    if(zh_count<100)
    {
      if(zh_data!=read_z())
      {
        zh_count=0;
        zh_data=read_z();
        }
      else zh_count++;
       }
    else
    {
      zh_count=0;
      fig_2=zh_data;
       }

   
    if(ad_begin)
    {
      
      ad_convert();
     }
     
    if(ad_end)
    {
      ad_end=0;
      ad_process50();
     }
     
    if(save==0xaa)
    {
     save=0;
     save_info();
    }
    
    
  
    
  }
}






⌨️ 快捷键说明

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