This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

用430定时器A定时几个小时长的时间该怎么操作



用430定时器A定时几个小时长的时间该怎么操作

  • MSP430x149单片机定时器A有以下特点:

    (1)具有16位计数器,4种工作模式;

    (2)具有多种时钟源,可以灵活选择配置ACLK和SMCLK及外部时钟;

    (3)具有多个可配置输入端的捕获/比较寄存器;

    (4)支持多时序控制,多个比较/捕获功能,多种波形输出;

    (5)具有异步输入,输出锁存功能;

    (6)产生的定时脉冲或者PWM信号没有软件带来的误差;

    (7)能够捕获外部事件发生生的时间,锁定其发生是的高低电平;

    (8)具体完善的中断服务功能;

    (9)具有8种输出方式选择,3个可配置输出单元。

    2.TimerA的结构组成:

    (1)16位计数器,具有4种计数方式;

    (2)捕获和比较功能是完全相互独立的,即捕获功能时,比较单元不能用;比较功能时,捕获单元不能用;

    (3)用于产生用户所需要的输出信号。

    (4)结构如下图:

    计数模式:

    (1)增计数模式
    捕获/比较寄存器CCR0用作Timer_A增计数模式的周期寄存器,因为CCR0为16位寄存器,所以该模式适用于定时周期小于65 536的连续计数情况。计数器TAR可以增计数到CCR0的值,当计数值与CCR0的值相等(或定时器值大于CCR0的值)时,定时器复位并从0开始重新计数。

    这就是你需要的设置(2)连续计数模式
    在需要65 536个时钟周期的定时应用场合常用连续计数模式。定时器从当前值计数到0FFFFH后,又从0开始重新计数

    (3)增/减计数模式
    需要对称波形的情况经常可以使用增/减计数模式,该模式下,定时器先增计数到CCR0的值,然后反向减计数到0。计数周期仍由CCR0定义,它是CCR0计数器数值的2倍。

    程序实现:

    char TAPwmInit(char Clk,char Div,char Mode1,char Mode2)

    {

       TACTL=0;                    //清除以前的定时器的设置

       TACTL|=MC_1;               //定时器设置为增计数模式

       switch(CLK)

        {

          case A: case a: TACTL|=TASSEL_1;break;      //ACLK

          case S: case s: TACTL|=TASSEL_2;break;      //SMCLK

          case E:      TACTL|=TASSEL_0;break;      //外部输入TACLK

          case e:      TACTL|=TASSEL_3;break;      //外部输入TACLK取反

          default:   return(0);

        } 

    switch(Div)                 //选择分频系数

    {

      case 1:   TACTL|=ID_0; break;   //1

      case 2:   TACTL|=ID_1; break;   //2

      case 4:   TACTL|=ID_2; break;   //4

      case 8:   TACTL|=ID_3; break;   //8

      default :  return(0);           //参数有误

    switch(Mode1)

    {

      case ‘P’:case ‘p’:                 //设置为高电平模式

           TACCTL1|=OUTMOD_7;      //高电平PWM波输出

           P1SEL|=BIT2;               //选择通道A1(P1.2口)

           P1DIR|=BIT2;              //P1.2口为输出方向

           break;

      case ‘N’:case ‘n’:                 

           TACCTL1|=OUTMOD_7;      //低电平输出

           P1SEL|=BIT2;              

           P1DIR|=BIT2;             

           break;

      case ‘0’:case 0:              //p1.2口为普通IO口

          P1SEL&=~BIT2;       

          Break;

    default :  return(0);       //参数有误

    }

    switch(Mode2)

    {

      case ‘P’:case ‘p’:                 //设置为高电平模式

           TACCTL1|=OUTMOD_3;      //高电平PWM波输出

           P1SEL|=BIT3;               //选择通道A2(P1.3口)

           P1DIR|=BIT3;              //P1.3口为输出方向

           break;

      case ‘N’:case ‘n’:                

           TACCTL1|=OUTMOD_3;      //低电平输出

           P1SEL|=BIT3;              

           P1DIR|=BIT3;             

           break;

      case ‘0’:case 0:              //p1.3口为普通IO口

          P1SEL&=~BIT3;       

          Break;

    default :  return(0);       //参数有误

    }

    }

     

    //工作于增模式时,TA计数到TACCR0,设CCR0就完成了周期的设置。

    void TAPwmSetPeriod(unsigned int Period)

    {

        TACCR0 = Period;

    }

     

    //设置占空比:设置TA的PWM输出的有效电平的时间。

    void TAPwmSetDuty(char Channel,unsigned int Duty)

    {

        switch(Channel)

        {

            case 1: TACCR1=Duty; break;

            case 2: TACCR2=Duty; break;   

        }

    }

     

    void TAPwmSetPermill(char Channel,unsigned int Percent)

    {

        unsigned long int Period;

        unsigned int Duty;

        Period = TACCR0;

        Duty = Period * Percent / 5000;

        TAPwmSetDuty(Channel,Duty);

    }


  • 来定时几个小时,需要用个变量配合定时器来实现

  • 选择32768时钟,连续计数模式,CCR0设置为32768(一秒钟),

    然后设个静态变量,在中断里加一(每次中断加一),

    这样就是一秒,60秒一分钟,3600秒一小时,

    多设几个静态变量分别存储"小时","分钟","秒值"

    剩下的不用我说了吧