標(biāo)題:
MSP430單片機電源開關(guān)休眠和喚醒 程序
[打印本頁]
作者:
51hei單片
時間:
2016-3-14 19:35
標(biāo)題:
MSP430單片機電源開關(guān)休眠和喚醒 程序
本程序是《MSP430系列單片機系統(tǒng)工程設(shè)計與實踐》書里面的源碼,(包含工程文件 ))完整例程下載:
http://www.torrancerestoration.com/bbs/dpj-46245-1.html
關(guān)于本程序的詳細解說大家可以下載電子書點擊上圖即可
電源開關(guān)休眠和喚醒:
#include "msp430x42x.h"
char TimeCount=0; //閃爍計時
char BT_IntervalFlag; //定時中斷全局變量標(biāo)志
void main( void )
{
DTCTL=WDTPW+WDTHOLD; //停止看門狗
FLL_CTL0|=XCAP18PF; //配置晶振負(fù)載電容
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR |= BIT0+BIT1+BIT2+BIT3; //懸空不用的IO口要置為輸出
P1OUT = 0; //否則不確定電平會造成IO耗電
P2OUT = 0;
BTCTL = BT_ADLY_125; //BasicTimer時鐘選為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++; //計數(shù)
if(TimeCount>=4) TimeCount=0; //產(chǎn)生0~3計數(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)機
}
}
}
#pragma vector = BASICTIMER_VECTOR // BasicTimer定時器中斷
__interrupt void BT_ISR(void) // 聲明一個中斷服務(wù)程序,名為BT_ISR()
{
BT_IntervalFlag=1;
__low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
}
#pragma vector = PORT1_VECTOR //P1口中斷源
__interrupt void P1_ISR(void) //聲明一個中斷服務(wù)程序,名為P1_ISR()
{
P1IFG=0;
__low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
}
復(fù)制代碼
電源開關(guān)復(fù)位:
#include "msp430x42x.h"
char TimeCount=0; //閃爍計時
__no_init char PWR_Flag; //電源標(biāo)志
void main( void )
{
WDTCTL=WDTPW+WDTHOLD; //停止看門狗
FLL_CTL0|=XCAP18PF; //配置晶振負(fù)載電容
P1DIR |= BIT0+BIT1+BIT2+BIT3+BIT4;
P2DIR |= BIT0+BIT1+BIT2+BIT3; //懸空不用的IO口要置為輸出
P1OUT = 0; //否則不確定電平會造成IO耗電
P2OUT = 0;
BTCTL = BT_ADLY_125; //BasicTimer時鐘選為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時關(guān)機
//--------------電源標(biāo)志為1時才執(zhí)行主循環(huán)--------------------------
while(1) // 主循環(huán)
{
LPM3; //休眠,僅留ACLK,以下代碼將每1/8秒執(zhí)行一次。
TimeCount++; //計數(shù)
if(TimeCount>=4) TimeCount=0; //產(chǎn)生0~3計數(shù)(0.5秒)
if(TimeCount==0) P2OUT |= BIT0; //亮125ms
else P2OUT &=~BIT0; //滅375ms
}
}
#pragma vector = BASICTIMER_VECTOR // BasicTimer定時器中斷
__interrupt void BT_ISR(void) // 聲明一個中斷服務(wù)程序,名為BT_ISR()
{
__low_power_mode_off_on_exit(); //退出中斷時喚醒CPU。
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1