找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MSP430单片机定时器TA计数 程序

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

  1. #include <msp430x42x.h>

  2. /********************************************************************
  3. * 名    称:Divider_SetDivFactor
  4. * 功    能:设置分频系数
  5. * 入口参数:Factor:                分频系数        (2~65535)
  6. * 出口参数:无
  7. ********************************************************************/
  8. void Divider_SetDivFactor(unsigned int Factor) //设置分频系数
  9. {
  10.   TACCR0=Factor-1;                      // 分频系数=计数器溢出周期
  11.   TACCR2=Factor/2;                      // 占空比=50%
  12. }

  13. void main( void )
  14. {
  15.    WDTCTL = WDTPW + WDTHOLD;            // 停止看门狗
  16.    FLL_CTL0 |= XCAP18PF;                     // 配置晶振负载电容
  17.    P1DIR &=~BIT5;                             // P1.5(TACLK)作为输入引脚
  18.    P1SEL |= BIT5;                             // 允许其第二功能,作为TACLK输入
  19.    P2DIR |= BIT0;                       // P2.0作为输出
  20.    P2SEL |= BIT0;                       // 允许P2.0第二功能,作为TA2输出
  21.    TACTL = TASSEL_0 + MC_1 ;            // TA外部计数,增计数模式
  22.    TACCTL2 = OUTMOD_7;                  // TA2作为输出,模式7 (PWM模式)
  23.    Divider_SetDivFactor(100);            // 100分频  
  24.    while(1)
  25.    {
  26.       //CPU可以继续执行其他任务   
  27.    }
  28. }
复制代码



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

使用道具 举报

沙发
ID:108615 发表于 2016-3-14 18:57 | 只看该作者
  1. #include <msp430x42x.h>
  2. #include "LCD_Display.h"
  3. unsigned long int PhotonCnt;              // 光子计数结果存放变量
  4. unsigned int TA_OverflowCnt;              // TA溢出次数存放变量
  5. unsigned int CntTime;
  6. void main( void )
  7. {
  8.    WDTCTL = WDTPW + WDTHOLD;            // 停止看门狗
  9.    FLL_CTL0 |= XCAP18PF;                     // 配置晶振负载电容
  10.    P1DIR &=~BIT5;                             // P1.5(TACLK)作为输入引脚
  11.    P1SEL |= BIT5;                             // 允许其第二功能,作为TACLK输入
  12.    BTCTL = BTDIV+BT_fCLK2_DIV128;            // BasicTimer 设为1秒1次中断
  13.    IE2 |= BTIE;                                       // 允许BasicTimer中断
  14.    _EINT();                                           // 允许总中断
  15.    LCD_Init();                                        // LCD初始化
  16.    
  17.    while(1)
  18.    {
  19.      TACTL = TASSEL_0 + MC_2 + TAIE + TACLR; // TA清零并开始计数
  20.      TA_OverflowCnt=0;                       // 溢出次数清零
  21.      CntTime=0;                              // 计时清零
  22.      while(1)
  23.      {
  24.        PhotonCnt = TA_OverflowCnt*65536 + TAR; //计算累计光子个数
  25.        if(PhotonCnt>100000) break;             //直到100000个为止
  26.      }
  27.      LCD_DisplayNumber(CntTime);               //显示计满所需时间
  28.    }
  29. }

  30. #pragma vector = BASICTIMER_VECTOR
  31. __interrupt void BT_ISR(void)             // 1秒一次中断(由BasicTimer所产生)
  32. {
  33.   CntTime++;
  34. }


  35. #pragma vector=TIMERA1_VECTOR             //为测量大于65536Hz频率,计数溢出中断
  36. __interrupt void TA_ISR(void)
  37. {
  38.   switch( TAIV )
  39.   {
  40.     case  2:   break;
  41.     case  4:   break;                          
  42.     case 10:  TA_OverflowCnt++;           //TA每次溢出,溢出次数变量+1
  43.                 break;
  44.   }
  45. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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