|
本程序是《MSP430系列單片機系統工程設計與實踐》書里面的源碼,(包含工程文件 ))完整例程下載:http://www.zg4o1577.cn/bbs/dpj-46245-1.html

關于本程序的詳細解說大家可以下載電子書點擊上圖即可
電源開關休眠和喚醒:
- #include "msp430x42x.h"
- char TimeCount=0; //閃爍計時
- char BT_IntervalFlag; //定時中斷全局變量標志
- void main( void )
- {
- DTCTL=WDTPW+WDTHOLD; //停止看門狗
- FLL_CTL0|=XCAP18PF; //配置晶振負載電容
- P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
- P2DIR |= BIT0+BIT1+BIT2+BIT3; //懸空不用的IO口要置為輸出
- P1OUT = 0; //否則不確定電平會造成IO耗電
- P2OUT = 0;
- BTCTL = BT_ADLY_125; //BasicTimer時鐘選為ACLK,設為125ms中斷一次
- IE2 |= BTIE; // 允許BasicTimer中斷
- P1IES |= BIT6; // P1.6下降沿觸發中斷
- P1IE |= BIT6; // 允許P1.6中斷
- _EINT(); // 總中斷允許
- while(1) // 主循環
- { BT_IntervalFlag=0;
- while(BT_IntervalFlag==0) LPM3;
- //休眠,僅留ACLK,僅能被被BasicTimer喚醒。以下代碼將每1/8秒執行一次。
- TimeCount++; //計數
- if(TimeCount>=4) TimeCount=0; //產生0~3計數(0.5秒)
- if(TimeCount==0) P2OUT |= BIT0; //亮125ms
- else P2OUT &=~BIT0; //滅375ms
- if((P1IN & BIT5)==0) //若KEY1被按下
- {
- P2OUT &=~ BIT0; //關閉LED
- P1IFG &=~ BIT5; //清除P1.5中斷標志
- LPM4; //關機
- }
- }
- }
- #pragma vector = BASICTIMER_VECTOR // BasicTimer定時器中斷
- __interrupt void BT_ISR(void) // 聲明一個中斷服務程序,名為BT_ISR()
- {
- BT_IntervalFlag=1;
- __low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
- }
- #pragma vector = PORT1_VECTOR //P1口中斷源
- __interrupt void P1_ISR(void) //聲明一個中斷服務程序,名為P1_ISR()
- {
- P1IFG=0;
- __low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
- }
復制代碼
電源開關復位:
- #include "msp430x42x.h"
- char TimeCount=0; //閃爍計時
- __no_init char PWR_Flag; //電源標志
- void main( void )
- {
- WDTCTL=WDTPW+WDTHOLD; //停止看門狗
- FLL_CTL0|=XCAP18PF; //配置晶振負載電容
- P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
- P2DIR |= BIT0+BIT1+BIT2+BIT3; //懸空不用的IO口要置為輸出
- P1OUT = 0; //否則不確定電平會造成IO耗電
- P2OUT = 0;
- BTCTL = BT_ADLY_125; //BasicTimer時鐘選為ACLK,設為125ms中斷一次
- IE2 |= BTIE; // 允許BasicTimer中斷
- _EINT(); // 總中斷允許
- if(PWR_Flag ==0) PWR_Flag=1; // 電源標志每次復位后取反
- else PWR_Flag=0;
- if(PWR_Flag ==0) LPM4; //電源標志為0時關機
- //--------------電源標志為1時才執行主循環--------------------------
- while(1) // 主循環
- {
- LPM3; //休眠,僅留ACLK,以下代碼將每1/8秒執行一次。
- TimeCount++; //計數
- if(TimeCount>=4) TimeCount=0; //產生0~3計數(0.5秒)
- if(TimeCount==0) P2OUT |= BIT0; //亮125ms
- else P2OUT &=~BIT0; //滅375ms
- }
- }
- #pragma vector = BASICTIMER_VECTOR // BasicTimer定時器中斷
- __interrupt void BT_ISR(void) // 聲明一個中斷服務程序,名為BT_ISR()
- {
- __low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
- }
復制代碼
|
|