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

📄 led.c

📁 dsp设计
💻 C
📖 第 1 页 / 共 2 页
字号:
        hpid_w_autoinc(ADValue);   
        AD_cnt++;          
      }   
      else                            // >1024 FFT start DSP     
      {                    
        ADC12CTL0 &=~ENC;             // ENC=0时可以配置     
        TACTL &=~MC_1;                // Stop TimerB    
        AD_cnt=0;           
        re_cal = hpi_run();     
        for(long int i=0;i<40000;i++) i=i;           
        dz=0x3C00;             
        re_cal = hpia_w(dz);            
        msdelay(1);   
        for(int i=0;i<8;i++)   
        {   
           result[i/2]=hpid_R_autoinc();   
           i++;   
        result_f=result[0];   
        power_spc1=(unsigned long int)result[1];   
        power_spc2=(unsigned long int)result[2];   
        power_spc3=(unsigned long int)result[3];   
                
        result_f=result_f-1;   
        re2=(unsigned long int)result_f;   
        re2=re2*1000;   
        fre1=re2;   
             
        if(Rectangle_Windows)          //  Rectangle_Windows power-spectrum correction    
        {   
           if(power_spc1<=power_spc3)   
           {   
              re2 = power_spc2 + power_spc3;   
              fre2 = power_spc3*1000/re2;   
              fre = fre1 + fre2;   
           }   
           else   
           {   
              re2 = power_spc2 + power_spc1;   
              fre2 = power_spc1*1000/re2;   
              fre = fre1 - fre2;   
           }   
        }   
        else                           //  Hannning_Windows power-spectrum correction    
        {   
           if(power_spc1<=power_spc3)   
           {   
              re2 = 2*power_spc3 - power_spc2;   
              fre2 = re2*1000/(power_spc3 + power_spc2);   
              fre = fre1 + fre2;   
           }   
           else   
           {   
              re2 = 2*power_spc1 - power_spc2;   
              fre2 = re2*1000/(power_spc2 + power_spc1);   
              fre = fre1 - fre2;   
           }   
        }       
           
        view=fre;   
        int_ascii();   
        updisp();   
           
        f_ave = fre/1000.0;   
    //    Output(f);     
        if(f_ave>DN100_gas_lowlimit)   
        {   
          sysflag=3;   
          ADC12CTL0=0;   
          P2SEL&=~BIT3;         
          CCR0=0;   
          CCR1=0;   
          CCTL1=0;   
          TACTL=0;   
        }   
               
       break;   
   
      }   
   }   
}   
   
//-------------------------- Pulse_calculate -------------------------------------    
void Pulse_calculate(void)   
{   
  //  number = 20;    
  f_cnt=5;   
     
  P1SEL |= BIT2;                          // P1.2 option select    
  P1DIR = 0x1B;                           // P1.2 vortex pulse signal input                           
  CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;     // Capture on rising edge, CCI1A, CAP    
  TACTL =TASSEL_2 + ID_3 + MC_2 + TACLR;  // SMCLK, 1/4Smclk = 500KHz, Continuous mode, clear    
  _EINT();                       // 打开全局中断      
     
  while(sysflag==1)   
  {   
     _BIS_SR(LPM1);            // Enter LPM1 w/ interrupt    
        
     while(Taflag==1)   
     {   
//        _DINT();    
        Taflag=0;   
        sum=0;   
        cap_cnt=0;   
   
        for(int i=1;i<NUMBER+1;I++) { } if(f f cap_n="sum/number;" sum+="cap[i];" average calculate>1500.0)                    // change cap number    
        {   
          number = 300;   
        }   
        else if(f>1000.0){   
          number = 250;   
        }   
        else if(f>800.0){   
          number = 200;   
        }   
        else if(f>600.0){   
          number = 150;   
        }   
        else if(f>400.0){   
          number = 100;   
        }   
        else if(f>200.0){   
          number = 50;   
        }   
        else   
        {   
          number = 20;   
        }      
           
        fsum[f_cnt] = f;   
        f_cnt--;   
           
        if(f_cnt<=0)   
        {   
           f_sum=0;   
           for(int i=5;i>0;i--)   
           {   
             f_sum+=fsum[i];   
           }   
           f_ave = f_sum/5.0;   
             
           re2=(unsigned long int)(f_ave * 1000);   
           view=re2;                   // LCD display frequency             
           int_ascii();    
           updisp();     
        //   Output(f);                // Pulse output         
      
           if(f_ave<DN100_GAS_LOWLIMIT) { int } |="0x01;" output P4DIR break; if(f mode toggle CCR0 TBCCTL0="OUTMOD_4;" select option P4.0 P4SEL a; long 脉冲输出子程序(脉冲输出函数) f) Output(float void output--------------********************** Pulse ***********---------------- * while(Taflag="=1)" CAP CCI1A, edge, rising on Capture CCIE; + CCIS_0 CCTL1="CM_1" _EINT(); f_cnt="5;" else TACTL|="MC_0;" sysflag="2;">100)   
   {    
      a=2000000/(2*f);   
      TBCTL = TBSSEL_2 + MC_1;             // SMCLK, up mode    
   }   
   else   
    {    
      a=32768/(2*f);   
     TBCTL = TBSSEL_1 + MC_1;              // ACLK, up mode    
    }   
   TBCCR0 = a-1;   
}   
*/   
   
/*-----------ADC12 initialize, Single Channel Rpt Mode, TA1 as Sample Trigger at 1000Hz(1ms)----------*/        
void ADC12_Init(void)   
{   
/*    
  ADC12CTL1 = SHS_1 + SHP + CONSEQ_2;                 // TA trig., rpt conv.  
  ADC12MCTL0 = SREF_1 + INCH_10;                      // Channel A10, Vref+  
  ADC12IE = 0x01;                                     // Enable ADC12IFG.0            
  ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC;  // config ADC12  
  TACCTL1 = OUTMOD_4;                                 // Toggle on EQU1 (TAR = 0)  
  TACTL = TASSEL_2 + MC_2;                            // SMCLK, cont-mode  
    */   
       
   P6DIR &=~BIT0;   
   P6SEL |= 0x01;                            // select A0 as input    
   ADC12CTL0 = ADC12ON + SHT0_1;             // Setup ADC12    
   ADC12CTL1 = SHP + CONSEQ_2 + SHS_1;       // Timer triggers sampling, ADC12OSC    
   ADC12MCTL0 = 0x00;                        // choose A0 as input    
   ADC12IE = 0x0001;                         // Enable ADC12IFG.0    
      
   P2SEL |= BIT3;                            // Set for TimerA1    
   P2DIR |= BIT3;   
   
   TACCR0 = 32;                              // Init TACCR0 w/ sample prd=CCR0+1    
   TACCR1 = 16;                              // Trig for ADC12 sample & convert    
   TACCTL1 = OUTMOD_3;                       // Set/reset    
   TACTL = TACLR + TASSEL_1;                 // ACLK, clear TAR    
}   
   
   
//------------------- Timer A0 interrupt service routine------------------------    
#if VERSION>126    
#pragma vector=TIMERA1_VECTOR    
__interrupt void Timer_A (void)   
#else    
interrupt[TIMERA1_VECTOR] void Timer_A(void)   
#endif    
{   
    CCTL1&=~CCIFG;                          // clear CCI1A interrupt flag    
    Newcapture = TACCR1;                    // Get current captured Pulse     
    Compare = Newcapture - Oldcapture;         // Pulse difference    
    Oldcapture = TACCR1;                    // Save current captured Pulse    
    cap[cap_cnt]=Compare;   
    cap_cnt++;                                           
    if(cap_cnt>number)                                                                                                          
    {    
      CCTL1 = 0;   
      Taflag= 1;   
   }   
   
    LPM1_EXIT;                              // Exit LPM1                    
}   
   
   
/**************************************************************************************  
函数原型: void ADC12(void)  
函数功能: ADC12中断服务子程序,将采样结果存放到变量ADvalue中  
调用函数:无  
入口参数: 无  
出口参数: 无  
***************************************************************************************/    
#if VERSION>126    
#pragma vector=ADC_VECTOR    
__interrupt void ADC12(void)   
#else    
interrupt[ADC_VECTOR] void ADC12(void)   
#endif    
{   
   ADvalue = ADC12MEM0;             // Move results    
      
   LPM3_EXIT;//Exit LPM3    
}   
   
   
   
//***********---------------- LCD display ----------------**********************    
void Disp_Init(void)   
{    
    P6OUT|=BIT7;                     // ~CS=1 reset     
    for(delay=0;delay<100;delay++);   
    buffer=0x00;   
    wrcommand();   
    buffer=0x29;                     // 上电初始化命令专用模块    
    wrcommand();   
    buffer=0x18;                     // 定义内部振荡器工作    
    wrcommand();   
    buffer=0x01;                     // 开振荡器    
    wrcommand();   
    buffer=0x03;                     // 开显示器    
    wrcommand();    
    addr_buffer=0x1B;                // 显示Q标志    
    buffer=0x08;   
    wrdata();     
}   
   
void wrcommand(void)                 // LCD写命令    
{     
   P6OUT&=~BIT7;                     // ~CS=0    
   P6OUT|=BIT5;                      // DATA=1    
   wr_act();    
   P6OUT&=~BIT5;                     // DATA=0    
   wr_act();    
   P6OUT&=~BIT5;                     // DATA=0    
   wr_act();   
   for(count=0;count<8;count++)   
   {   
    if((buffer&0x80)==0x80)   
      P6OUT|=BIT5;   
        else P6OUT&=~BIT5;   
    wr_act();    
    buffer<<=1;   
   }   
   P6OUT&=~BIT5;                     // DATA=0    
   wr_act();    
   P6OUT|=(BIT7+BIT6+BIT5);          // ~CS=1,~WR=1,DATA=1    
}   
   
void wr_act(void)   
{   
   P6OUT&=~BIT6;   
   for(delay=0;delay<10;delay++);   
   P6OUT|=BIT6;                 
   for(delay=0;delay<10;delay++);   
}   
   
void wrdata(void)                    // LCD写数据程序    
{          
        P6OUT&=~BIT7;                // CS=0,使能液晶    
    P6OUT|=BIT5;     /*1*/         
        wr_act();      
    P6OUT&=~BIT5;   /*0*/   
    wr_act();    
    P6OUT|=BIT5;   /*1*/   
    wr_act();    
        P6OUT&=~BIT5;  /*0*/   
    wr_act();    
       
    addr_buffer<<=3;             // 左移三位,低五位有效    
    for(count=0;count<5;count++)   
      {        
        if((addr_buffer&0x80)==0x80)   
        P6OUT|=BIT5;   
        else P6OUT&=~BIT5;   
        wr_act();    
        addr_buffer<<=1;   
       }   
    for (count=0;count<8;count++)   
      {   
        if((buffer&0x01==0x01))   
        P6OUT|=BIT5;   
        else P6OUT&=~BIT5;   
        wr_act();    
        buffer>>=1;   
       }   
    P6OUT|=(BIT7+BIT6+BIT5);      // ~CS=1,~WR=1,DATA=1    
}   
    
void int_ascii(void)            //将整型数转化为用于显示的ASCII    
{   
  int i;   
  unsigned long int view_temp;   
  for(i=0;i<8;i++)   
  {   
     view_temp=view/10;   
     asc[i]=view-view_temp*10;  //求余数    
     view=view/10;   
  }   
  for(i=0;i<6;i++)   
  {   
     dis_up[i]=asc[i];   
  }     
  for(i=0;i<8;i++)   
  {   
     dis_down[i]=asc[i];   
  }     
}   
   
void updisp(void)                //上排液晶显示程序    
{   
        int t;   
        addr_buffer=addr_up[0];  //显示上排第0位    
        t=dis_up[0];    
    buffer=upseg[t];   
    wrdata();   
   
        addr_buffer=addr_up[1];  //显示上排第1位    
        t=dis_up[1];    
    buffer=upseg[t];   
    wrdata();     
       
    addr_buffer=addr_up[2];  //显示上排第2位    
        t=dis_up[2];    
    buffer=upseg[t];   
    wrdata();   
   
    addr_buffer=addr_up[3];  //显示上排第3位    
        t=dis_up[3];    
    buffer=upseg[t];   
    buffer|=0x08;   
    wrdata();   
       
    addr_buffer=addr_up[4];  //显示上排第4位    
        t=dis_up[4];    
    buffer=upseg[t];   
    wrdata();   
   
    addr_buffer=addr_up[5];  //显示上排第5位    
        t=dis_up[5];    
    buffer=upseg[t];   
    wrdata();   
}   
   
void downdisp(void)//下排液晶显示程序    
{   
        int t;   
        addr_buffer=addr_down[0];//显示下排第0位    
        t=dis_down[0];    
    buffer=downseg[t];   
    wrdata();   
   
    addr_buffer=addr_down[1];//显示下排第1位    
        t=dis_down[1];    
    buffer=downseg[t];   
    wrdata();   
       
    addr_buffer=addr_down[2];//显示下排第2位    
        t=dis_down[2];    
    buffer=downseg[t];   
    wrdata();   
   
    addr_buffer=addr_down[3];//显示下排第3位    
        t=dis_down[3];    
    buffer=downseg[t];   
    wrdata();   
   
    addr_buffer=addr_down[4];//显示下排第4位    
        t=dis_down[4];    
    buffer=downseg[t];   
    wrdata();   
   
    addr_buffer=addr_down[5];//显示下排第5位    
        t=dis_down[5];    
    buffer=downseg[t];   
    wrdata();   
    
    addr_buffer=addr_down[6];//显示下排第6位    
        t=dis_down[6];    
    buffer=downseg[t];   
    wrdata();   
       
    addr_buffer=addr_down[7];//显示下排第7位    
        t=dis_down[7];    
    buffer=downseg[t];   
    wrdata();   
}   

⌨️ 快捷键说明

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