?? msp430f1121設(shè)計電子產(chǎn)品.txt
字號:
MSP430單片機:用MSP430F1121設(shè)計電子產(chǎn)品的心得,與大家探討 [qiang] [99次] 01-9-10 上午 10:40:23
MSP430系列功耗很低,用來設(shè)計電子產(chǎn)品時可以不設(shè)電源開關(guān),以下是我設(shè)計的電子產(chǎn)品的
思路:
1.用兩節(jié)電池供電,接上電池后F1121復(fù)位,設(shè)置好端口立即進入低功耗狀態(tài)。
2.將on/off按鈕接在 P2.0,利用端口的中斷使電路進入工作狀態(tài)。
3.當(dāng)按著on/off超過幾秒后電路進入低功耗狀態(tài)。
4.利用WDT,當(dāng)一段時間沒有任何操作后電路進入低功耗狀態(tài)。
程序如下:
#include "msp430x11x1.h"
#define uint unsigned int
#define uchar unsigned char
unsigned short *sptr; // Stack pointer
extern void getsptr (void); // Get Stack Pointer
uchar interrupt_flag;
uint times;
interrupt[PORT2_VECTOR] void P2_ISR(void);
interrupt[WDT_VECTOR] void watchdog_timer(void);
void delay(uchar k)
{
uchar i;
for(i=0;i<k;i++);
}
void beep(void)
{
P1OUT |= BIT3; // beep on
delay(120);
P1OUT &= ~BIT3; // beep off
}
void reset_port(void)
{
P1OUT &= ~BIT0;
P1OUT &= ~BIT1;
P1OUT &= ~BIT2;
P1OUT &= ~BIT3;
P2OUT &= ~BIT1;
P2OUT &= ~BIT2;
}
void sleep(void)
{
P2IES |= BIT0; //P2.0 interrupt hi->low edge
P2IFG &= ~BIT0; //P2.0 IFG cleared
P2IE |= BIT0; //P2.0 interrupt enabled
getsptr(); // Get the current stack pointer - 2
sptr-=1;
IE1 &= ~WDTIE; // disable WDT interrupt
reset_port();
LPM4;
}
void main(void)
{
uchar i;
WDTCTL = WDTPW+WDTTMSEL+WDTCNTCL+WDTIS1; // Set Watchdog Timer interval to 0.5ms
P1DIR |= BIT0;
P1DIR |= BIT1;
P1DIR |= BIT2;
P1DIR |= BIT3;
P2DIR &= ~BIT0; //設(shè)為on/off按鈕輸入
P2DIR |= BIT1;
P2DIR |= BIT2;
reset_port();
P2IES |= BIT0; //P2.0 interrupt hi->low edge
P2IFG &= ~BIT0; //P2.0 IFG cleared
P2IE |= BIT0; //P2.0 interrupt enabled
delay(250);
_EINT(); // Enable Interrupts
sleep(); //進入低功耗
beep(); //提示
times=0;
IE1 |= WDTIE; // Enable WDT interrupt
interrupt_flag=0;
if((P2IN&BIT0) != BIT0 ) //當(dāng)on/off按鈕按著超過5秒后進入低功耗
{
times=0;
while((P2IN&BIT0) != BIT0 )
{
if( times>6000 ) //5s
{
beep();
sleep();
break;
}
}
}
while(1)
{
IE1 |= WDTIE; // Enable WDT interrupt
interrupt_flag=0;
.......
if( times > 12000 )
{
beep();
sleep();
}
}
}
interrupt[PORT2_VECTOR] void P2_ISR(void)
{
// Exit LPM4, disable P2.0 interrupt
P2IE &= ~BIT0; //P2.0 interrupt disabled
P2IFG &= ~BIT0; //P2.0 IFG cleared
interrupt_flag=1;
*sptr &= ~(SCG1+SCG0+OSCOFF+CPUOFF); // Clear LPM4 from the stacked status
register
beep();
}
interrupt[WDT_VECTOR] void watchdog_timer(void)
{
times++;
}
程序getsptr.s43摘自安裝目錄下FET_examples的fet_9目錄
NAME getsptr
PUBLIC getsptr
EXTERN sptr ;Stack pointer variable declared in C file
RSEG CODE
getsptr:
mov SP,&sptr ;Copy the current stack pointer.
ret
END
希望qiang能談?wù)凜430的使用心得,可以嗎? [龍嘯九天] [14次] 01-9-10 下午 10:19:34
C430與C51的一點區(qū)別 [qiang] [38次] 01-9-11 上午 09:12:47
C430與C51語法上基本一樣,但是編程有些地方要注意,以下是我遇到的:
1.如果要判斷P2.0是否為1,C51可以寫為:if( P2&BIT0 == BIT0 ) ,但是在C430會得不到
結(jié)果,要寫為:if( (P2&BIT0) == BIT0 ) 才對。
2.在C51中如果要讓程序等待可以直接用while(1),但是寫C430程序時我曾經(jīng)遇到while(1)
無效,后來發(fā)現(xiàn)是我沒設(shè)置WDT,加入WDTCTL = WDTPW+WDTHOLD,一切正常。
3.C51有bit flag等指令來定義位,而MSP430沒有相關(guān)指令,但是可以這樣實現(xiàn):
先定義一個變量 uchar flag,這樣就有8個位變量可以使用,
假設(shè)C51有這樣的程序:
bit rflag;
rflag = 0;
while(rflag==0); //等待
在C430里可以寫成:
uchar flag;
flag &= ~BIT1;
while( (flag&BIT1) != BIT1 );
效果一樣
由于設(shè)計的東西不多,很多地方還不懂,請大家賜教。
點擊這里回復(fù)這篇貼子>>
_____________________________________________________________________________
Copyright?,C51BBS論壇 2000-2001
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -