#define uchar unsigned char
#define uint unsigned int
uint a[10],n=0,overfloat=0;
int main(void)
{ uint heartrate,i;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P1DIR &=~BIT2;
P1REN |= BIT2;
P1SEL |= BIT2; //输入捕捉端口(P1.2)
TACCTL1 = CAP+CM_1+CCIS_0+SCS+CCIE; // 输入捕捉,上升沿触发(upCM_1,downCM_2,updownCM_3),同步捕捉,CCR0 中断使能
TACTL = TASSEL_2 + MC_2 + TAIE + TACLR; // 选择SMCLK为时钟,连续增计数模式 ,溢出中断使能
_EINT(); //开全局中断
IO_Init();
LCD_Init();
uchar LCDBuf1[]={"heart rate:"};
while(1)
{
LCD_Write_Command(0x01);
if(n>0&&n%2==1)
heartrate=(2000000*60)/(65535*overfloat+(a[n]-a[n-1]));
for(i=0;i<80;i++)
{
LCD_Disp_string(0,0,LCDBuf1);
LCD_Write_Command(0x80+0x0c);
Disp(heartrate);
if(heartrate==0)
LCD_Disp_string(0,2,message[3]);
else if(heartrate<=60)
LCD_Disp_string(0,2,message[0]);
else if(heartrate<=120)
LCD_Disp_string(0,2,message[1]);
else
LCD_Disp_string(0,2,message[2]);
}
}
}
#pragma vector=TIMER0_A1_VECTOR //捕获中断
__interrupt void Timer0_A1(void)
{
switch(TA0IV)
{
case 2:
{
if(n%2==0)
overfloat=0;
a[n]=TAR;//CCR1
if(n==9)
n=0;
else
n++;
break;
}
case 4: break; // CCR2 not used
case 10: overfloat++; break; // TimerA溢出中断;
}
}
以上是刚刚编好的程序,是用来测心率的,但运行时出了问题,给P1.2输入一个稳定的方波,会测出多个不同的心率值且相差十几到三十几左右,方波频率越大相差越大,比如170次每分钟,会显示一百五十多,一百七十多,二百二十多,不知道为什么,程序哪里出来问题,程序中心率计算用的思路是,输入脉搏方波信号,把定时器A设置为上升沿中断,定时器A中计数器设置为连续增计数模式,计数时钟周期为1/1000000秒,当输入方波信号上升沿时,定时器捕获中断,计数器的初值a[N-1]被保存并起动计数,当计数器计数到65536溢出时,计数器自动清零重新开始计数,当输入第二个方波信号上升沿时,定时器再次捕获中断,并保存定时器的终值a[n],单片机能记下一个脉搏周期内计数器的初值a[n-1]和终值a[n], 以及计数器溢出次数over—flow。代入下面的公式可算出脉搏的周期
T= [65536 * overflow +(a[n]-a[n-1])]/1000000
1、你不清中断标志位的么?
2、计算过程要确保没有数据溢出
3、为什么不在上一次输入捕获时清零计时器和溢出次数,下一次捕获中断时(溢出次数*计数周期+当前计数值)不更好计算
关于你提到的第一和第三点因为我是初学定时器A,不太理解,方便的话可以详细解释一下吗,谢谢!