⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 soft_timer.c

📁 430单片机原代码 430单片机原代码 430单片机原代码
💻 C
字号:


#include <MSP430X14X.h>
#include "soft_timer.h"

unsigned int TB_num[10]={0,0,0,0,0,0,0,0,0,0};                                 //任务的记数寄存器
unsigned int TB_ID[10]={0,0,0,0,0,0,0,0,0,0};                                   //软件定时器ID标志
unsigned char TB_State[10]={0,0,0,0,0,0,0,0,0,0};                            //任务状态定时器
unsigned char TBnum=0;                                   //定时器总数
unsigned char io1=0,io2=0,io3=0,io4=0;
unsigned int TB_Time[10]={0,0,0,0,0,0,0,0,0,0};
////////////////////////////////////////////////////////////////////
//定时器中断程序
////////////////////////////////////////////////////////////////////
#pragma vector=TIMERB0_VECTOR 
__interrupt void TimerB_ISR(void)
{
    unsigned char i;   
    set_TMR();
    for(i=0;i<4;i++)                     //几个任务循环
    {
    TB_num[i]++;      
    }
     
}
////////////////////////////////////////////////////////////////////
//创造一个软件定时器
////////////////////////////////////////////////////////////////////
void TMR_Create(unsigned char num,unsigned long int time)
{
TB_ID[num]=1;
TB_Time[num]=time;
TBnum++;
}
////////////////////////////////////////////////////////////////////
//删除一软件定时器
////////////////////////////////////////////////////////////////////
void TMR_del(unsigned char num)
{
TB_ID[num]=0;
TB_Time[num]=0;
TBnum--;
}


////////////////////////////////////////////////////////////////////
//打开软件定时器NUM
////////////////////////////////////////////////////////////////////
void TMR_start(unsigned char num)
{
TB_State[num]|=Run;
}
////////////////////////////////////////////////////////////////////
//关闭软件定时器NUM
////////////////////////////////////////////////////////////////////
void TMR_stop(unsigned char num)
{
TB_State[num]&=~Run;
}
////////////////////////////////////////////////////////////////////
//软件定时器事件处理
////////////////////////////////////////////////////////////////////
void set_TMR(void) 
{
    unsigned char num;
    unsigned char State;
    unsigned int  time;   
    for(num=0;num<4;num++)                     //几个任务循环
    {
     if(TB_ID[num]!=0)                           //判断定时器num是否存在
       { 
        switch(num)
           {
             case 0:
                  {
                        
                    State=TB_State[num];       //判断定时器1是否运行              
                     if(State&Run) 
                       {
                        time=TB_num[num];
                        if(time==TB_Time[num]) //判断定时器1到时间没有?
                          {
                           if(io1==0)
                              { P4OUT &=~BIT3;
                                io1=1;
                               }
                           else
                              {
                              P4OUT|=BIT3;
                              io1=0;
                               }
                           
                           TB_num[num]=0;
                          }
                        } 
                         
                  break;                   
                  }
             case 1:
                  {
                    State=TB_State[num];
                 
                    if(State&Run)                           //判断定时器2是否运行
                      {
                       time=TB_num[num];
                       if(time==TB_Time[num])              //判断定时器2到时间没有?
                         { if(io2==0)
                              { P4OUT &=~BIT4;
                                io2=1;
                               }
                           else
                              {
                              P4OUT|=BIT4;
                              io2=0;
                               }
                           TB_num[num]=0;
                         }
                      } 
                   
                  break;                    
                  }
             case 2:
                  {
                  State=TB_State[num];                  
                  if(State&Run)                               //判断定时器3是否运行   
                    {
                    time=TB_num[num];
                    if(time==TB_Time[num])                    //判断定时器3到时间没有?
                      {if(io3==0)
                              { P4OUT &=~BIT5;
                                io3=1;
                               }
                           else
                              {
                              P4OUT|=BIT5;
                              io3=0;
                               }
                       TB_num[num]=0;
                      }
                    } 
                   break;                    
                  }
             case 3:
                  {
                  State=TB_State[num];
                  if(State&Run)                                  //判断定时器4是否运行
                    {
                    time=TB_num[num];
                    if(time==TB_Time[num])                       //判断定时器4到时间没有?
                      {if(io4==0)
                         { P4OUT &=~BIT6;
                           io4=1;
                         }
                       else
                         {
                          P4OUT|=BIT6;
                          io4=0;
                          }
                       TB_num[num]=0;
                      }
                    }  
                  break;                   
                  }
             default:break;
            }
         }
    }
       
}
////////////////////////////////////////////////////////////////////
//延时函数
////////////////////////////////////////////////////////////////////
void delay(void)
{   
    unsigned long int i=1;
     
    while(i!=30000)
      {i++;     
      }
      
}   
////////////////////////////////////////////////////////////////////
//定时器中断初始化函数
//////////////////////////////////////////////////////////////////// 
void Init_TimerB(void)
  {
    TBCTL = TBSSEL0 + TBCLR;    // 选择ACLK,清除TAR
    TBCCTL0 = CCIE;             // TBCCR0 中断允许
    TBCCR0 = 33;	        // 时间间隔约为 1 ms    
    TBCTL |= MC0;               // 增记数模式
   }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -