Randy 发表于 2012-7-18 09:19:49

【大赛原创经验贴】MSP430入门级程序:定时闪烁

刚学完51,还没来得及消化的自己,转身开始进军msp430。在起初的几天里,感觉msp的一切都是那么的苦涩难懂,与51有截然不同的感觉。在文字之中挣扎了两天,受到的打击不小。然后,拈来几个简单的程序,想开始学会自己点灯闪烁,就像学51的编程起点一样。于是,慢慢的看着程序啃代码,弄清每一条语句。此间,有些书上的知识与代码开始串在一起。才发现,最初几天的功夫,没有白费。

点灯闪烁固然简单,会做也说明不了自己达到了一定的高度,但作为一名初学者,能熟练“玩转”各种不同的定时,说明自己对msp430已然不再陌生。对于从51转身msp430的新手来说,个人认为,msp430定时器这一块,是它的特点,也是基础的部分,甚至可以说,是任何新手,在开始时,无法逃避的一个重点!

接下来是自己根据mspf149写的几个定时程序,在实验板上亲测均能通过。
(注:proteus仿真可能无法到达其效果,因为其中使用的是msp430f249,请注意其头文件与149的区别)

一、/*   定时:LFXT1CLK作为ALCK的时钟源,频率:32768HZ    */
#include<msp430x14x.h>
void main(void)
{   
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗

//TIMER_A相关设置
    CCTL0 = CCIE;                   //使能CCR0中断
    CCR0 = 2047;                  //设定周期0.5S               
    TACTL = TASSEL_1 + ID_3 + MC_1; //定时器A的时钟源选择ACLK,增计数模式
    P2DIR = 0x04;                   //设置P2口方向为输出

    _EINT();                        //使能全局中断                     
}

#pragma vector = TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
    P2OUT ^= 0xff;                  
}

二、/*    掌握XT2、DCO两种时钟源情况下SMCLK的定时    */
#include <msp430x14x.h>
void main()
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;


    //基础时钟方面的设置
BCSCTL1&=~XT2OFF;            //启动XT2
BCSCTL2=SELS+DIVS1+DIVS0;    //XT2CLK作为SMCLK的时钟,八分频


//TIMER_A各种寄存器设置
TACTL=TACLR+TASSEL1+ID1+ID0; //清除TAR,时钟源SMCLK,八分频
TACTL|=MC0;                  //增计数模式
CCTL0=CCIE;
CCR0=62500;   


/*特别注意:当XT2没有开启或没有选择XT2作为SMCLK的时钟,
SMCLK的默认时钟源为DCO:800KHZ,若定时0.5s,CCR0=50000; */   
P2DIR|=BIT7;
_EINT();
while(1);
}

//interruptvoid Timer_A(void)
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P2OUT^=BIT7;
}

三、关于看门狗的两种表达起定时效果
#include <msp430x14x.h>
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL =WDT_ADLY_1000;//即:WDTCTL=WDTPW+WDTTMSEL+WDTSSEL+WDTCNTCL;
IE1|=WDTIE;
P2DIR|=BIT0;
_EINT();

while(1);
}

#pragma vector=WDT_VECTOR
__interrupt void WDT()
{
P2OUT^=BIT0;
}


页: [1]
查看完整版本: 【大赛原创经验贴】MSP430入门级程序:定时闪烁