用msp430完成频率的测量

2019-03-24 15:52发布

#include <msp430x14x.h>
unsigned int pwm_start,pwm_end,pwm_wide=0;  
float fre=0.000;
#define uchar unsigned char
#define uint  unsigned int
#define lint  long int


unsigned int start,end;
float data,num,m1;
long int m2=10,j=0;
uchar a[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//0->9,共阴;
uchar num1,num2,num3,num4,num5,num6;


void delay(uint j)    //延时函数
{  uint x,y;
   for(x=j;x>0;x--)
   for(y=50;y>0;y--);
}

void xianshi(float fre)//数码管动态显示函数(P2->位,P3->段)
{
  lint tt,ttt,tttt,ttttt;
  tt=(lint)fre;  //整数部分
  ttt=(lint)(fre*10);//第一位小数
  tttt=(lint)(fre*100);//第二位小数
  ttttt=(lint)(fre*1000);
  num1=(tt/100)%10;
  num2=(tt/10)%10;
  num3=tt%10;
  num4=ttt%10;
  num5=tttt%10;
  num6=ttttt%10;
  P2OUT |= BIT0;//亮第一个数码管
  P3OUT=a[num1];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x02;//亮第二个数码管
  P3OUT=a[num2];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x04;//亮第三个数码管
  P3OUT=a[num3];
  P3OUT |=BIT7;//点亮小数点
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x08;//亮第四个数码管
  P3OUT=a[num4];
  delay(6);
  P2OUT=0x00;
  P2OUT = 0x10;//亮第五个数码管
  P3OUT =a[num5];//第一位小数
  delay(6);
  P2OUT =0x00;
  P2OUT = 0x20;//亮第六个数码管
  P3OUT =a[num6];//第二位小数
  delay(6);
  P2OUT=0x00;
}


void main (void)
{
WDTCTL = WDTPW+WDTHOLD;                   //关闭看门狗定时器
P1SEL = BIT2;                             //设置P1.2端口为功能模块使用,CCI0A
P2DIR =0x3f; //位选
P3DIR =0xff; //段选
P2OUT =0x00;
P3OUT =0x00;
                       
TACTL = TASSEL0+TACLR+TAIE+MC1;           //定时器A时钟信号选择ACLK,同时设置定时器A计数模式为连续增计模式
CCTL1 = CM_3+SCS+CAP+CCIE+CCIS0;          //捕获模式,上升和下降都捕获,CCI0A为捕获信号源

_EINT();                                  //中断允许
  for(;;)
   {                                          
   _BIS_SR(LPM0_bits + GIE);
   _NOP();
   pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125;
   fre=1/(2*pwm_wide);  // 频率
   xianshi(fre);
   }
}

// Timer_A3 Interrupt Vector (TAIV) handler
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)
{  
   
  switch(TAIV)  
{case 2:   
      if(TACCTL1 & CCI)  
        pwm_start=CCR1;   
     else  
        pwm_end=CCR1;            
     break;  
  case 4:  
     break;  
  case 10: overflow++;
     break;  
  }  
  LPM0_EXIT;  
}  


请各位大虾看看这个程序有什么问题么,指导一下,谢谢了!! 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
3条回答
shuizhiqing
1楼-- · 2019-03-24 22:39
该程序存在以下问题:
1,头文件不完整,改为#include"msp430x14x.h"
2,unsigned  pwm_wide;已经定义了pwm_wide为整型的,而pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125计算出来的结果是float型的,这就出现了一个问题
3,float data,num,m1和 long int m2=10,j=0中定义的data、m1、m2就没用
建议将pwm_wide=(pwm_end-pwm_start+overflow*65536)*0.000125;
            fre=1/(2*pwm_wide); 改为data=(pwm_end-pwm_start+overflow*65536)*0.000125;
                                                           fre=1/(2*data); 然后再显示
不知还有什么问题吗!!??
水货老手
2楼-- · 2019-03-24 23:33
< :TI_MSP430_内容页_SA7 --> 顶,你调试通过没
shuizhiqing
3楼-- · 2019-03-25 00:38
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章