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

📄 430.c

📁 这个程序是基于Msp430单片机开发的一个测量外部频率的程序,经测试精度满足一般要求.
💻 C
字号:
#include <msp430x14x.h>
//#include <stdio.h>

unsigned int Succeed_ifg=0;
unsigned int Time_is_up_reg=0;
unsigned int Start_Count_ifg=0;

unsigned long int Frequency_reg=0;

void Init_TACCR0(void)
{
    TACCR0 = 5000;   //8000000/8/5000=200Hz
    TACTL  = 0X02C4;  //MCLK,1/8分频
    TACCTL0 =0X0080;
    TACTL |= MC0;//增计数模式
    //TACTL |= MC1+MC0;//增/减计数模式
    TACCTL0 |= CCIE;//允许TA0中断
}
void stop_TACCR0(void)
{
    TACCTL0 &= ~CCIE;
}
void Init_TBCCR0(void)
{
    TBCCR0 = 50000;
    //TBCTL=TBSSEL_2+TBCLR+MC_2+ID_0;
    TBCTL=TBSSEL_0+TBCLR+MC_2+ID_0;
    TBCCTL0 =0X0080;
    //TBCTL |= MC0;//增计数模式
    //TBCCTL0 |= CCIE;//允许TB0中断
}
void stop_TBCCR0(void)
{
    TBCTL &= ~MC0;
}

void Delay_ms(unsigned int nValue)//毫秒为单位,8MHz为主时钟  用32768要修改 
{
    unsigned int nCount;
    unsigned int ii;
    unsigned int jj;
    nCount = 1331;//8000000*0.001/1332/6个Tj=1
    for(ii = nValue;ii > 0;ii--)
     {
       for(jj = nCount;jj > 0;jj--);
     }
    return;
}
////////////////////////////////////////////////
void main(void)
{ 
    WDTCTL = WDTPW +WDTHOLD; // Stop WDT

    DCOCTL  = 0X60;      //默认值
    BCSCTL1 = 0X07;	 //由打开XT2.选用低频模式,	
    do
    {
	IFG1 &= ~OFIFG;                    // 清除OSCFault标志
	for (unsigned int ii = 0x20; ii > 0; ii--);
    }
    while ((IFG1 & OFIFG) == OFIFG);      // OSCFault == 1 					

    BCSCTL2 =0X88;    //选用XT2晶振
    
      
    
P1DIR |= BIT2; // P1.2 output
P1SEL |= BIT2; // P1.2 TA1/2 otions
P4DIR = 0X7F;   //P4.0接口作为捕获输入端口
P4SEL|=BIT7; //选择设备输入
//P4SEL |=BIT7; 
/***************用作测试DCO的实际发生频率*************************************
P1DIR|=BIT4;
P1SEL|=BIT4;
经直接测量知道SMCLK的频率为0.76-0.78MHz,可通过此频率与程序所得相比较,验证是否正确
*****************************************************************************/

//TACTL |= MC1; // Start Timer_A in continuous mode

_EINT(); //开总中断
Init_TBCCR0(); //初始化外部计数

while(1)
{
    Succeed_ifg = 0; 
    Time_is_up_reg = 0;
    Init_TACCR0(); //准备定时 
    
  
    while(!Succeed_ifg); //等待测量结束
 
    //printf("Fre = %ld\n",Frequency_reg); 
    //这里可以加输出显示程序
    
    Succeed_ifg = 0;//断点执行到这里可以看到Frequency_reg的值
    
    Delay_ms(500);
 //while(Succeed_ifg); 

}
}

//200Hz  用32768要修改 
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void)
{  
   if(!Time_is_up_reg)
   {      
      //Start_Count_ifg = 1;//TB中断中判断这个标志开始计数  
      stop_TBCCR0();   
      TBR = 0; 
      TBCTL |= MC0;//增计数模式
      Time_is_up_reg = 1;      
   } 
   else
   {      
      //Start_Count_ifg = 0;//TB中断中判断这个标志停止计数 
      Time_is_up_reg++;
      
      if(Time_is_up_reg >= 21) //0.1秒到了   20+1
      {  
        Succeed_ifg = 1;  //主程序中判断这个来开始计算
        Frequency_reg = TBR;
        Frequency_reg *= 10;
        stop_TACCR0();   
        stop_TBCCR0();   
      }  
   }
}

⌨️ 快捷键说明

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