单片机的多个延时用定时器如何处理?

2025年03月01日 17:22
有5个网友回答
网友(1):

用定时器,定时1ms,每当到了、中断,就把 n1、n2、n3,分别加一,然后退出中断。

在主函数中,分别检测n1、n2、n3是否到了50、30、60,到了,就该干什么就干什么去。

用一个定时器,基本就可以满足所有的定时需求。

网友(2):

那就设置定时器每10ms中断一次。三个命令假设分别为FA、FB、FC,各自的时间计数器是CA、CB、CC。在定时器中断中让每个计数器加1,即:
timer_irq()
{
CA++;
CB++;
CC++;
}
在主程序中不断检查三个计数器是否符合要求,符合要求时就执行,并且将对应的计数器清零
{
if(CA==5) //等到时间
{FA();CA=0;} //执行,并清除CA计数器。
if(CB==3){FB();CB=0;}
if(CC==6){FC();CC=0;}
//如果不满足上述条件,执行其他程序。
。。。。
}

网友(3):

我学的51系列单片机,可以定义多个定时器,分别控制延时
但是程序是顺序执行的,你的要求是多进程同时发展,每个进程有独立程序段和独立的定时器
你要看看你学的单片机是不是支持多进程
然后按照多进程编程,就能实现要求

比如现在的计算机都是多进程,你电影播放器暂停,但是播歌曲的不受影响,上网不受影响

网友(4):

例子:
/*上电LED处于灭状态,按1次开关,快闪1秒4次;按2次慢闪1秒2次;按3次常亮;按4次灭;功能循环*/

#include
sbit LED1=P1^2;
sbit LED2=P1^6;
sbit KEY=P3^7;
unsigned int time;
unsigned char program;
void Delayms(unsigned int ms)
{
unsigned int i=1000;
for(;ms>0;ms--)
for(i=500;i>0;i--);

}
void t0()interrupt 1 using 1
{
if(program==0)//mie
{
LED1=LED2=1;
}
else if(program==1)//KUAI
{
time++; //10ms加1
if(time>25) //250ms
{
time=0;
LED1=LED2=!LED1;
}
}
else if(program==2)//man
{
time++;//10ms加1
if(time>50)//500ms
{
time=0;
LED1=LED2=!LED1;
}

}
else if(program==3)//liang
{
LED1=LED2=0;
}

TH0=216;//TH0=(65536-10240)/256 10ms中断1次
}
void main()
{
bit keyflag=0; //标志位 1按下 0放开
TMOD=0X11;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if((KEY==0)&&(keyflag)==0)
{
Delayms(10);
if(program<3)program++;//按下次数
else program=0;
keyflag=1;
}
else if(KEY)
{
keyflag=0;
Delayms(10);
}

}

}

/**************************************************************/
void time1()interrupt 3 using 2
{
TH1=(65536-10000)/256; //10ms
TL1=(65536-10000)%256;
num1++;
num2++;
num3++;
if(num1>=30) //30ms
{
num1=0;
flag2=1;
}
else if(num2>=50) //50ms
{
num2=0;
flag1=1;
}
else if(num3>=60) //60ms
{
num3=0;
flag3=1;
}
}
//执行第1个命令...
if(flag1==1) ...清零num1,num2,num3
//执行第2个命令...
else if(flag2==1) ... 清零num1,num2,num3
//执行第3个命令...
elseif(flag3==1) ...清零num1,num2,num3

网友(5):

建立一个数组,表示不同步骤里面延时长度参数,
用一个标志变量A表示当前步骤,在定时中断函数中,每次重新设置定时参数时,先判断A的值,选择不同的时间参数设置。类似于有限状态机。