狠狠干影院/欧美午夜电影在线观看/高黄文/国产精品一区二区在线观看完整版

計硬基礎實驗報告3

| 瀏覽次數:

 實驗名稱:

 中斷技術 、 基本時鐘和低功耗模式 (實驗 5 5 、實驗 6 6 )

 姓名:

 學號:

 實驗班號:

 機器號:D D- - 100

 實驗目的

 1. 了解中斷原理,包括對中斷源、中斷向量、中斷類型號、中斷程序以及中斷響應過程的理解; 2. 掌握單片機 C 語言中斷程序設計方法。

 3. 了解 MSP430Gxxx 基本時鐘模塊的工作原理,掌握其控制方法; 4. 掌握利用時鐘信號和中斷技術實現定時功能的方法; 5.掌握低功耗模式控制方法。

 實驗 基本 任務

 實驗 5 中斷技術 :

 1. 中斷響應過程的理解

  閱讀下面 C 語言中斷程序L5_int.C(見后頁),說明程序執行的流程和實現功能。上機實踐,回答下面問題,掌握用C 語言編寫中斷程序的方法。

 注意: 1) 查看io430G2553.h 文件末尾處有關中斷向量偏址的符號定義。

 2)為便于了解程序執行流程,可在中斷函數入口處設置一斷點,然后連續運行程序(F5),觀察操作按鍵和不操作按鍵兩種情況下程序執行的現象有何不同。

 程序見 Lab_5 項目,程序 L5_int.C 如下:

 #include "io430.h" #include "in430.h"

 void delay( )

 //延時函數 {

  unsigned int j;

  for (j=0;j<0xffff;j++);

  }

 void Blink( )

 //LED閃 {

 P2OUT &=~BIT3;

  delay();

  P2OUT |= BIT3;

  delay();

  }

 void Buzz( )

 //蜂鳴響 { unsigned int i;

 for (i=0;i<3;i++)

  {

  P2OUT &=~BIT4;

  delay();

 P2OUT|= BIT4;

  delay();

  }; }

 void main ( void ) {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

 //設置引腳P2.4、P2.3輸出,P2.3連接LED,P2.4連接蜂鳴器

 P2SEL &=~(BIT3+BIT4);

  P2SEL2 &=~(BIT3+BIT4);

  P2OUT|=(BIT3+BIT4);

  P2DIR|=(BIT3+BIT4);

  //中斷相關設置即設置端口P1.3允許中斷

  P1SEL &= ~BIT3;

 P1SEL2 &= ~BIT3;

  P1OUT |=BIT3;

  P1REN |=BIT3;

 P1DIR &=~BIT3;

  P1IES |= BIT3;

  P1IFG &=~BIT3;

 P1IE |= BIT3;

  _EINT();

 //總中斷允許

 for (;;)

 //主循環

  {

  Blink();

 };

  }

 #pragma

 vector=PORT1_VECTOR

  __interrupt

 void port_ISR( ) {

  Buzz();

  P1IFG &=~BIT3;

 }

 1) 從程序如何判斷用的是哪個中斷源?中斷類型號是多少?將實驗板上某一按鍵與該中斷源對應的引腳相連,運行程序,操作按鍵,觀察現象。

 答:程序是通過判斷中斷標志位來確定是哪個中斷源,P1.3 為中斷源,中斷類型號是 2; 現象:運行程序時P2.3控制的LED4燈不斷閃爍,當P1.3控制的開關發出中斷申請時即按下按鍵K4后閃爍暫停,控制P2.4連接的蜂鳴器響3聲,然后繼續LED4燈閃爍。

 2)main 函數中無調用函數port_ISR 的語句,函數port_ISR 如何能被執行?何時會被執行? 據此描述中斷響應過程。

 答:當 P1.3 發出中斷申請時即當按下按鍵時,函數 port_ISR 就會被執行,執行完畢后再返回 main 函數中繼續執行 main 函數。

 中斷響應的過程:P1.3處發出中斷請求→判斷是否滿足響應條件→若滿足,則CPU在執行完當前指令后,硬件自動完成保護現場的操作→從中斷向量表中取中斷向量至PC→轉去執行中斷服務子程序; 3) 如果函數port_ISR 中不清分中斷標志P1IFG 的后果是什么?

 答:如果不清分中斷標志P1IFG的話就會一直響應中斷,然后port_ISR函數就會一直被執行,蜂鳴器不斷的響。

 4) 如果L5_int.c 中的PORT1_VECTOR 改為PORT2_VECTOR, 其他不變,程序執行的后果是什么?為什么?(可在main 函數入口處加一斷點,運行程序,看現象,分析原因)

 答:PORT1_VECTOR 改為 PORT2_VECTOR,其他不變,程序將會無法進入中斷。因為程序中的中斷屬于 P1 引腳的中斷,中斷向量與 P2 引腳的中斷向量不同,所進行的改動則是把中斷程序寫入到了 P2 引腳的中斷向量對應的地址中,而 P1 引腳的中斷向量對應的地址上沒有程序,因此無法執行原先的中斷子程。

 當在主程序入口處加一斷點時可以發現,由于已經設置了中斷的端口,因此當有中斷信號發出時,程序仍然會去執行中斷子程,但由于中斷向量沒有正確設置,PC指針會跑飛,然后機器會自動復位,重新執行程序。

 5)如果中斷源采用的是P2.5, 按鍵用K6,請設計連線,修改L5_int.c 程序完成以中斷方式響 應K6 的操作。

 答:將 P2.5 引腳連線與 K6 相連,其他連線不變,連線圖如下:

 修改后見 程序見 Lab_5 項目,程序 L5_int-1.c 如下:

 #include "io430.h" #include "in430.h" void delay( )

 //延時函數 {

  unsigned int j;

  for (j=0;j<0xffff;j++); } void Blink( )

 //LED 閃 {

 P2OUT &=~BIT3;

 delay();

  P2OUT |= BIT3;

 delay();

 } void Buzz( )

 //蜂鳴響 { unsigned int i;

  for (i=0;i<3;i++)

  {

  P2OUT &=~BIT4;

  delay();

 P2OUT|= BIT4;

  delay();

  }; } void main ( void ) {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗 //設置引腳 P2.4、P2.3 輸出,P2.3 連接 LED,P2.4 連接蜂鳴器

 P2SEL &=~(BIT3+BIT4);

  P2SEL2 &=~(BIT3+BIT4);

  P2OUT|=(BIT3+BIT4);

  P2DIR|=(BIT3+BIT4);

 //設置端口 P2.5 允許中斷

  P2SEL &=~ BIT5;

  P2SEL2 &=~ BIT5;

 P2OUT |=BIT5;

 P2REN |=BIT5;

  P2DIR &=~BIT5;

 P2IES |= BIT5;

 P2IFG &=~BIT5;

 P2IE |= BIT5;

  _EINT();

 //總中斷允許

 for (;;)

 //主循環

  {

  Blink();

 };

 } #pragma

 vector=PORT2_VECTOR

 __interrupt

 void port_ISR( ) {

  Buzz();

  P2IFG &=~BIT5;

 }

 2. 中斷程序編程練習

 在實驗板上用跳線將按鍵 K2、K7 分別與單片機的P1.2 和P1.7 相連,編程以中斷方式響應按鍵K2 和K7 的請求:當按下一次K2 鍵,實驗板上的蜂鳴器發出一警報聲;當按下一次K7 鍵,實驗板上的發光二極管L2 閃2 次。主循環中控制L5 循環閃亮。

 :

 答:用跳線將按鍵 K2、K7 分別與單片機的 P1.2 和 P1.7 相連,P2.1、P2.4 分別連接 L2和 L5,P2.3 連接蜂鳴器, 接線圖如下: :

  修改后見 程序見 Lab_5 項目,程序 L5_int-2.c 如下:

 #include "io430.h"

 #include "in430.h"

 void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0;j<0xffff;j++);

 }

 void L2Blink( )

 //L2 閃 2 次

 { unsigned int i;

  for (i=0;i<2;i++)

 {

  P2OUT &=~BIT1;

 delay();

  P2OUT|= BIT1;

 delay();

 };

 }

 void L5Blink( )

 //L5 閃

 {

 P2OUT &=~BIT4;

  delay();

 P2OUT |= BIT4;

  delay();

 }

 void Buzz( )

 //蜂鳴響

 { P2OUT &=~BIT3;

 delay();

  P2OUT|= BIT3;

 delay();

 }

 void main ( void )

 {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

 //設置引腳 P2.1、P2.3 、P2.4 輸出,P2.1、P2.4 分別連接 L2 和 L5,P2.3 連接蜂鳴器

  P2SEL &=~(BIT1+BIT3+BIT4);

 P2SEL2 &=~(BIT1+BIT3+BIT4);

 P2OUT|=(BIT1+BIT3+BIT4);

 P2DIR|=(BIT1+BIT3+BIT4);

  //設置端口 P1.2、P1.7 允許中斷 K2、K7 分別與單 P1.2 和 P1.7 相連

  P1SEL &=~ (BIT2+BIT7);

  P1SEL2 &=~ (BIT2+BIT7);

 P1OUT |=(BIT2+BIT7);

 P1REN |=(BIT2+BIT7);

  P1DIR &=~(BIT2+BIT7);

 P1IES |= (BIT2+BIT7);

 P1IFG &=~(BIT2+BIT7);

 P1IE |= (BIT2+BIT7);

 _EINT();

 //總中斷允許

 for (;;)

 //主循環

  {

  L5Blink();

 };

  }

 #pragma

 vector=PORT1_VECTOR

 __interrupt

 void

 port_ISR( )

 {

 if ((P1IFG&BIT2)!=0)

  {Buzz();

 P1IFG &=~BIT2; }; if ((P1IFG&BIT7)!=0) { L2Blink(); P1IFG&=~BIT7;};

  }

 思考:

 1) 如果按鍵 K2、K7 分別連接在P2.1 和P2.6 上,如何修改程序以實現任務2 功能? 答: :

 P2.0、P2.4 分別連接 L2 和 L5,P2.3 連接蜂鳴器,P2.1、P2.6 分別連接按鍵 K2、K7,接線圖如下:

  修改后見 程序見 Lab_5 項目,程序 L5_int-3.c 如下:

 #include "io430.h"

 #include "in430.h"

 void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0;j<0xffff;j++);

 }

 void L2Blink( )

 //L2 閃 2 次

 { unsigned int i;

  for (i=0;i<2;i++)

 {

  P2OUT &=~BIT0;

 delay();

  P2OUT|= BIT0;

 delay();

 };

 }

  void L5Blink( )

 //L5 閃

 {

 P2OUT &=~BIT4;

  delay();

 P2OUT |= BIT4;

  delay();

 }

 void Buzz( )

 //蜂鳴響

 { P2OUT &=~BIT3;

 delay();

  P2OUT|= BIT3;

 delay();

 }

 void main ( void )

 {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

 //設置引腳 P2.0、P2.3 、P2.4 輸出,P2.0、P2.4 分別連接 L2 和 L5,P2.3 連接蜂鳴器

  P2SEL &=~(BIT0+BIT3+BIT4);

 P2SEL2 &=~(BIT0+BIT3+BIT4);

 P2OUT|=(BIT0+BIT3+BIT4);

 P2DIR|=(BIT0+BIT3+BIT4);

  //設置端口 P2.1、P2.6 允許中斷,P2.1、P2.6 分別連接按鍵 K2、K7

  P2SEL &=~ (BIT1+BIT6);

  P2SEL2 &=~ (BIT1+BIT6);

 P2OUT |=(BIT1+BIT6);

 P2REN |=(BIT1+BIT6);

  P2DIR &=~(BIT1+BIT6);

 P2IES |= (BIT1+BIT6);

 P2IFG &=~(BIT1+BIT6);

 P2IE |= (BIT1+BIT6);

 _EINT();

 //總中斷允許

 for (;;)

 //主循環

  {

  L5Blink();

 };

 }

  #pragma

 vector=PORT2_VECTOR

  __interrupt

 void

 port_ISR( )

 {

 if ((P2IFG&BIT1)!=0)

  {Buzz();

 P2IFG &=~BIT1; }; if ((P2IFG&BIT6)!=0) { L2Blink(); P2IFG&=~BIT6;};

  }

 2) 如果按鍵 K2、K7 分別連接在 P1.0 和 P2.4 上,如何修改程序以實現任務 2 功能?

  答: :

 P2.1、P2.5 分別連接 L2 和 L5,P2.3 連接蜂鳴器,P1.0、P2.4 分別連接按鍵 K2、K7,接線圖如下:

  修改后見 程序見 Lab_5 項目,程序 L5_int-4.c 如下:

 #include "io430.h"

 #include "in430.h"

 void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0;j<0xffff;j++);

 }

 void L2Blink( )

 //L2 閃 2 次

 { unsigned int i;

  for (i=0;i<2;i++)

 {

  P2OUT &=~BIT1;

 delay();

  P2OUT|= BIT1;

 delay();

 };

 }

  void L5Blink( )

 //L5 閃

 {

 P2OUT &=~BIT5;

  delay();

 P2OUT |= BIT5;

  delay();

 }

 void Buzz( )

 //蜂鳴響

 { P2OUT &=~BIT3;

 delay();

  P2OUT|= BIT3;

 delay();

 }

 void main ( void )

 {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

 //設置引腳 P2.1、P2.3 、P2.5 輸出,P2.1、P2.5 分別連接 L2 和 L5,P2.3 連接蜂鳴器

  P2SEL &=~(BIT1+BIT3+BIT5);

 P2SEL2 &=~(BIT1+BIT3+BIT5);

 P2OUT|=(BIT1+BIT3+BIT5);

 P2DIR|=(BIT1+BIT3+BIT5);

  //設置端口 P1.0、P2.4 允許中斷,P1.0、P2.4 分別連接按鍵 K2、K7

  P1SEL &=~ BIT0;

  P1SEL2 &=~ BIT0;

 P1OUT |=BIT0;

 P1REN |=BIT0;

  P1DIR &=~BIT0;

 P1IES |= BIT0;

 P1IFG &=~BIT0;

 P1IE |= BIT0;

  P2SEL &=~ BIT4;

  P2SEL2 &=~ BIT4;

 P2OUT |=BIT4;

 P2REN |=BIT4;

  P2DIR &=~BIT4;

 P2IES |= BIT4;

 P2IFG &=~BIT4;

 P2IE |= BIT4;

 _EINT();

 //總中斷允許

 for (;;)

 //主循環

  {

  L5Blink();

 };

 }

  #pragma

 vector=PORT1_VECTOR #pragma

 vector=PORT2_VECTOR __interrupt

 void

 port_ISR( )

 {

 if ((P1IFG&BIT0)!=0)

  {Buzz();

 P2IFG &=~BIT3; }; if ((P2IFG&BIT4)!=0) { L2Blink(); P2IFG&=~BIT4;};

  }

 3. 采用事件標志處理中斷

 閱讀程序 L5_intA.c 和L5_intB.c(見后頁),描述其實現功能。在實驗板上將P1.4 與一個按鍵的控制端相連, P1.6 與蜂鳴器的控制端相連。

 比較L5_intA.c 和L5_intB.c 二者在編程實現上有何不同。注意各自中斷函數執行時間的長短。

 用L5_intB.c 的方法,改寫任務2 的編程。

 答:

 程序見Lab_5 項目下程序L5_intA.c與 程序見Lab_5 項目下程序L5_intB.c在實驗板上進行比較情況如下:

 程序A和程序B實現的功能相同:用P1.4作為中斷源,當P1.4接收到中斷信號時,控制蜂鳴器響一聲。不同的是程序A把控制蜂鳴器鳴叫的過程放在中斷程序中,而程序B僅僅在中斷程序中設置了一個事件標志,而把控制蜂鳴器鳴叫放在了while循環中,這樣每當事件標志被響應時,蜂鳴器就會鳴一聲。因此程序A的中斷子程執行時間長于程序B。

 用 用 L5_intB.c 的方法 任務 2 2 修改編程:用跳線將按鍵 K2、K7 分別與單片機的 P1.2 和 P1.7 相連,P2.1、P2.4 分別連接 L2 和 L5,P2.3 連接蜂鳴器, 接線圖如下: :

 修改后見 程序見 Lab_5 項目,程序 L5_intB- -1 1c .c 如下:

 #include "io430.h"

 #include "in430.h"

 int flag=0; void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0;j<0xffff;j++);

 }

 void L2Blink( )

 //L2 閃 2 次

 { unsigned int i;

 for (i=0;i<2;i++)

 {

  P2OUT &=~BIT1;

 delay();

  P2OUT|= BIT1;

 delay();

 };

 }

 void L5Blink( )

 //L5 閃

 {

 P2OUT &=~BIT4;

  delay();

 P2OUT |= BIT4;

  delay();

 }

 void Buzz( )

 //蜂鳴響連 P2.3

 { P2OUT &=~BIT3;

 delay();

  P2OUT|= BIT3;

 delay();

 }

 void main ( void )

 {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

 //設置引腳 P2.1、P2.3 、P2.4 輸出,P2.1、P2.4 分別連接 L2 和 L5,P2.3 連接蜂鳴器

 P2SEL &=~(BIT1+BIT3+BIT4);

 P2SEL2 &=~(BIT1+BIT3+BIT4);

 P2OUT|=(BIT1+BIT3+BIT4);

 P2DIR|=(BIT1+BIT3+BIT4);

  //設置端口 P1.2 連 K2、P1.7 連 K7 允許中斷

 P1SEL &=~ (BIT2+BIT7);

  P1SEL2 &=~ (BIT2+BIT7);

 P1OUT |=(BIT2+BIT7);

 P1REN |=(BIT2+BIT7);

  P1DIR &=~(BIT2+BIT7);

 P1IES |= (BIT2+BIT7);

 P1IFG &=~(BIT2+BIT7);

 P1IE |= (BIT2+BIT7);

 _EINT();

 //總中斷允許

 for (;;)

 //主循環 {

  L5Blink();

 if (flag==1)

 {

  Buzz();

  flag=0;

  }

 if (flag==2)

  {

  L2Blink();

 flag=0;

  }

 } } #pragma

 vector=PORT1_VECTOR

 __interrupt

 void

 port_ISR( )

 {

 if ((P1IFG&BIT2)!=0)

  {flag=1;

 P1IFG &=~BIT2; }; if ((P1IFG&BIT7)!=0) { flag=2; P1IFG&=~BIT7;};

  }

  4 .(提高)按鍵抖動處理

 程序 L5_Key.C 見后頁, 其功能是用中斷方式相應與 P1.2 連接的按鍵,計數按鍵的次數,并將所計的次數用8 個發光二極管顯示出來。運行該程序,并操作按鍵,觀察實際操作的次數與顯示值之間的關系。編程改進L5_Key.C 程序,用軟件方式去除按鍵抖動的影響。

 說明:

 通常的按鍵所用開關為機械彈性開關,當機械觸點斷開、閉合時,由于機械觸點的彈性作用,一個按鍵開關在閉合時不會馬上穩定地接通,在斷開時也不會一下子斷開。因而在閉合(按下)及斷開(釋放)的瞬間均伴隨有一連串的抖動,產生電壓毛刺,見圖5-1機械按鍵的電壓變化圖。

 在一次按鍵過程中,因為電壓毛刺的產生,會有若干次下降沿和上升沿。采用下降沿判斷時,只有第一次下降沿是真正的按鍵事件,其它是由于按鍵抖動帶來的毛刺,不是按鍵事件。去除這些毛刺帶來的影響,稱為按鍵消抖或去抖。軟件編程處理比較簡單的方法是,在響應了第一次下降沿后,在中斷函數中加入一定的延時,躲過其它電壓毛刺的產生時間。

 答:

 通過在實驗板測試見 程序見 Lab_5 項目 下程序 L5_Key.c ,顯示按鍵次數大于實際數。

 改進在按鍵中斷程序增加延時函數,調整延時長短,使實際按鍵數與顯示數值大致相等。

 修改后見 程序見 Lab_5 項 項 目,程序 L5_Key- -1 1c .c 如下:

 #include "io430.h"

 #include "in430.h"

 unsigned int number=0;

  //記錄響應按鍵次數

 void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0; j<0xffff; j++);

  }

 int main( void )

 {

  WDTCTL = WDTPW + WDTHOLD;

  //關閉看門狗

  __disable_interrupt();

 //_DINT(); 禁止總中斷

  P2SEL=0;

 //置 P2 為基本 I/O 功能

  P2SEL2=0;

 P2OUT=0xFF;

  //置 P2 輸出的初值

  P2DIR=0xFF;

 //置 P2 為輸出方向

  P1SEL &= BIT2;

 //置 P1.2 允許中斷連 K3

  P1SEL2 &= BIT2;

 P1OUT |=BIT2;;

  P1REN |=BIT2;

 P1DIR &=~BIT2;

  P1IES |= BIT2;

  P1IFG &=~BIT2;

 P1IE |= BIT2;

 __enable_interrupt();

 //_EINT(); 總中斷運行

  while(1){ };

 }

 #pragma

 vector=PORT1_VECTOR

 __interrupt void port_int(void)

 {

 if( (P1IFG&BIT2)!=0 )

 { delay(); //增加延時函數,避開毛刺

  if ( (P1IFG&BIT2)!=0 )

 {

 number++;

 P2OUT=~number;

 }

  P1IFG &=~BIT2;

 }

 }

 思考: :

 1.延時函數加在按鍵中斷程序的什么位置? 為什么? 答:延時函數在按鍵中斷程序接收到信號之前,根據分析,需要在響應了第一次下降沿后,加入一定的延時,躲過其它電壓毛刺的產生時間。

 2.延時函數的延時長短如何控制? 答:通過實驗觀察可以發現,改進之前,二進制顯示的數值明顯大于實際按鍵數,而改進之后,兩者數值大致相等以此來調整延時長短。

 3.除延時方法去抖外,有沒有其他的方法可去抖?可上網查找相關資料了解。

 答:在鍵數較少時可用硬件方法消除鍵抖動,如:RS 觸發器為常用的硬件去抖。

  實驗 6 基本時鐘和低功耗模式:

 1. 數字示波器的使用

 1)將信號源的波形在示波器上顯示出來,掌握測量周期、頻率、峰峰值的方法; 答:用示波器測得信號源的周期 T=20us、頻率 f=1.000KHZ、峰峰值 V=3.18V。

 2)用導線將實驗板的地信號與示波器的地信號相連,測量實驗板上的 Vcc 電源信號是否正常。

 答: :

 測得實驗板上 Vcc 信號正常,Vccmax=3.76V,Vccmin=3.52V,Vccavg=3.66V。

 2. 測試上電復位系統的

 ACLK 、和 SMCLK 時鐘頻率

 新創建的一個MSP430G2553 項目,在給出的main.c 基礎上,編程輸出單片機上電復位后的ACLK、和SMCLK 時鐘,用示波器測量其頻率值,記錄下來。

 答:程序需要置引腳 P1.0、P1.4 分別輸出 ACLK、SMCLK,需要確認外部晶振連上,輸出的 ACLK 頻率為 F(ACLK)=32.7KHZ,SMCLK 的頻率為 F(SMCLK)=1.031MHZ。接線如下:

 見 程序見 Lab_6 項目,程序 L6_pin.c 如下:

 #include "io430.h"

 int main( void )

 {

 //關閉看門狗

 WDTCTL = WDTPW + WDTHOLD;

 //設置 P2.6、P2.7 連接外部晶振

 P2SEL|=(BIT6+BIT7);

 P2SEL2&=~(BIT6+BIT7);

 P2DIR&=~BIT6;

  P2DIR|=BIT7;

 //設置 P1.0、P1.4 輸出 ACLK、SMCLK

 P1SEL|=BIT0;

 P1SEL2&=~BIT0;

 P1DIR|=BIT0;

 P1SEL|=BIT4;

 P1SEL2&=~BIT4;

 P1DIR|=BIT4;

 while(1);

 }

 思考 :

 1) 實驗板上JP8 中間的兩個插針接到32.768KH 晶振側和接到P2.6/P2.7 側,測得ACLK 的結果有何不同? 為什么? 答:是由 32.768KHZ 低頻振蕩器控制的,因此比較精確,示波器測量的精確值和理論值相差不大,接到 P2.6/P2.7 側是由片內低功耗低頻振蕩器控制的,受環境溫度和工作電壓影響較大,因此測量值和理論值相差較大。

 2) 在debug 下如圖6-1,通過View/Register 更改System Clock 模塊控制寄存器值,分別置DIVA1、DIVA0=01、11;DIVS1、DIVS0=10、11;置LFXT1S0、LFXT1S0=00、10,記錄示波器測量得到的ACLK(P1.0 輸出)和SMCLK(P1.4 輸出)的頻率值,填寫在表6-1、6-2、6-3 中,掌握時鐘模塊各控制寄存器相關位的作用。

 表 6-1

  DIVAxx 與 ACLK 關系 DIVA1 DIVA0 ACLK 頻率值 作用 0 1

  1 1

  表 6-2

  DIVSxx 與 SMCLK 關系 DIVS1 DIVS0 SMCLK 頻率值 作用 1 0

  1 1

  表 6-3

  LFXT1Sxx 與 ACLK 關系 LFXT1S1 LFXT1S0 ACLK 頻率值 時鐘來源 0 0

  1 0

 3) 上電復位后,CPU 工作的時鐘信號 MCLK 頻率值是多少?

 答:上電復位后,通過查看基本時鐘模塊相關寄存器,發現 BCSCTL2 寄存器上 SELM 位為00,SELS 位為則 0,可知 MCLK 的時鐘源為 DCO,SMCLK 的時鐘源也為 DCO,因此通過測量上面復位后的 SMCLK 頻率可知 MCLK 的頻率,由上述可知 F(MCLK)=1.031MHZ。

 3. 掌握基本時鐘模塊的編程控制

 參看附錄A 實驗板原理圖,用跳線將JP8 中的插針信號接到晶振32.768Khz 側,使晶振與單片機的P2.6 和P2.7 相連。編程控制基本時鐘模塊,設置ACLK 分別為下面時鐘頻率,并通過P1.0輸出ACLK,用示波器觀察:

 1)

 ACLK=16.384kHz;(時鐘源外部晶振二分頻,即32768Hz/2)

 答:P2.6、P2.7 連接外部晶振引腳,通過 P1.0 輸出 ACLK,觀察的 F(ACLK)=16.3kHZ。接線如下圖:

 見 程序見 Lab_6 項目,程序 L6_pin - 1.c 如下:

 #include "io430.h" int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; P1SEL|=BIT0;

  //設置 P1.0 輸出 ACLK P1SEL2&=~BIT0; P1DIR|=BIT0; P2SEL|=BIT6;

  //設置 P2.6、P2.7 連接外部晶振引腳 P2SEL2&=~BIT6; P2DIR&=~BIT6;

 //P2.6 XIN 輸入 P2SEL|=BIT7; P2SEL2&=~BIT7; P2DIR|=BIT7;

  //P2.7 XOU 輸出 BCSCTL1|=DIVA_1;

  //設置 ACLK 為 2 分頻 while(1); }

 2)

 ACLK=1.5KHz;(時鐘源VLOCLK 八分頻,即12KHz/8) 答:通過 P1.0 輸出 ACLK,觀察的 F(ACLK)=1.4KHZ。

 見 程序見 Lab_6 項目,程序 L6_pin - 2.c 如下:

 #include "io430.h"

 int main( void )

 {

 // Stop watchdog timer to prevent time out reset

 WDTCTL = WDTPW + WDTHOLD;

 P1SEL|=BIT0;

  //設置 P1.0 輸出 ACLK

 P1SEL2&=~BIT0;

 P1DIR|=BIT0;

  BCSCTL1|=DIVA_3;

 //設置 ACLK 時鐘源為 VLOCLK,并為 8 分頻

 BCSCTL3|=LFXT1S_2;

 while(1);

 }

 思考 :可否通過對時鐘模塊編程在引腳 P2.4 上輸出 ACLK? 為什么?

 答:不可以,因為根據說明指導書 MSP430G2553 的輔助時鐘 ACLK 是由 P1.0 輸出的,內部硬件電路設計結構決定了不能用 P2.4 輸出 ACLK。

 4. DCO 出廠校驗值的頻率檢測

 1)利用出廠校驗值,編程使DCO 分別為1MHz、16MHz,通過P1.4 輸出,并用示波器測量實際值。

 答: :

 出廠校驗值為 1MHZ 時,F 實際=0.991MHZ,出廠校驗值為 16MHZ 時,F 實際=16.17MHZ。

 以上測試數據說明:DCOCLK 是由片內數字可控 RC 振蕩器控制的,受環境溫度和工作電壓的影響較大,因此出廠校驗值和實際測量值也存在不小的誤差。

 見 程序見 Lab_6 項目,程序 L6_pin - 3.c 如下:

 #include "io430.h"

 int main( void )

 {

 // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD;

  //關閉看門狗 P1SEL|=BIT4;

 //設置 P1.4 輸出 SMCLK P1SEL2&=~BIT4;

 P1DIR|=BIT4;

 BCSCTL1=CALBC1_1MHZ; //利用出廠校驗值設置 DCO 的振蕩頻率為 1MHZ, //其他情況改變 1MHz 就可以了 DCOCTL=CALDCO_1MHZ;

 while(1);

 }

 2)(提高)在實驗1 例程test_2553.c 基礎上,分別編程使主系統時鐘工作在(1) MCLK = 復位頻率/8 約100KHz;(2) MCLK=DCO=16MHz; 兩種不同MCLK 頻率下,觀察燈的亮滅速度有何不同,掌握主系統時鐘的變化對程序執行速度的影響。

 答: :

 經實驗觀察可知,MCLK 設置為 100KHZ 時 LED1 燈的閃爍頻率比設置為 16MHZ 慢了非常多,由此可知主系統時鐘是主要提供給 CPU 工作的時鐘,MCLK 頻率越高,CPU 工作速度越快。

 (1) MCLK = 復位頻率/8 約 100KHz,程 程見 序見 Lab_6 項目,程序 L6_pin - 4.c 如下:

 #include "io430.h"

 void delay( )

 //延時函數

 {

  unsigned int j;

  for (j=0;j<0xffff;j++);

 }

 int main( void )

 {

 // Stop watchdog timer to prevent time out reset

 WDTCTL = WDTPW + WDTHOLD;

 P2SEL&=~BIT0;

  //設置 P2.0 連接 L1 控制 LED1 閃爍

 P2SEL2&=~BIT0;

 P2DIR|=BIT0;

 BCSCTL2|=DIVM_3;

  //設置 MCLK=復位頻率/8 約 100KHz; unsigned int i; while(1)

  {

 for (i=0;i<5;i++)

 {P2OUT &=~BIT0;

 delay();

  P2OUT|=BIT0;

  delay();

  } } }

 (2) MCLK=DCO=16MHz,程 程見 序見 Lab_6 項目,程序 L6_pin - 5.c 如下:

 #include "io430.h"

 void delay( )

 //延時函數

 {

  unsigned int j;

 for (j=0;j<0xffff;j++);

  }

 int main( void )

 {

 // Stop watchdog timer to prevent time out reset

 WDTCTL = WDTPW + WDTHOLD;

  P2SEL&=~BIT0;

  //設置 P2.0 連接 L1 控制 LED1 閃爍

 P2SEL2&=~BIT0;

 P2DIR|=BIT0;

 BCSCTL1=CALBC1_16MHZ;

 //利用出廠校驗值設置 DCO 的振蕩頻率為 16MHZ

 DCOCTL=CALDCO_16MHZ;

  unsigned int i;

 while(1) {

  for (i=0;i<5;i++)

 {P2OUT &= ~BIT0;

 delay();

 P2OUT |=BIT0;

 delay();

 } } }

  5. 低功耗模式學習 程序 L6_LPM.c 見下,用跳線將P2.3 與L4 短接,將P2.4 用長杜邦線與buzz 短接,P1.1 與

 K2短接,并用示波器分別觀察P1.0、P1.4 輸出的ACLK 和SMCLK,了解低功耗模式的進入和退出。

 答:接線如下圖:

 程 序見Lab_6 項目,程序L6_LPM.c 清單(提供電子版):

 #include "io430.h" #include "in430.h" void delay( )

 //延時函數 {

  unsigned int j;

  for (j=0;j<0xffff;j++);

  } void Blink( )

 //LED閃 {

 unsigned int i;

  for (i=0;i<5;i++)

  { P2OUT &= ~BIT3;

 delay();

 P2OUT |=BIT3;

  delay();

  }; } void Buzz( )

 //蜂鳴響 {

 unsigned int i;

  for (i=0;i<3;i++)

  { P2OUT &= ~BIT4;

 delay();

 P2OUT |=BIT4;

 delay();

  };

 } int

 main ( void ) {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗 //設置端口P2.3輸出,控制LED,P2.4輸出,控制蜂鳴器

 P2SEL &=~(BIT3+BIT4);

  P2SEL2&=~(BIT3+BIT4);

  P2OUT |= BIT3+BIT4;

  P2DIR |= BIT3+BIT4;

  //設置端口P1.1允許中斷

  P1SEL &=~BIT1;

 P1SEL2 &=~BIT1;

  P1REN |=BIT1;

 P1OUT |=BIT1;

 P1DIR &=~BIT1;

 P1IES |=BIT1;

 P1IFG &=~BIT1;

 P1IE |=BIT1;

  _EINT();

  //P1.0輸出時鐘ACLK, P1.4輸出時鐘SMCLK

 P1SEL |=BIT0+BIT4;

 P1SEL2 &=~(BIT0+BIT4);

 P1DIR |=BIT0+BIT4;

  Blink();

 Buzz();

  for (;;)

 //主循環

 {

 LPM4; //

  Blink();

 }

  }

 #pragma

 vector=PORT1_VECTOR

  __interrupt

 void

 port_ISR( ) { Buzz();

 P1IFG&=~(BIT1);

 //清中斷標志

 LPM4_EXIT; }

 1) 運行程序,觀察現象,并記錄進入低功耗前、進入低功耗后、響應中斷后、退出中斷后的時鐘、發光二極管和蜂鳴器狀態,并做分析。

 答:程序開始運行時,P2.3控制的LED4先閃爍,然后蜂鳴器鳴叫,接著進入低功耗模式,實驗板無現象產生,若此時按下K2鍵向P1.1發出中斷信號后蜂鳴器開始鳴叫,接著LED4又開

 始閃爍,然后進入低功耗模式,實驗板無現象產生。

 進 入 低 功 耗 LPM4 前 F(ACLK)=32.89KHZ , F(SMCLK)=1.033MHZ , 進 入 后 F(ACLK)=0 ,F(SMCLK)=0,響應中斷后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,退出中斷后剛開始F(ACLK)= 32.89KHZ,F(SMCLK)=1.033MHZ,退出中斷LED燈閃爍后F(ACLK)=0,F(SMCLK)=0。

 分析:程序順著流程執行,先是LED閃爍,然后蜂鳴器響,接著進入循環,然后進入低功耗模式LPM4,此時PC指針停止不動,程序停止執行。若此時按下K2鍵發出中斷,則程序會立刻停止低功耗模式,將當前狀態儲存入堆棧中,然后跳轉執行中斷子程,蜂鳴器響,退出低功耗模式,然后程序返回斷點,返回到主函數中執行Blink()后再次進入低功耗模式。

 2) 如果程序中沒有 LPM4_EXIT 語句,運行的結果會有什么不同?請分析。

 答:如果程序中沒有LPM4_EXIT,則不同之處在于按下K2發出中斷信號后只有蜂鳴器鳴叫然后進入低功耗模式,而LED4不會閃爍。

 分析:程序在主函數中進入低功耗模式后停止執行,若此時按下K2鍵發出中斷,則程序會立刻停止低功耗模式,將當前狀態儲存入堆棧中,然后跳轉執行中斷子程,蜂鳴器響,與1不同的是,中斷子程中沒有退出LPM4語句,因此程序在執行完中斷后立刻返回中斷之前的低功耗狀態,而不會跳轉返回到主函數中執行Blink(),因此LED燈不會閃爍。

 3) (提高)

 將 LPM4 改為 LPM0,LPM4_EXIT 改為 LPM0_EXIT,重新完成任務 1)

 答:程序開始運行時,P2.3控制的LED4先閃爍,然后蜂鳴器鳴叫,接著進入低功耗模式,實驗板無現象產生,若此時按下K2鍵向P1.1發出中斷信號后蜂鳴器開始鳴叫,接著LED4又開始閃爍,然后進入低功耗模式,實驗板無現象產生。

 進入低功耗LPM0前F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,進入后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,響應中斷后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,退出中斷后剛開始F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ,退出中斷LED燈閃爍后F(ACLK)=32.89KHZ,F(SMCLK)=1.033MHZ。

 分析:程序順著流程執行,先是LED閃爍,然后蜂鳴器響,接著進入循環,然后進入低功耗模式LPM4,此時PC指針停止不動,程序停止執行。若此時按下K2鍵發出中斷,則程序會立刻停止低功耗模式,將當前狀態儲存入堆棧中,然后跳轉執行中斷子程,蜂鳴器響,退出低功耗模式,然后程序返回斷點,返回到主函數中執行Blink()后再次進入低功耗模式。

 原因分析:在低功耗LPM4模式下,CPU、MCLK、SMCLK、ACLK均被禁止,因此進入低功耗LPM4模式后P1.0和P1.4均不輸出信號;而在低功耗LPM0模式下,CPU、MCLK被禁止,而SMCLK和ACLK均在活動,因此進入低功耗模式前后P1.0和P1.4輸出的信號不變。雖然表面實驗現象和LPM4一樣,但是用示波器測得的引腳輸出信號不一樣。

 程 序見Lab_6 項目,程序L6_LPM-1.c:

 #include "io430.h" #include "in430.h" void delay( )

 //延時函數 {

  unsigned int j;

  for (j=0;j<0xffff;j++);

  } void Blink( )

 //LED 閃 {

 unsigned int i;

  for (i=0;i<5;i++)

  { P2OUT &= ~BIT3;

 delay();

 P2OUT |=BIT3;

  delay();

  }; } void Buzz( )

 //蜂鳴響 {

 unsigned int i;

  for (i=0;i<3;i++)

  { P2OUT &= ~BIT4;

 delay();

 P2OUT |=BIT4;

 delay();

  }; } int

 main ( void ) {

 WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗 //設置端口 P2.3 輸出,控制 LED,P2.4 輸出,控制蜂鳴器

 P2SEL &=~(BIT3+BIT4);

  P2SEL2&=~(BIT3+BIT4);

  P2OUT |= BIT3+BIT4;

  P2DIR |= BIT3+BIT4;

  //設置端口 P1.1 允許中斷

  P1SEL &=~BIT1;

 P1SEL2 &=~BIT1;

  P1REN |=BIT1;

 P1OUT |=BIT1;

 P1DIR &=~BIT1;

 P1IES |=BIT1;

 P1IFG &=~BIT1;

 P1IE |=BIT1;

  _EINT();

  //P1.0 輸出時鐘 ACLK, P1.4 輸出時鐘 SMCLK

 P1SEL |=BIT0+BIT4;

 P1SEL2 &=~(BIT0+BIT4);

 P1DIR |=BIT0+BIT4;

  Blink();

 Buzz();

  for (;;)

 //主循環

 {

 LPM0; //

  Blink();

 }

  }

 #pragma

 vector=PORT1_VECTOR

  __interrupt

 void

 port_ISR( ) { Buzz();

 P1IFG&=~(BIT1);

 //清中斷標志

 LPM0_EXIT; }

 6. (提高)利用輸出的時鐘信號做中斷源,實現定時功能

 將任務 3 中P1.0 輸出的1.5KHz ACLK 時鐘信號,作為P1.5 的中斷申請信號,用導線將P1.5與P1.0 相連即可,在中斷函數中設置一個計數變量,計數中斷函數被執行的次數,中斷函數每被執行1500 次表示一秒時間到。利用該定時功能,將8 個發光二級管設計成一個秒表,顯示秒值,每秒改變一次8 個發光二級管的顯示。

 答:將P2.0~P2.7與LED1~LED8連接起來,通過設置基本時鐘控制寄存器將ACLK的時鐘源選為12KHz的VLOCK,然后再設置ACLK為8分頻,這樣就可以使P1.0輸出1.5KHz的ACLK信號。將P1.5與P1.0再連接起來,將P1.5設置為允許中斷,在中斷程序中加入計數因子,每隔1500次計數則可以視為1s,這時令8個LED燈變化一次。即可實現要求功能。

 程 序見Lab_6 項目,程序L6_LPM-2.c:

 #include "io430.h"

 #include "in430.h"

 unsigned char time=0;

 unsigned int i=0;

 int main( void )

 {

 //關閉看門狗

 WDTCTL = WDTPW + WDTHOLD;

  //設置端口P1.0輸出1.5KHzACLK時鐘信號

 P1SEL|=BIT0;

 P1SEL2&=~BIT0;

 P1DIR|=BIT0;

 BCSCTL3&=~LFXT1S0;

 BCSCTL3|=LFXT1S1;

 BCSCTL1&=~DIVA1;

 BCSCTL1|=DIVA0;

  //設置P2.0~P2.7為輸出狀態 P2SEL&=0;

 P2SEL2&=0;

 P2DIR|=0Xff;

 P2OUT|=0Xff; //設置端口P1.5允許中斷

 P1SEL&=~BIT5;

 P1SEL2&=~BIT5;

 P1REN|=BIT5;

 P1OUT&=~BIT5;

 P1DIR&=~BIT5;

 P1IES&=~BIT5;

 P1IFG&=~BIT5;

 P1IE|=BIT5;

 _EINT();

  while(1){

 if (i>=1500) {

 time+=1;

  i=0;}

 P2OUT=~time;

 //LED燈顯示輸出秒表的值

 }

 }

 #pragma

 vector=PORT1_VECTOR

 __interrupt

 void

 port_ISR(){ i++;

 P1IFG&=~(BIT5);

 //清中斷標志

 }

 思考:如果要每隔5 秒蜂鳴器響一聲,如何在任務6 的基礎上編程實現? 答:將P1.7與蜂鳴器相連,然后在中斷程序在加入一個計時因子來控制蜂鳴器。

 接線圖如下:

  程 序見Lab_6 項目,程序L6_LPM-3.c:

 #include "io430.h"

 #include "in430.h"

 unsigned char time=0;

 unsigned int i=0;

 void delay();

 int main( void )

 {

  WDTCTL = WDTPW + WDTHOLD;

 //關閉看門狗

  //設置端口 P1.0 輸出 1.5KHzACLK 時鐘信號 P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0; BCSCTL3&=~LFXT1S0; // LFXT1 = VLO 低頻時鐘選擇為 VLO ACLK 選為 VLO BCSCTL3 |= LFXT1S_2;

 BCSCTL1&=~DIVA1;

 BCSCTL1|=DIVA0; //設置 P2.0~P2.7 為輸出狀態 P2SEL&=~0;

 P2SEL2&=~0;

 P2DIR|=0Xff;

 P2OUT|=0Xff;

 //設置 P1.7 為輸出狀態

 P1SEL&=~BIT7;

 P1SEL2&=~BIT7;

 P1OUT|=BIT7;

 P1DIR|=BIT7;

  //設置端口 P1.5 允許中斷

 P1SEL&=~BIT5;

 P1SEL2&=~BIT5;

 P1REN|=BIT5;

 P1OUT&=~BIT5;

 P1DIR&=~BIT5;

 P1IES&=~BIT5;

 P1IFG&=~BIT6;

 P1IE|=BIT5; _EINT();

  while(1) {

 if (i>=1500)

 {

 time+=1;

 if((time%5)==0)

 P1OUT&=~BIT7;

 delay();

 P1OUT|=BIT7;

 i=0; }

 P2OUT=~time;

 //LED 燈顯示輸出秒表的值

 }

 }

 void delay()

 //延時函數

 {

  unsigned int j;

  for (j=0;j<0xffff;j++);

  }

  #pragma

 vector=PORT1_VECTOR

 __interrupt

 void

 port_ISR() {

 i++; P1IFG&=~(BIT5); //清中斷標志

 }

 覺得實驗 5、6 內容很多,學到了很多知識;實驗過程中遇到了很多問題重溫了課本和課件后解決了一些難題,加深了對課本上抽象的內容的理解,比如說實驗前對于時鐘,我的理解一直很模糊,似是而非,經過實驗,發現其實它不過是三個寄存器,三個時鐘信號,四個時鐘源之間的問題,雖然過程比較繁瑣,脈絡卻是清晰的;而且關于中斷,我也有了進一步的理解,特別是最后幾個選作實驗和必做實驗是對這兩節知識的綜合應用,難度有點大,但是寫出來之后特別是程序問題解決達到實驗效果后還是很有成就感的。

推薦訪問: 實驗 基礎 報告

【計硬基礎實驗報告3】相關推薦

工作總結最新推薦

NEW
  • 同志們:今天這個大會,是市委全面落實黨要管黨、從嚴治黨要求的一項重大舉措,也是對縣市區委書記履行基層黨建工作第一責任人情況的一次集中檢閱,同時是對全市基層黨建工作的一次再部署、再落實的會議。前面,**

  • ***年,我認真履行領班子、帶隊伍、抓黨員、保穩定的基層黨建工作思路,以學習貫徹習近平新時代中國特色社會主義思想和黨的十九大歷次全會精神為主線,以市局基層黨建工作考核細則為落腳點,落實全面從嚴治黨主體

  • 根據會議安排,現將2022年履行抓基層黨建工作職責情況報告如下:一、履職工作特色和亮點1 突出政治建設,著力在思想認識上提高。牢固樹立抓黨建就是抓政績的理念,以“黨建工作抓引領、社區治理求突破,為民服

  • 2022年以來,在**黨委的正確領導下,堅持以習近平新時代中國特色社會主義思想為指導,深入學習宣傳貫徹黨的二十大精神,以黨建工作為統領,扎實開展夯實“三個基本”活動,以“四化四力”行動為抓手,聚力創建

  • 各位領導,同志們:根據會議安排,現就2022年度抓基層黨建工作情況匯報如下:一、主要做法及成效(一)強化政治引領。一是不斷強化理論武裝。堅持通過黨組會、中心組學習會和“三會一課”,第一時間、第一議題學

  • 2022年度抓基層黨建工作述職報告按照黨委工作部署,現將本人2022年度抓基層黨建工作情況報告如下:一、2022年度抓基層黨建工作情況(一)旗幟鮮明講政治將旗幟鮮明講政治放在全局發展首要位置,積極開展

  • 2022年,是我在數計系黨總支書記這個新崗位上度過的第一個完整的工作年度。回首一年來在校黨委的正確領導下,與數計系領導班子和全體師生共同走過的日子,艱辛歷歷在目,收獲溫潤心田。作為黨總支書記,我始終牢

  • 按照考核要求,現將本人一年來,作為統戰部長履行職責、廉潔自律等方面情況報告如下:一、著眼增強政治素質,不斷深化理論學習堅持把旗幟鮮明講政治作為履職從政的第一位要求,帶領統戰系統干部堅決擁護“兩個確立”

  • **年,緊緊圍繞黨工委、管委會的決策部署,全體人員團結協作、凝心聚力,緊扣黨工委“**”基本工作思路,全力開拓進取,認真履職盡責,圓滿完成各項工作任務。一、個人思想政治狀況檸檬文苑www bgzjy

  • 按照縣委關于開展抓基層黨建述職評議會議的有關要求,經請示縣委組織部同意,今天,我們在此召開2022年度基層黨組織書記抓基層黨建述職評議會議。1 首先,請**黨委書記,**同志述職。**黨委能夠主動研究