试用定时计数器的捕获功能,测试人为按一下实验板按键(可以用 430 红板上的按键 S1,也可以用外设蓝板上的按键)整个过程所用的平均时间。要求对至少测试十次以上的时 间值求平均,并在数码管上显示测试结果。
时间: 2024-02-27 16:53:56 浏览: 7
好的,我们可以使用MSP430G2553的定时计数器Timer_A的捕获功能,来测试人为按下按键所用的时间。以下是测试代码:
```c
#include <msp430.h>
volatile unsigned int start_time, end_time, time_diff;
volatile unsigned int count = 0, sum = 0;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停用看门狗定时器
P1DIR &= ~BIT3; //P1.3引脚设为输入
P1IE |= BIT3; //P1.3引脚设为中断源
P1IES |= BIT3; //P1.3引脚设为下降沿触发
P1IFG &= ~BIT3; //清除P1.3引脚的中断标志位
TA0CTL = TASSEL_2 + MC_2 + TACLR; //选择SMCLK作为时钟源,选择Continuous计数模式,清除计时器
TA0CCTL0 = CM_3 + CCIS_2 + CAP + CCIE; //选择CCI2B作为捕获输入管脚,启用捕获模式,启用中断
_BIS_SR(GIE); //开启全局中断
while(1);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer0_A0_ISR(void)
{
if(count == 0) //第一次捕获,记录起始时间
{
start_time = TA0CCR0;
count++;
}
else if(count == 1) //第二次捕获,记录结束时间,并计算时间差
{
end_time = TA0CCR0;
time_diff = end_time - start_time;
sum += time_diff;
count = 0;
}
}
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
P1IFG &= ~BIT3; //清除P1.3引脚的中断标志位
count = 0; //重置计数器
sum = 0; //重置时间总和
TA0CTL |= TACLR; //清除计时器
TA0CTL |= MC_2; //重新启动计时器
}
void display_result(unsigned int result)
{
unsigned int i, digits[5];
for(i=0; i<5; i++) //将结果分解成每个数字
{
digits[i] = result % 10;
result /= 10;
}
for(i=0; i<5; i++) //在5位数码管上显示结果
{
P2OUT = digits[i]; //设置显示的数字
P1OUT |= BIT4; //打开位选锁存器
P1OUT &= ~BIT4; //关闭位选锁存器
__delay_cycles(2000); //延时
}
}
void main_loop()
{
unsigned int i, result;
for(i=0; i<10; i++) //进行10次测试
{
while(count < 2); //等待捕获完成
result = sum / 1000; //将时间总和转换为毫秒
display_result(result); //在数码管上显示结果
count = 0; //重置计数器
sum = 0; //重置时间总和
TA0CTL |= TACLR; //清除计时器
TA0CTL |= MC_2; //重新启动计时器
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停用看门狗定时器
P1DIR &= ~BIT3; //P1.3引脚设为输入
P1IE |= BIT3; //P1.3引脚设为中断源
P1IES |= BIT3; //P1.3引脚设为下降沿触发
P1IFG &= ~BIT3; //清除P1.3引脚的中断标志位
TA0CTL = TASSEL_2 + MC_2 + TACLR; //选择SMCLK作为时钟源,选择Continuous计数模式,清除计时器
TA0CCTL0 = CM_3 + CCIS_2 + CAP + CCIE; //选择CCI2B作为捕获输入管脚,启用捕获模式,启用中断
_BIS_SR(GIE); //开启全局中断
main_loop(); //进入主循环
}
```
在上述代码中,我们使用P1.3引脚作为按键输入管脚,使用Timer_A的CCR0通道进行捕获,记录按键按下的起始时间和结束时间,并计算时间差。当捕获两次时间差后,将时间差累加到时间总和中,并计数器计数器重置为0,然后重新启动计时器等待下一次按键按下。
在主循环中,我们进行10次测试,每次测试完成后将时间总和转换成毫秒,并在5位数码管上显示测试结果。需要注意的是,由于数码管的刷新速率较慢,显示结果的准确性可能会受到影响。如果需要更高的显示精度,可以使用LCD显示屏等其他显示设备。