📄 soft_timer.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 + -