找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4583|回复: 0
打印 上一主题 下一主题
收起左侧

MSP430单片机BasicTimer定时器通用程序库

[复制链接]
跳转到指定楼层
楼主
ID:108615 发表于 2016-3-14 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本程序是《MSP430系列单片机系统工程设计与实践》书里面的源码,(包含工程文件 (例3.1.6))完整例程下载:http://www.51hei.com/bbs/dpj-46245-1.html


关于本程序的详细解说大家可以点击上图下载电子书

  1. /*
  2.                
  3.                MSP430F4XX系列BasicTimer定时器通用程序库


  4.   说明:该程序库包含了BasiTimer(基础定时器)常用的功能,如设置溢出频率、
  5.         休眠延时等,可以作为各种程序的底层驱动使用。
  6.         要使用该库函数,需要将本文件(BasiTimer.c)添加进工程,并在
  7.         需要调用显示函数的文件开头处包含"BasiTimer.h"


  8.   (C)西安电子科技大学 测控技术与仪器教研中心 编写:谢楷 2008/02/02
  9.   
  10. */
  11. //
  12. //
  13. //                  MSP430F4XX
  14. //               +---------------+         
  15. //               |               |
  16. //               |           XOUT|-----
  17. //               |               |      32.768KHz Watch Crystal
  18. //               |            XIN|-----
  19. //               |               |
  20. //               +---------------+

  21. #include "msp430x42x.h"    /*单片机寄存器头文件*/
  22. char  BT_Flag=0;
  23. /****************************************************************************
  24. * 名    称:BT_Init()
  25. * 功    能:对BasicTimer进行初始化设置
  26. * 入口参数:Div_Sec: 定时器每秒产生中断次数。
  27. * 出口参数:无
  28. * 说    明: 如需使用后面的函数,在主循环之前必须先调用该初始化函数
  29. ****************************************************************************/
  30. char  BT_Init(int Div_Sec)
  31. {
  32.   switch(Div_Sec)
  33.   {
  34.      case 20: BTCTL = BTDIV+BT_fCLK2_DIV256;break; // 2s BT Int
  35.      case 1:  BTCTL = BTDIV+BT_fCLK2_DIV128;break; // 1s BT Int
  36.      case 2:  BTCTL = BTDIV+BT_fCLK2_DIV64;break;  //  1/2s BT Int  
  37.      case 4:  BTCTL = BTDIV+BT_fCLK2_DIV32;break;  //  1/4s BT Int      
  38.      case 8:  BTCTL = BTDIV+BT_fCLK2_DIV16;break;  //  1/8s BT Int  
  39.      case 16: BTCTL = BTDIV+BT_fCLK2_DIV8;break;   //  1/16s BT Int  
  40.      case 32: BTCTL = BTDIV+BT_fCLK2_DIV4;break;   //  1/32s BT Int  
  41.      case 64: BTCTL = BTDIV+BT_fCLK2_DIV2;break;   //  1/64s BT Int
  42.      case 128:BTCTL = BT_fCLK2_DIV256;break;       //  1/128s BT Int
  43.      case 256:BTCTL = BT_fCLK2_DIV128;break;       //  1/256s BT Int
  44.      case 512:BTCTL = BT_fCLK2_DIV64;break;        //  1/512s BT Int
  45.      case 1024:BTCTL = BT_fCLK2_DIV32;break;       //  1/1024s BT Int
  46.      case 2048:BTCTL = BT_fCLK2_DIV16;break;       //  1/2048s BT Int
  47.      case 4096:BTCTL = BT_fCLK2_DIV8;break;        //  1/4096s BT Int
  48.      case 8192:BTCTL = BT_fCLK2_DIV4;break;        //  1/8192s BT Int  
  49.      case 16384:BTCTL =BT_fCLK2_DIV2;break;        // 1/16384s BT Int
  50.   default : return(0);
  51.   }
  52.   IE2 |= BTIE;                      // Enable Basic Timer interrupt
  53.   _EINT();
  54.   return(1);
  55. }
  56. /****************************************************************************
  57. * 名    称:Cpu_SleepDelay()
  58. * 功    能:靠CPU休眠实现延迟。
  59. * 入口参数:BT_Time: BasicTimer中断次数
  60. * 出口参数:无
  61. * 说    明: 需要设置BasicTimer定时器,并开启中断。该延迟函数极省电
  62. ****************************************************************************/
  63. void Cpu_SleepDelay(int BT_Time)
  64. {
  65.   for(;BT_Time>0;BT_Time--)
  66.   {
  67.    BT_Flag=0;
  68.    while(BT_Flag==0) LPM3;  //只有BT中断才能唤醒CPU
  69.    BT_Flag=0;   
  70.   }
  71. }
  72. /****************************************************************************
  73. * 名    称:Cpu_SleepWaitBT()
  74. * 功    能:CPU休眠,等待BT中断唤醒。
  75. * 入口参数:无
  76. * 出口参数:无
  77. * 说    明: 需要设置BasicTimer定时器,并开启中断。该函数极省电
  78. ****************************************************************************/
  79. void Cpu_SleepWaitBT()
  80. {
  81.    BT_Flag=0;
  82.    while(BT_Flag==0) LPM3;  //只有BT中断才能唤醒CPU
  83.    BT_Flag=0;   
  84. }
  85. /****************************************************************************
  86. * 名    称:BT_ISR()
  87. * 功    能:定时唤醒CPU。
  88. * 入口参数:无
  89. * 出口参数:无
  90. ****************************************************************************/
  91. #pragma vector = BASICTIMER_VECTOR
  92. __interrupt void BT_ISR(void)   // 1/Div_Sec 秒一次中断(由BasicTimer所产生)
  93. {
  94.   BT_Flag=1;
  95. /*
  96.    在这里写中断服务程序,如扫描键盘、实时钟走时等。
  97. */  
  98.    __low_power_mode_off_on_exit();       //唤醒CPU
  99. }
复制代码

main.c上面程序的调用方法:
  1. #include <msp430x42x.h>
  2. #include "BasicTimer.h"

  3. #define LED1_ON   P1OUT |=  BIT1
  4. #define LED1_OFF  P1OUT &=~ BIT1
  5. unsigned char LED1_Status=0;
  6. /********************************************************************
  7. * 名    称:LED1_SetStatus()
  8. * 功    能:设置LDE1的状态
  9. * 入口参数: 0:灭   1:亮   2:慢闪   3:快闪
  10. * 出口参数:无
  11. ********************************************************************/
  12. void LED1_SetStatus (unsigned char Status)
  13. {  
  14.    LED1_Status= Status;
  15. }
  16. /********************************************************************
  17. * 名    称:LED1_Process()
  18. * 功    能:LED1处理任务
  19. * 入口参数:Ticks:  该函数每秒被调用的次数。
  20. * 出口参数:无
  21. * 说    明: 该函数需要被周期性地调用。可放于主循环或定时中断内
  22. ********************************************************************/
  23. void LED1_Process (Ticks)
  24. {  
  25.   static unsigned int LED1_TimerS;
  26.   static unsigned int LED1_TimerF;
  27.   LED1_TimerS++; if(LED1_TimerS >= Ticks  ) LED1_TimerS=0;
  28.   LED1_TimerF++; if(LED1_TimerF >= Ticks/4) LED1_TimerF=0;
  29.   switch(LED1_Status)
  30.   {
  31.    case 0:  LED1_OFF; break;
  32.    case 1:  LED1_ON;  break;
  33.    case 2:  if(LED1_TimerS >= Ticks/2) LED1_ON;
  34.              else                            LED1_OFF;
  35.              break;
  36.    case 3:  if(LED1_TimerF >= Ticks/8) LED1_ON;
  37.              else                            LED1_OFF;
  38.              break;
  39.   }
  40. }


  41. void main( void )
  42. {
  43.    unsigned int Timer=0;
  44.    WDTCTL = WDTPW + WDTHOLD;                   // 停止看门狗
  45.    FLL_CTL0 |= XCAP18PF;                // 配置晶振负载电容
  46.    P1DIR |= BIT1 + BIT3 + BIT4;         // 三个LED所在IO口设为输出
  47.    P1OUT =0;                            // 全灭
  48.    BT_Init(16);                         // BasicTimer设为1/16秒中断一次
  49.    while(1)
  50.    {
  51.       Cpu_SleepWaitBT();        //休眠,等待BT唤醒,以下代码1/16秒执行一次
  52.       LED1_Process (16);        //LED1状态处理任务
  53.       Timer++;
  54.       if(Timer==80)  LED1_SetStatus(0);             //灭5秒
  55.       if(Timer==160) LED1_SetStatus(1);             //亮5秒
  56.       if(Timer==240) LED1_SetStatus(2);             //慢闪5秒
  57.       if(Timer==320) {LED1_SetStatus(3); Timer=0;}  //快闪5秒
  58.    }
  59. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表