|
写了一个用外部管脚秒闸门,但是为啥显示的频率总是实际频率的4倍,一秒钟内脉冲个数应当就是输入信号的频率呀
#include "msp430g2553.h"
#include "Clock.h"
#include "LCD1602.h"
#include "num_to_string.h"
unsigned long int Freq; //频率测量结果存放变量
unsigned int TA1_OverflowCnt; //TA1的CCR0通道溢出次数存放变量,溢出十次即一秒
unsigned char num_string[] = {" "};//用于存放频率从数字转化来的字符串
unsigned char hz[] = {"hz"};
unsigned int TA_OverflowCnt; //主计数器溢出标志
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
Configclock_1MHZ(); //配置时钟1Mhz
P1DIR &= ~BIT0; //P1.0(TACLK)作为输入管脚
P1SEL |= BIT0; //允许其第二功能,作为TACLK输入
TA1CTL = TASSEL_2 + MC_1 + ID_2 + TACLR;//定时器选SMCLK,2分频,增模式
TA1CCR0 = 50000;
TA1CCTL0 |= CCIE; //通道零中断使能
_EINT();; //打开总中断
LCD1602_init(); //液晶初次使用初始化
LCD1602_init_set(); //液晶设置初始化
while(1)
{
LPM0; //休眠,等待TIMERA唤醒
//*********以下代码每一秒运行一次**********
Freq = TA_OverflowCnt*65536 + TAR; //读取TAR中的值
TA_OverflowCnt = 0;
TACTL = TASSEL_0 + MC_2 + TAIE + TACLR;//TA选择外部管脚上升沿计数,连续增模式,清零重新开始计数
num_to_string(Freq, 8, 0, num_string); //将得到的频率转换为字符串以便在LCD显示
LCD_write_string(0, 1, num_string); //将该频率显示在LCD第一行
LCD_write_string(8, 1, hz);//写入单位
}
}
#pragma vector = TIMER1_A0_VECTOR
__interrupt void TIMER1_A0_ISR(void) //0.05秒产生一次中断
{
TA1_OverflowCnt++;
if(TA1_OverflowCnt == 20) //通过计数达到一秒定时
{
TA1_OverflowCnt = 0;
LPM0_EXIT;
}
}
#pragma vector = TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:TA_OverflowCnt++;
break;
}
}
|
|