在做超聲模塊時用到
1 //捕獲上升沿
2 void Capture_Pos(void)
3 {
4 P2SEL |= Echo; //選擇P23作為捕捉的輸入端子 Timer1_A
5
6 //TA1CCTL1 |=CM_3+SCS+CAP+CCIE; //上下沿都觸發(fā)捕捉,用于測脈寬,同步模式、時能中斷 CCI1A
7
8 TA1CCTL1 |=CM_1+SCS+CAP+CCIE; //上升沿觸發(fā)捕捉,同步模式、時能中斷 CCI1A
9
10 TA1CTL |= TASSEL1+MC_2; //選擇SMCLK時鐘作為計數(shù)時鐘源,不分頻 增計數(shù)模式不行,必須連續(xù)計數(shù)模式
11
12 }
1 //捕獲下降沿
2 void Capture_Neg(void)
3 {
4 P2SEL |= Echo; //選擇P23作為捕捉的輸入端子 Timer1_A
5
6 TA1CCTL1 |=CM_2+SCS+CAP+CCIE; //下降沿觸發(fā)捕捉,同步模式、時能中斷 CCI1A
7
8 TA1CTL |= TASSEL1+MC_2; //選擇SMCLK時鐘作為計數(shù)時鐘源,不分頻 增計數(shù)模式不行,必須連續(xù)計數(shù)模式
9
10 // TA1R=0;
11
12 }
1 #pragma vector=TIMER1_A1_VECTOR //Timer1_A CC1 的中斷向量
2
3 __interrupt void Timer_A1(void)
4
5 {
6 unsigned int count;
7 char countH,countL;
8 float mile;
9 UCHAR shi[2];
10 //的方法進行判斷是哪一個中斷源產(chǎn)生的中斷
11
12 switch(TA1IV) //如果是Timer1_A CC1產(chǎn)生的中斷
13
14 {
15
16 case 2: // CCR1 not used 捕獲/比較器1
17
18 {
19 if(CaptureFlag==0)
20 {
21 // uart_send_ch('H');
22 CaptureFlag=1;
23 Capture_Neg();
24 }
25 else if(CaptureFlag==1)
26 {
27 /*
28 * 聲速340m/s = 34cm/ms;
29 * distance = 34/2*time
30 * time=count/1000 (ms) 認為頻率為1Mhz
31 * */
32 // uart_send_ch('L');
33 count=TA1CCR1;
34 // countL=(char)(count&0xff);
35 // countH=(char)(count>>8);
36 mile=(float)count;
37 mile=mile/1000*17;
38 distance=(char)mile;
39 P1OUT ^= GRN_LED;
40 uart_send_ch(distance);
41 // shi[0]=distance/10+0x30;
42 // shi[1]=distance%10+0x30;
43 // OLED_SSD1306_Display8x16Str(0,80,&shi[0]);
44 // OLED_SSD1306_Display8x16Str(0,96, "cm");
45 CaptureFlag=2;
46 // uart_send_ch(distance);
47 // uart_send_ch(shi[0]);
48 // uart_send_ch(shi[1]);
49 // CaptureFlag=0;
50 // Capture_Pos();
51
52 }
53
54
55 break;
56
57 }
58
59 case 4:break; // CCR2 not used 捕獲/比較器2
60
61 case 10:break; // overflow 定時器溢出
62
63 }
中斷處理只需要記住結果,內(nèi)部邏輯代碼跟模塊有關