|
MSP430单片机BasicTimer定时器通用程序库
[复制链接]
关于本程序的详细解说大家可以点击上图下载电子书
/*
MSP430F4XX系列BasicTimer定时器通用程序库
说明:该程序库包含了BasiTimer(基础定时器)常用的功能,如设置溢出频率、
休眠延时等,可以作为各种程序的底层驱动使用。
要使用该库函数,需要将本文件(BasiTimer.c)添加进工程,并在
需要调用显示函数的文件开头处包含"BasiTimer.h"
(C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/02
*/
//
//
// MSP430F4XX
// +---------------+
// | |
// | XOUT|-----
// | | 32.768KHz Watch Crystal
// | XIN|-----
// | |
// +---------------+
#include "msp430x42x.h" /*单片机寄存器头文件*/
char BT_Flag=0;
/****************************************************************************
* 名 称:BT_Init()
* 功 能:对BasicTimer进行初始化设置
* 入口参数:Div_Sec: 定时器每秒产生中断次数。
* 出口参数:无
* 说 明: 如需使用后面的函数,在主循环之前必须先调用该初始化函数
****************************************************************************/
char BT_Init(int Div_Sec)
{
switch(Div_Sec)
{
case 20: BTCTL = BTDIV+BT_fCLK2_DIV256;break; // 2s BT Int
case 1: BTCTL = BTDIV+BT_fCLK2_DIV128;break; // 1s BT Int
case 2: BTCTL = BTDIV+BT_fCLK2_DIV64;break; // 1/2s BT Int
case 4: BTCTL = BTDIV+BT_fCLK2_DIV32;break; // 1/4s BT Int
case 8: BTCTL = BTDIV+BT_fCLK2_DIV16;break; // 1/8s BT Int
case 16: BTCTL = BTDIV+BT_fCLK2_DIV8;break; // 1/16s BT Int
case 32: BTCTL = BTDIV+BT_fCLK2_DIV4;break; // 1/32s BT Int
case 64: BTCTL = BTDIV+BT_fCLK2_DIV2;break; // 1/64s BT Int
case 128:BTCTL = BT_fCLK2_DIV256;break; // 1/128s BT Int
case 256:BTCTL = BT_fCLK2_DIV128;break; // 1/256s BT Int
case 512:BTCTL = BT_fCLK2_DIV64;break; // 1/512s BT Int
case 1024:BTCTL = BT_fCLK2_DIV32;break; // 1/1024s BT Int
case 2048:BTCTL = BT_fCLK2_DIV16;break; // 1/2048s BT Int
case 4096:BTCTL = BT_fCLK2_DIV8;break; // 1/4096s BT Int
case 8192:BTCTL = BT_fCLK2_DIV4;break; // 1/8192s BT Int
case 16384:BTCTL =BT_fCLK2_DIV2;break; // 1/16384s BT Int
default : return(0);
}
IE2 |= BTIE; // Enable Basic Timer interrupt
_EINT();
return(1);
}
/****************************************************************************
* 名 称:Cpu_SleepDelay()
* 功 能:靠CPU休眠实现延迟。
* 入口参数:BT_Time: BasicTimer中断次数
* 出口参数:无
* 说 明: 需要设置BasicTimer定时器,并开启中断。该延迟函数极省电
****************************************************************************/
void Cpu_SleepDelay(int BT_Time)
{
for(;BT_Time>0;BT_Time--)
{
BT_Flag=0;
while(BT_Flag==0) LPM3; //只有BT中断才能唤醒CPU
BT_Flag=0;
}
}
/****************************************************************************
* 名 称:Cpu_SleepWaitBT()
* 功 能:CPU休眠,等待BT中断唤醒。
* 入口参数:无
* 出口参数:无
* 说 明: 需要设置BasicTimer定时器,并开启中断。该函数极省电
****************************************************************************/
void Cpu_SleepWaitBT()
{
BT_Flag=0;
while(BT_Flag==0) LPM3; //只有BT中断才能唤醒CPU
BT_Flag=0;
}
/****************************************************************************
* 名 称:BT_ISR()
* 功 能:定时唤醒CPU。
* 入口参数:无
* 出口参数:无
****************************************************************************/
#pragma vector = BASICTIMER_VECTOR
__interrupt void BT_ISR(void) // 1/Div_Sec 秒一次中断(由BasicTimer所产生)
{
BT_Flag=1;
/*
在这里写中断服务程序,如扫描键盘、实时钟走时等。
*/
__low_power_mode_off_on_exit(); //唤醒CPU
}
复制代码
main.c上面程序的调用方法:
#include
#include "BasicTimer.h"
#define LED1_ON P1OUT |= BIT1
#define LED1_OFF P1OUT &=~ BIT1
unsigned char LED1_Status=0;
/********************************************************************
* 名 称:LED1_SetStatus()
* 功 能:设置LDE1的状态
* 入口参数: 0:灭 1:亮 2:慢闪 3:快闪
* 出口参数:无
********************************************************************/
void LED1_SetStatus (unsigned char Status)
{
LED1_Status= Status;
}
/********************************************************************
* 名 称:LED1_Process()
* 功 能:LED1处理任务
* 入口参数:Ticks: 该函数每秒被调用的次数。
* 出口参数:无
* 说 明: 该函数需要被周期性地调用。可放于主循环或定时中断内
********************************************************************/
void LED1_Process (Ticks)
{
static unsigned int LED1_TimerS;
static unsigned int LED1_TimerF;
LED1_TimerS++; if(LED1_TimerS >= Ticks ) LED1_TimerS=0;
LED1_TimerF++; if(LED1_TimerF >= Ticks/4) LED1_TimerF=0;
switch(LED1_Status)
{
case 0: LED1_OFF; break;
case 1: LED1_ON; break;
case 2: if(LED1_TimerS >= Ticks/2) LED1_ON;
else LED1_OFF;
break;
case 3: if(LED1_TimerF >= Ticks/8) LED1_ON;
else LED1_OFF;
break;
}
}
void main( void )
{
unsigned int Timer=0;
WDTCTL = WDTPW + WDTHOLD; // 停止看门狗
FLL_CTL0 |= XCAP18PF; // 配置晶振负载电容
P1DIR |= BIT1 + BIT3 + BIT4; // 三个LED所在IO口设为输出
P1OUT =0; // 全灭
BT_Init(16); // BasicTimer设为1/16秒中断一次
while(1)
{
Cpu_SleepWaitBT(); //休眠,等待BT唤醒,以下代码1/16秒执行一次
LED1_Process (16); //LED1状态处理任务
Timer++;
if(Timer==80) LED1_SetStatus(0); //灭5秒
if(Timer==160) LED1_SetStatus(1); //亮5秒
if(Timer==240) LED1_SetStatus(2); //慢闪5秒
if(Timer==320) {LED1_SetStatus(3); Timer=0;} //快闪5秒
}
}
|
|