|
本程序是《MSP430系列單片機(jī)系統(tǒng)工程設(shè)計(jì)與實(shí)踐》書(shū)里面的源碼,(包含工程文件 ))完整例程下載:http://www.torrancerestoration.com/bbs/dpj-46245-1.html

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