#include <msp430x14x.h>
#include "12864.h"
uchar Edge=1;//當前觸發沿
uint RiseCapVal; //上升沿時刻捕獲值存放變量
uint TA_Overflow_Cnt; //TA溢出次數存放變量,可能距離遠超過65535
unsigned long int Period; //脈寬存放結果變量,高電平時間
unsigned long int S; // 定義距離長度,單位厘米
void Conut(void)
{
disbuff[1]=S%1000/100;
disbuff[2]=S%1000%100/10;
disbuff[3]=S%1000%10 %10;
LCD_set_xy( 3, 4 );
LCD_Write_number(disbuff[1]);
LCD_Write_number(12);
LCD_set_xy( 3, 5 );
LCD_Write_number(disbuff[2]);
LCD_Write_number(disbuff[3]);
}
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 2 :if(Edge==RISE)
{
RiseCapVal = TACCR1;
TACCTL1 |= CAP+CM_2+CCIS_1+SCS+CCIE;//改為下降沿捕獲
Edge = FALL;//下降沿捕獲標志
}
else
{
//_DINT();
Period = TACCR1-RiseCapVal; //這里要注意是否考慮溢出,跟測試距離有關,希望大家拓展
S=(Period*17)/100; // 距離計算 s=340m/s*Period/2*10^(-6)*1000(mm)
TACCR1 = 0;
TACCTL1|= CAP+CM_1+CCIS_0+SCS+CCIE;//改為上升沿捕獲
Edge = RISE;//上升沿捕獲標志
//_EINT();
}
break;
case 4 : break;
case 10: TA_Overflow_Cnt++; //溢出標志
break;
}
}
void init_timerA(void)
{
TACTL |= TASSEL_2+MC_2+TAIE+TACLR+ ID_3;//SMCLK,8MHz,8分頻,連續計數,中斷允許,計數器清零
TACCTL1 |= CAP+CM_3+CCIS_0+SCS+CCIE;//捕獲模式,上升沿下降沿都捕獲(CM_3),CCI1A輸入,同步捕獲,中斷允許
}
void init_IO(void)
{
P1DIR |= BIT1; //P1.1輸出,普通I/O
P1DIR &=~ BIT2; //P1.2輸入
P1SEL |= BIT2; //P1.2第二功能,捕獲輸入
P1OUT &=~BIT1; // 開始低電平,控制驅動波形發生
}
void init_clk(void)
{
uchar i;
BCSCTL1&=~XT2OFF; //打開XT振蕩器
BCSCTL2|=SELM_2+SELS;//MCLK 8M and SMCLK 8M
do
{
IFG1 &= ~OFIFG;//清除振蕩錯誤標志
for(i = 0; i < 0xff; i++) _NOP();//延時等待
}
while ((IFG1 & OFIFG) != 0);//如果標志為1繼續循環等待晶振起振
IFG1&=~OFIFG;
}
void main(void)
{
/*下面六行程序關閉所有的IO口*/
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
WDTCTL = WDTPW + WDTHOLD; //關閉看門狗
P6DIR |= BIT2;P6OUT |= BIT2; //關閉電平轉換
P6DIR |= BIT3;P6OUT |= BIT3; //關閉電平轉換
Ini_Lcd();
Disp_img(logo); //顯示歡迎使用本產品LOGO
delay_Nms(1000);
Ini_Lcd();
Lcd_Mark2();
init_clk();
init_IO(); //初始端口設置
_EINT(); //開全局中斷
while(1)
{
init_timerA();
P1OUT |= BIT1; // P1.1 高電平,超過10us
delay_Nms(100);
P1OUT &=~BIT1;
delay_Nms(80);
Conut();
delay_Nms(80); //80MS
}
}
|