MSP430测频为什么数码管显示不出频率

2019-03-24 13:12发布

#ifndef TIMERA_H
#define TIMERA_H
void IO_CLR();//初始化IO
void InittimerA();//定时器A初始化
//void KeeptimerA(unsigned char flag);//控制捕获模式运行
unsigned int Getcyc();//返回周期值函数
void delay();//延时函数
#endif



#include  <msp430x14x.h>
#include "timerA.h"
#define uchar unsigned char
#define uint unsigned int
uint cyc;       //信号周期返回值
uint LastCCR0;  //上一次CCR0的值
/*******************************************************************************
定时器A初始化
*******************************************************************************/
void InittimerA()
{
      TACTL = TASSEL_1 + MC_2+TACLR + TAIE;       //时钟ACLK,连续计数模式
      CCTL0 = CCIS_1 + CM_2 + SCS + CAP + CCIE;   //下降沿沿捕获,P2.2为信号输入端
      P2SEL |= BIT2;                 //使用P2.2IO第二功能
}

/*******************************************************************************
定时器A中断函数
*******************************************************************************/
#pragma vector = TIMERA0_VECTOR
__interrupt void timerA0()
{
   cyc = CCR0 - LastCCR0;     //计算周期
   LastCCR0 = CCR0;           //保存CCR0的值
   TACTL = TASSEL_1 + MC_2+TACLR + TAIE;       //时钟ACLK,连续计数模式
   CCTL0 = CCIS_1 + CM_2 + SCS + CAP + CCIE;   //下降沿沿捕获,P2.2为信号输入端
}
/*******************************************************************************
返回周期值函数
*******************************************************************************/
unsigned int Getcyc()
{
    return cyc;
}
/*******************************************************************************
初始化IO
*******************************************************************************/
void IO_CLR()
{
    P1DIR = 0XFF; P1OUT = 0XFF;
    P2DIR = 0X00; P2OUT = 0XFF;
    P3DIR = 0XFF; P3OUT = 0XFF;
    P4DIR = 0XFF; P4OUT = 0XFF;
    P5DIR = 0XFF; P5OUT = 0XFF;
    P6DIR = 0XFF; P6OUT = 0XFF;
}

/*******************************************************************************
延时函数
*******************************************************************************/
void delay()
{
    uchar x,y;
      for(x=110;x>0;x--)
        for(y=100;y>0;y--);
}





#include  <msp430x14x.h>
#include "TIMERAC.H"
#define uchar unsigned char
#define uint unsigned int
#define wei_h (P5OUT |= BIT5)
#define wei_l (P5OUT &= ~BIT5)
#define duan_l   (P6OUT &= ~BIT6)
#define duan_h  (P6OUT |= BIT6)
uchar f[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar a[8]={0};
uchar wei[]= {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int temp;
void init_sys();
int main(void)
{
    WDTCTL = WDTHOLD + WDTPW;
    IO_CLR();
    init_sys();
    Getcyc();
    temp = cyc*32768*2;   //计算信号频率计算
        a[0]= temp / 10000000;
        a[1]= temp / 1000000%10;
        a[2]= temp / 100000 % 10;
        a[3]= temp / 10000 % 10;
        a[4]= temp / 1000 % 10;
        a[5]= temp / 100 % 10;
        a[6]= temp / 10 % 10;
        a[7]= temp  % 10;
    uchar i;
    for(i=0;i<7;i++)
    {   
        P4OUT = f[a];
        duan_h;
        duan_l;
        P4OUT = 0xff;
        P4OUT = wei;
        wei_h;
        wei_l;
        delay();      
    }
    while(1);
}

/*******************************************************************************
初始化系统时钟
*******************************************************************************/
void init_sys()
{
    uchar i;
    BCSCTL1 &= ~XT2OFF;         //打开XT2高频晶体振荡器
    do
    {
        IFG1 &= ~OFIFG;             //清除晶振失败标志
        for(i = 0; i < 0xff; i++);    //等待8MHz晶体起振
    }
    while(IFG1 & OFIFG);                 //MCLK和SMCLK选择高频晶振
    BCSCTL2 = SELM_2 + SELS;       //主系统时钟和子系统时钟都选择8M
     InittimerA();                 //初始化定时器A
     //KeeptimerA(100);              //打开捕获模式
     _EINT();
}


新手刚学430  体谅 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
wudayongnb
2019-03-24 15:46
 精彩回答 2  元偷偷看……0人看过

一周热门 更多>

相关问题

    相关文章