6735|0

6873

帖子

19

资源

纯净的硅(中级)

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秒
   }
}


回复
您需要登录后才可以回帖 登录 | 注册

最新文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表