捕获程序

2019-07-20 15:49发布


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

   捕获方波信号,算出频率,占空比

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

#include  <msp430x14x.h>
#include  "1602.h"
#include  "1602.c"

#define uint unsigned int
#define uchar unsigned char

uchar shuzi[] = {"0123456789.k"};
//uchar tishi[] = {"FZHzk"};
uint start=0;
uint end=0;
uint tem=0;
uint temp=0,overflow;

void chuli(uint a,uint b);
void Init_CLK(void);

/************************主函数****************************/
void main(void)
{
  uint c,d;
  WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗
  
  /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;
  
  P6DIR |= BIT2;P6OUT |= BIT2;              //关闭电平转换
  P5DIR|=BIT5;P5OUT&=~BIT5;               //关闭数码管显示
  P6DIR|=BIT6;P6OUT&=~BIT6;                 //半闭数码管显示
  P6DIR|=BIT5;P6OUT&=~BIT5;                 //半闭数码管显示
  LcdReset();                               //复位1602液晶
// DispNChar(2,0,12,tishi);                  //显示提示信息
  Disp1Char(0,0,'Z');                      //显示电压单位
  Disp1Char(1,0,':');
  Disp1Char(0,1,'F');
  Disp1Char(1,1,':');
  Disp1Char(13,1,'H');
  Disp1Char(14,1,'z');
  Init_CLK();
  P1SEL |= BIT2;                             //设置P1.2端口为功能模块使用
  P1DIR &=~BIT2;
  //TACTL |=TACLR;
  TACTL = TASSEL_2+TAIE+MC_2+TACLR;          //定时器A时钟信号选择SMCLK 8M,清计数寄存器,使能中断,同时设置定时器A计数模式为连续增计模式
  TACCTL1 =CM_1+SCS+CAP+CCIE+CCIS_0;                //输入上升沿捕获,同步,capture模式 CCI1A为捕获信号源(P1^2???),中断使能                                 
  //TACCTL0 &=~CCIFG; //清CCR2 的标志位
  //中断允许
  _EINT();
   LPM0;
   _NOP();
   c=overflow*65535+temp-start;
   d=overflow*65535+end-start;
  chuli(c,d);
  while(1);

}
void Init_CLK(void)
{
unsigned int index;
BCSCTL1&=~0X00; //打开XT2振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (index = 0xFF; index > 0; index--)// 延时,等待XT2起振
{
;
}
} while ((IFG1 & OFIFG) != 0);// 判断XT2是否起振

BCSCTL2 =SELM_2+SELS; //选择MCLK、SMCLK为XT2 SMCLK 8分频
}


void chuli(uint a,uint b)
{
  
  unsigned long ff,zg;
  uchar j,i;
  uchar ptr[5],ptr2[4];
  ff=8000000/a;
  zg=(b*1000)/a;
  ptr2[0]=zg/100;
  ptr2[1]=zg/10%10;
  ptr2[3]=zg%10;
  ptr2[2]=10;
  if(ff>1000)
  {
    ptr[0]=ff/10000;
    ptr[1]=ff/1000%10;
    ptr[2]=10;
    ptr[3]=ff/100%10;
    ptr[4]=11;
  }
  else
  {
    ptr[0]=ff/100;
    ptr[1]=ff/10%10;
    ptr[2]=ff%10;
    ptr[3]=10;
    ptr[4]=0;
  }
  for(i = 0;i < 4;i++)
    Disp1Char((3 + i),0,shuzi[ptr2[i]]);
  for(j=0;j<5;j++)
    Disp1Char((6 + j),1,shuzi[ptr[j]]);
   
  
}


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

中断处理函数

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


#pragma vector=TIMERA1_VECTOR              //定时器A中断处理
__interrupt void timer_a(void)
{
switch(TAIV)                              //向量查询
  { case 2:                                //捕获中断
       if(CCTL1&CM_1)                      //上升沿
         {
           tem++;
           if(tem==1)
           {
             CCTL1=(CCTL1&(~CM_1))|CM_2;       //更变设置为下降沿触发
             start=TACCR1;                      //记录初始时间
             overflow=0;                     //溢出计数变量复位
           }
           else if(tem==2)
           {
             temp=TACCR1;
             TACTL &=~TAIE;                    //不使能中断
             CCTL1 &=~CCIE;
             P1SEL &=~BIT2;
             _DINT();
             LPM0_EXIT;
           }
         }
       else if(CCTL1&CM_2)                 //下降沿
        {  
         CCTL1=(CCTL1&(~CM_2))|CM_0;       //更变设置为上升沿触发           
         end=TACCR1;                        //用start,end,overflow计算脉冲宽度
         
        }   
       break;
    case 10:                               //定时器溢出中断
       overflow++;
       break;                              //溢出计数加1
    default:break;
  }
}

谁能帮俺看看???
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。