//以下是使用增计数模式实现计数的,定时一秒
#include <msp430x22x4.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; // 停止看门狗程序
BCSCTL1 =CALBC1_1MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_1MHZ; //上面两句可设可不设,因为系统时钟选择的是ACLK,而不是DCO,只是为了提醒自己首先必须设置系统时钟,系统复位时默认的是DCO;
P1DIR|=BIT0;
P1OUT|=BIT0;
TACTL=TASSEL0+TACLR;
CCTL0=CCIE;
CCR0=32767;
TACTL|=MC0;
_EINT();
LPM0;
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=BIT0;
}
//以下是用连续计数模式来实现定时的,由于连续计数模式不受CCR0计数值得影响,因此须在中断处设置中断标志
#include <msp430x22x4.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; // 停止看门狗程序
BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ
DCOCTL =CALBC1_8MHZ;
P1DIR|=BIT0;
P1OUT|=BIT0;
TACTL=TASSEL0+TACLR; // 选择ACLK,并且清除定时初值
CCR0=32767; //定时一秒
TACTL=MC1; //设置为连续计数模式,并开启定时器
_EINT(); //允许全局中断
LPM0; //低功耗,仅仅CPUOFF
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=BIT0;
CCR0+=32767;
}
//以下是用看门狗定时器中断实现P1.0口每一秒两一次
#include <msp430x22x4.h>
void main()
{
WDTCTL=WDTPW+WDTHOLD; // 停止看门狗程序,此句最为重要
WDTCTL=WDTPW+WDTSSEL+WDTMSEL+WDTCNTCL;// 设置看门狗为定时器模式,且选择ACLK时钟,分频为1. 即定时一秒32768
BCSCTL1 =CALBC1_8MHZ; //设定DCO为1MHZ,可设可不设
DCOCTL =CALBC1_8MHZ;
P1DIR|=BIT0; //P1口输出高电平
P1OUT|=BIT0;
IE1=WDTIE; //允许看门狗中断
_EINT(); //全局中断
_BIS_SR(LPM3_bits);;//进入低功耗LPM3
}
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
P1OUT^=BIT0; //P1口取反
}
这几天将计数器之间的联系及区别,通过请教学长和看书,弄清楚了。
老师布置的任务控制一个LED灯的闪烁,已经通过不同的方式实现。 |