刚写好的测频程序,带自动换挡,0.1到1M
#include"MSP430G2553.h" #include"TCA6416A.h" #include"HT1621.h" #include"LCD_128.h"
voidtimer0_capture(); /** * main.c */ float n1=0 ; //统计每秒的周期数 float n2=0; //统计每个周期时钟数 float begin_counter=0; float time_frequency=0; float k=0; //状态转化 float n_max=181; //分界点 float m=0; //统计溢出数 float m1=0; float n=0; int main(void) { WDTCTL = WDTPW | WDTHOLD; // stop watchdog timer //时钟配置 BCSCTL1=CALBC1_16MHZ; DCOCTL=CALDCO_16MHZ; //BCSCTL3=LFXT1S1; timer0_capture(); //捕获定时器配置 timer1_init(); //测周法定时器配置 _enable_interrupts(); while(1) { m1=16000000/n2; //测周法频率转化
if(time_frequency>n_max) //阈值电压,高低频转化 { n= time_frequency; } else { n=m1; } } return 0; } voidtimer0_capture(void) //捕获定时器 { P1DIR &=~BIT2; P1SEL |=BIT2; TA0CTL=TASSEL_1+MC_1+TAIE+TACLR; //外部晶振,连续计数模式,使能计数器中断,计数器清零 TA0CCTL1 |=CM_1+SCS+CAP+CCIS_0+CCIE;//上升沿捕获,同步捕获,CCI0A输入,使能捕获中断 TA0CCR0=32768; //产生秒脉冲 } void timer1_init() //测周法定时器 {
TA1CTL=TASSEL_2+MC_2+TAIE+TACLR; //外部晶振,上升计数,使能计数器中断,计数器清零
} #pragmavector=TIMER0_A1_VECTOR __interrupt voidTIMER0_A1_ISR(void) { switch(TA0IV) { case 2: TA0CCR1_interrupt(); break; //捕获中段 case 10: TA0_interrupt(); break; //溢出中断 default: break; } } voidTA0CCR1_interrupt(void) { n1=n1+1; //高频计数 n2=m*65536+TA1R-begin_counter; //低频时钟沿个数 begin_counter=TA1R; m=0; } voidTA0_interrupt(void) { time_frequency=n1; //高频信号个数 n1=0; } #pragmavector=TIMER1_A1_VECTOR __interrupt void TIMER1_A1_ISR(void) { switch(TA1IV) { case 10: TA1_interrupt(); break; //溢出中断 default: break; } } voidTA1_interrupt() { m=m+1; }
|