if (CALBC1_8MHZ==0xFF || CALDCO_8MHZ == 0xFF)//时钟源DCO的设置
{
while(1) // If calibration constants erased
// do not load,trap CPU!!
}
如果这个条件判定成立,那么接下来包括中断以内的语句都不用执行了!!
因为开中断语句在这个函数后面!
#include <msp430g2553.h>unsigned char ta0
unsigned char t,i
void main( )
{
WDTCTL = WDTPW+ WDTHOLD //stop WDT
TACTL |= BIT9+BIT2 //Timer_A clock source select SMCLK + Timer_A clear
CCR0 = 200
CCTL0 |= BIT4//CCR0 Interrupt enabled
CCTL1 |= BITF + BITE //Capture on both rising and falling edges
CCTL1 |= BITD + BITB + CAP + BIT4 // CAP+SCS+CCIS1+CM_3
P1DIR |= BIT0
P1OUT &= ~BIT0
TACTL |= BIT5 // Continuous mode: the timer counts up to 0FFFFh.
__enable_interrupt( )
LPM0
}
#pragma vector = TIMER0_A0_VECTOR//CCR0 Interrupt
__interrupt void TA0_CCR0_ISR (void)
{
{
CCTL1 ^= BITC //设置一个反转的脉冲,BIT=Vcc,CCTL1=GND,所以会产生一个上升沿使得CCR1捕获
CCR0 += 200
}
}
#pragma vector = TIMER0_A1_VECTOR //CCR1 cap Interrupt
__interrupt void TA0_CCR1_cap_ISR (void)
{
t++
ta0= CCR1
if (t>=2)
{
__disable_interrupt( )// 捕获两次,
P1OUT = BIT0
}
CCTL1 &= ~BIT0
}
这个是比较捕获的,中间把比较的部分改一下就可以了
430单片机的定时器模块有一个捕获比寄存器,通过设置相关的寄存器,让其工作在捕获模块,捕获的方式可选择,分别为上升沿捕获,下降沿捕获和上升下降都捕获。测方波频率的话,选第一个吧。捕获模块的工作原理是:当外部事件发生时,也就是你的方波的上升沿到来时,单片机的捕获端口就会捕获到一个脉冲,然后定时器的16位计数器就会计数,最后计数器的值就是你测得的脉冲个数。测频率一般有两种方法,一个是测周法,一个是测频法,百度一下这两个方法,了解一下原理。我们采用最简单的方法,那就是测一秒内捕获的脉冲个数,那个值就是频率。至于相关寄存器的设置,自己多看看430的常用模块介绍,了解一下定时器的那些寄存器的功能和设置方法。程序网上很多,我这儿也有,想要的话,看我ID,然后发邮件给我,我给你发过去。多查查资料,只要愿意去学,一定会懂的,祝成功!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)