//P1.2输入方波,测出频率,并在1602上显示
#include <msp430.h>#include"LCD1602.h"
#define uint unsigned int
#define MCLK 1048.576
uint lastCCR1=0;
uint time=0;
uint l=0;
uchar str[10 ];
void PRNT_MCLK(uint time)
{
l=10*MCLK/time;
str[0]=48+l/10000;
str[1]=48+(l%10000)/1000;
str[2]=48+(l%1000)/100;
str[3]=48+(l%100)/10;
str[4]='.';
str[5]=48+l%10;
str[6]='k';
displaystring(1,0,7,str);//在第0行第0列开始显示str字符串
}
//这段把k对应的频率进行显示
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
//*****初始化LCD602********************************
init_1602( );
//******信号捕获**************************************
TA0CTL = TASSEL_2+ MC_2 + TACLR; // SMCLK, 连续模式, clear TAR
TA0CCTL1=CM_1+CCIS_0+CAP+CCIE;//上升沿捕获
P1DIR&=~BIT2;
P1SEL=BIT2; //P1.2输入一定频率的方波
uchar tip[ ]={"Frequency:"};
uchar unit[2]={"Hz"};
displaystring(0,0,10,tip);
displaystring(1,7,2,unit);//这几句显示描述语,无关紧要,也没有问题
__enable_interrupt(); //开启总中断
while(1);
}
#pragma vector=TIMER0_A1_VECTOR
__interrupt void TIMER0_A1_ISR(void)
{
switch(__even_in_range(TA0IV,14))
{
case 2:
time=A*65536+TA0CCR1-lastCCR1;//k为两次上升沿之间的计数值
PRNT_MCLK(time);//显示频率
lastCCR1=TA0CCR1;
break;
case 14:A++;break;//连续模式下,记录TAR溢出次数
default:break;
}
}
lcd1602.h就不给出了,那个没问题,主要问题在于频率只能测几百HZ到30kHz,而且lcd显示的数字变化厉害(比如在28.0和14.0间快速跳动)。
想问一下各位我这样写的程序有没有问题,问什么测量范围那么小?要怎么改进?
此外我不知道定时器中断时,计时器还计数吗?比如说进入了case 2,那case 2里面的程序段执行时间的长短会怎样影响time值的测量?
Kaidi Xiao:
你好!
请问楼主解决了么 我也遇到了类似的问题
user5961828:
你好可以交流一下吗
灰小子:
回复 user5961828:
定时器不会在中断时停止的。
不过建议楼上重新发个新帖讨论问题
Susan Yang:
回复 user5961828:
请您重新发帖说明下您的详细问题,请不要跟踪旧贴,谢谢!