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

我想:一个程序中,有多个延时,为了在延时的时候,其他程序正常运行,不能死等,所以用定时器中断。但是,好几个步骤中,延时的时间是不一样的。
请问:各位大侠,怎么样实现?劳驾各位给我讲讲程序思想和算法结构,大概怎么样实现?有具体的程序历程更好,如果没有,只有实现流程也行。先谢谢各位大侠拉!
就是说:假如说我执行一个命令,等待50MS;执行第二个命令,等待30MS;执行第二个命令,等待60MS;与此同时,延时的时候,其他程序正常运行。

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

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

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

你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。

追答

这种方法,怎么就是同时起步?
n1、n2、n3,这些变量,开始时都是几,不是由你自己随便定吗?
怎样起步,要看你是怎么控制它们的。
你设定成相同的值,就是同时起步。
和这种方法有什么关系?

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-03-02
那就设置定时器每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;}
//如果不满足上述条件,执行其他程序。
。。。。
}追问

你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。

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

比如现在的计算机都是多进程,你电影播放器暂停,但是播歌曲的不受影响,上网不受影响
第3个回答  2012-03-02
例子:
/*上电LED处于灭状态,按1次开关,快闪1秒4次;按2次慢闪1秒2次;按3次常亮;按4次灭;功能循环*/

#include<reg51.h>
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
第4个回答  2012-03-02
建立一个数组,表示不同步骤里面延时长度参数,
用一个标志变量A表示当前步骤,在定时中断函数中,每次重新设置定时参数时,先判断A的值,选择不同的时间参数设置。类似于有限状态机。
相似回答