单片机的多个延时用定时器如何处理?
发布网友
发布时间:2022-05-02 05:23
我来回答
共5个回答
热心网友
时间:2022-06-28 14:42
用定时器,定时1ms,每当到了、中断,就把 n1、n2、n3,分别加一,然后退出中断。
在主函数中,分别检测n1、n2、n3是否到了50、30、60,到了,就该干什么就干什么去。
用一个定时器,基本就可以满足所有的定时需求。追问你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
追答这种方法,怎么就是同时起步?
n1、n2、n3,这些变量,开始时都是几,不是由你自己随便定吗?
怎样起步,要看你是怎么控制它们的。
你设定成相同的值,就是同时起步。
和这种方法有什么关系?
热心网友
时间:2022-06-28 14:43
那就设置定时器每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;}
//如果不满足上述条件,执行其他程序。
。。。。
}追问你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
热心网友
时间:2022-06-28 14:43
我学的51系列单片机,可以定义多个定时器,分别控制延时
但是程序是顺序执行的,你的要求是多进程同时发展,每个进程有独立程序段和独立的定时器
你要看看你学的单片机是不是支持多进程
然后按照多进程编程,就能实现要求
比如现在的计算机都是多进程,你电影播放器暂停,但是播歌曲的不受影响,上网不受影响
热心网友
时间:2022-06-28 14:44
例子:
/*上电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
热心网友
时间:2022-06-28 14:45
建立一个数组,表示不同步骤里面延时长度参数,
用一个标志变量A表示当前步骤,在定时中断函数中,每次重新设置定时参数时,先判断A的值,选择不同的时间参数设置。类似于有限状态机。