//*********************************************************
//计数后一直显示为 65535 请问大佬应该怎么改,错误请详细指出来,谢谢
//*********************************************************
// 端口初始化
void Port_Init()
{
P1SEL|=BIT2; //捕获模式
P1DIR&=~BIT2; //捕获输入
P2SEL|=BIT0; //ACLK时钟
P2DIR|=BIT0;
P2SEL&=~BIT5;
P4SEL=0x00;
P4DIR=0xff;
P5SEL=0x00;
P5DIR|=BIT5+BIT6+BIT7;
TACCTL1=CM1+CAP+CCIS0+SCS+CCIE; //捕获模式设置
TACTL|=TASSEL0+MC1+TAIE+TACLR+TAIE; //定时器设置
}
//频率处理
void TIME_do(uint x)
{
uint time;
time=(1000000/(65535*overtime+x)); //将时间转换为频率
a[0]=time/100000+48;
a[1]=(time%100000)/10000+48; //用数组记录每一位
a[2]=(time%10000)/1000+48;
a[3]=(time%1000)/100+48;
a[4]=(time%100)/10+48;
a[5]=time%10+48;
a[6]='H';
a[7]='Z';
}
// 中断
#pragma vector=TIMERA1_VECTOR
__interrupt void time(void)
{
switch(TAIV)
{
case 2:Flag++;
if(Flag==1) //捕获第一个上升沿
{
TACTL|=TACLR;
overtime=0;
TIME0=TACCR1;
}
else if(Flag==2) //捕获第二个上升沿
{
TIME1=TACCR1;
TIME=TIME1-TIME0; //一个周期的时间
Flag=0;
}
break;
case 4:break;
case 10:overtime++;break; //定时器溢出次数
default:break;
}
}
// 主函数
void main()
{
WDT_Init();
Clock_Init();
Port_Init();
delay_ms(500);
LCD_Init();
LCD_clear();
_EINT();
while(1)
{
uchar i;
TIME_do(TIME); //对所计的定时器时间差处理
delay_ms(5);
for(i=0;a[i]!='\0';i++)
{
LCD_write_char(i,1,a[i]); //转lcd显示
}
delay_ms(500);
}
}
|