//*********************************************************
//計數后一直顯示為 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);
}
}
|