#include <msp430f249.h>
#define NUM 16 //测量次数
unsigned int new_cap=0;
unsigned int old_cap=0;
char N1; //溢出次数
long diff[NUM]; // 周期测量值
char index=0;
long data; //计算测量周期的平均值
char led[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,
0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0xff};//共阳极数码管
char position[]={0x20,0x10,0x08,0x04,0x02,0x01};//位码
char led_buf[] = {0,0,0,0,0,0}; //显示缓冲区
void data_to_buf(long data1) // 值送显示缓冲区函数
{
char i;
for (i=0;i<6;i++)
{
led_buf = data1%10; //低位在前
data1=data1/10;
}
}
void disp(void) // 动态扫描显示函数
{
char i;
unsigned int k;
for(i=0;i<6;i++)
{
P4OUT = led[led_buf];
P5OUT = position;
//if(i==3)
//P4OUT &=0X7F; //小数点
for ( k=0; k<700; k++); // 延时
P5OUT = 0X00; //关显示
}
}
void main(void)
{
char k1;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
BCSCTL2 |= SELS; // SMCLK = XT2
BCSCTL2=DIVS0+DIVS1; //SMCLK 8 分频
P4DIR=0xFF; //设置 P4 口为输出
P5DIR=0xFF; //设置 P5 口为输出
P1SEL = 0x02; //设置 P1.1(TA0) 为输入信号管脚
CCTL0 = CM_1 + SCS + CCIS_0 + CAP + CCIE;
// 上升沿捕获+ CCI0A (P1.1)输入+捕获模式+中断允许
TACTL = TASSEL_2 + MC_2+ TAIE; //TA时钟源为 SMCLK+连续模式+中断允许
_EINT(); //总中断允许
while(1)
{
if(index==0) //多次测量周期值后, 取平均值并更新数据
{
data=0;
for(k1=0;k1<NUM;k1++)
data+=diff[k1];
data=data/NUM;
}
data_to_buf(data); //数据送显示缓冲区
disp(); // 动态扫描显示程序
}
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA0(void) //TA0 捕获中断服务程序
{
new_cap = TACCR0;
diff[index] =65536* N1 + new_cap - old_cap; //计算周期值
index++;
if (index ==NUM) index = 0;
old_cap = new_cap; // 保存捕获值
N1=0; //溢出次数清零
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void) //TA 中断服务程序
{
switch( TAIV )
{
case 2: break;
case 4: break;
case 10: N1++; break; //溢出次数加 1
}
}
50HZ应该显示020000的 不知道是哪里出了问题
|