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

📄 from_hs.c

📁 用单片机和DSP测量DN100管道的气体流量,使用涡街传感器
💻 C
📖 第 1 页 / 共 2 页
字号:
//***************************************************************************************************
//                 MSP430F149
//              ______________________
//          /|\|                 XT2IN|-  
//           | |                      | 4MHz
//           --|RST             XT2OUT|-
//             |                      |
//  sine_sig-->|P6.0/A0            XIN|-
// pulse_sig-->|P1.2/CCIA1            | 32768HZ
//             |                  XOUT|- 
//   KEY1(>)-->|P1.5/TA0              |
//   KEY1(F)-->|P1.6/TA1      P4.0/TB0|-->MCU_OUT    
//   KEY1(^)-->|P1.7/TA2              |
//             |                      |
// DSP_nRST<-->|P2.0/ACLK        P5.0 |<-->HD0
//    nHINT<-->|P2.1/TAINCLK     P5.1 |<-->HD1 
//   HCNTL0<-->|P3.0             P5.2 |<-->HD2
//   HCNTL1<-->|P3.1             P5.3 |<-->HD3 
//   HR/~W <-->|P4.4             P5.4 |<-->HD4 
//      HDS<-->|P4.5             P5.5 |<-->HD5
//     HBIL<-->|P3.2             P5.6 |<-->HD6
//     HRDY<-->|P4.7             P5.7 |<-->HD7
//             |                      |
//      AVCC<--|VeREF+        P6.7/A7 |-->LCD_~CS
//	       |	      P6.6/A6 |-->LCD_~WR
//	       |              P6.5/A5 |-->LCD_DATA
//	       |	              |
//	       |	              |
//******************************************************************************************************

/*******************************************************************************************************
    

     Attention:  The CPU is MSP430F149 [ACLK=32K, MCLK=XT/2=2MHz, SMCLK=XT/2=2MHz]
                
     Function: When power-on, 430 calculate f through CAP(TA CCIA1). When f below 40Hz, FFT instead
               of Pulse-in.
       
               LCD display and pulse output.
                    
     Updated for IAR Embedded Workbench Version: 3.40
                     

  Author: XingJuan
  latest changed: 2006.08.29

                              
********************************************************************************************************/

#include <msp430x14x.h>
//#include "dspcode.h"
#include "Han_win.h"

#define  VERSION          340
#define  Delta_2M_32K     0x00FA		/*Delta=250   2.048MHz*/
#define  Rectangle_Windows  1        // Rectangle_Windows = 1
#define  DSP_ENTRY        0x2000  
#define  DSP_MAXSIZE      0x5000   // max 0x6000(24k) bytes 

char sysflag;//system flag
int delay;

// Pulse in-out 
int cap_cnt = 0,number=50;
unsigned int Compare, newcapture,Oldcapture = 0,taflag=0;
float cap_n;
long int sum;
float cap[101];
float f = 0.0;

//lcd variable definition
int addr_buffer, buffer, count;
unsigned int view;
unsigned long int re2;
char asc[8];//整型数数对应的8位ASCII码数组
char dis_up[6];//上排显示寄存器
char dis_down[8];//下排显示寄存器
const char addr_up[6]={0x0F,0x11,0x13,0x15,0x17,0x19};
const char addr_down[8]={0x0A,0x08,0x06,0x04,0x02,0x00,0x1C,0x1E};
const char downseg[11]={0xEB,0x60,0xC7,0xE5,0x6C,0xAD,0xAF,0xE0,0xEF,0xED,0x00};
const char upseg[11]={0xD7,0x06,0xE3,0xA7,0x36,0xB5,0xF5,0x07,0xF7,0xB7,0x00};

//delay subprogram
void msdelay(int);//msdelay: 1ms * n

//initialization program
void MSP430Init(void);//系统初始化子程序

//display program
void Disp_Init(void);
void wrcommand(void);   // 写命令
void wr_act(void);      // 上升沿控制
void wrdata(void);      // 写数据
void int_ascii(void);   // 将整型数转化为用于显示的ASC
void updisp(void);      // 液晶上排显示程序
void downdisp(void);    // 下排液晶显示程序

//system subprogram
void Pulse_calculate(void);
void FFT_calculate(void);
void Output(float);  



/*---------------------主程序启动-----------------------*/
void main(void)
{ 
  
  WDTCTL=WDTPW+WDTHOLD;          // STOP WDT
  
  MSP430Init();
 
  _EINT();                       // 打开全局中断
  
  while(1)
  {
     switch(sysflag)
     {
       case 1:
          Pulse_calculate();
       break;
       case 2:
          FFT_calculate();
       break;
       default:
       break;
     }
  }
}


//---------------------system initialization----------------------------------
void MSP430Init(void)
{ 
   int i;
   
  /*-------------------------------Osc initialize-------------------------  
    Purpose:  
              ACLK <- XT1, DIVA =1
              MCLK <- XT2, DIVM =2
              SMCLK <- XT2, DIVS =2
    Note:     XT1=32768Hz, XT2 = 4MHz
  ----------------------------------------------------------------------------*/ 
   
  IE1 =0x00;                         // disabel Oscillator fault interrupt 
  BCSCTL1=0x00;                      // set XT2ON
  BCSCTL2=0x9A;                      // MCLK=SMCLK=4MHz/2=2MHz
                                     // 等待时钟源转换完成
  do{
    IFG1 &= ~OFIFG;
    for(i=0;i<100;i++);              // delay 50uS
  }while(IFG1&OFIFG);                // 查OSCFault,为0时转换完成   


 /*---------------port initialize---------------*/  
  
//  P1IES &= 0x1F;       // P1.5~P1.7 key input interrupt by L-H drop
//  P1IE  |= 0xE0;       // enable interrupt 
//  P1IFG &= 0x1F;       // clear interrupt flag

   
  P2DIR = 0xFC;        // P2.7:MCU_OUT output
                       // P2.0:DSPnRST, P2.1:nHINT(DSP向430申请中断) are input
  P3DIR = 0xFF;        // P3.0-3.7 unused
  P3OUT = 0; 
  P4DIR = 0x7F;        // P4.7 HRDY, P4.5 HDS, P4.4 HRnW
  P4OUT = 0;
  P5DIR = 0xFF;        // HD0-HD7   
  P5OUT = 0;
  P6DIR = 0xFE;        // P6.5=DATA; P6.6=~WR; P6.7=~CS 
                       // P6.0:vortex sine-signal input


/*---------------LCD initialize---------------*/  
  
  Disp_Init();  
  view=0;                            
  int_ascii(); 
  updisp();
  downdisp();
  

/*---------------system variable initialize---------------*/    
  sysflag=1;              // clear system flag

}

//************----------- Pulse_calculate-------------**********************
void Pulse_calculate(void)
{
  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_2 + MC_2 + TACLR;         // ACLK, Continuous mode, clear
  while(1)
  {   
    
     _BIS_SR(LPM0_bits);       // Enter LPM0 w/ interrupt
 
     while(taflag==1)
     { 
        taflag=0;
        cap_cnt=0;
        sum=0;
       
        for(int i=1;i<number+1;i++)  // calculate average f
        {
	  sum+=cap[i];
        }
        if(number>20)
        {
          sum=sum-cap[21]+cap[25];
        }
          cap_n=sum/number; 
        f = 500000/cap_n;
        if(f>500)
        {
          number=100;
        }
        else if(f>300)
        {
          number=50;
        }
        else
        {
          number=20;
        }
        Output(f);                // Pulse output   
       re2=(unsigned long int)(f * 1000);
       view=re2;                   // LCD display frequency         
       int_ascii(); 
       updisp();
       CCTL1 = CM_1 + CCIS_0 + CAP + CCIE;     // Capture on rising edge, CCI1A, CAP
     } 
     
  }

⌨️ 快捷键说明

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