单片机的多个延时用定时器如何处理?
答案:5 悬赏:40
解决时间 2021-02-12 10:24
- 提问者网友:wodetian
- 2021-02-11 22:13
单片机的多个延时用定时器如何处理?
最佳答案
- 二级知识专家网友:七十二街
- 2021-02-11 23:06
用定时器,定时1ms,每当到了、中断,就把 n1、n2、n3,分别加一,然后退出中断。
在主函数中,分别检测n1、n2、n3是否到了50、30、60,到了,就该干什么就干什么去。
用一个定时器,基本就可以满足所有的定时需求。
追问:你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
追答:这种方法,怎么就是同时起步?
n1、n2、n3,这些变量,开始时都是几,不是由你自己随便定吗?
怎样起步,要看你是怎么控制它们的。
你设定成相同的值,就是同时起步。
和这种方法有什么关系?
在主函数中,分别检测n1、n2、n3是否到了50、30、60,到了,就该干什么就干什么去。
用一个定时器,基本就可以满足所有的定时需求。
追问:你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
追答:这种方法,怎么就是同时起步?
n1、n2、n3,这些变量,开始时都是几,不是由你自己随便定吗?
怎样起步,要看你是怎么控制它们的。
你设定成相同的值,就是同时起步。
和这种方法有什么关系?
全部回答
- 1楼网友:上分大魔王
- 2021-02-12 02:08
建立一个数组,表示不同步骤里面延时长度参数,
用一个标志变量A表示当前步骤,在定时中断函数中,每次重新设置定时参数时,先判断A的值,选择不同的时间参数设置。类似于有限状态机。
用一个标志变量A表示当前步骤,在定时中断函数中,每次重新设置定时参数时,先判断A的值,选择不同的时间参数设置。类似于有限状态机。
- 2楼网友:酒醒三更
- 2021-02-12 01:12
例子:
#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
#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
- 3楼网友:人類模型
- 2021-02-12 00:56
那就设置定时器每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;}
//如果不满足上述条件,执行其他程序。
。。。。
}
追问:你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
timer_irq()
{
CA++;
CB++;
CC++;
}
在主程序中不断检查三个计数器是否符合要求,符合要求时就执行,并且将对应的计数器清零
{
if(CA==5) //等到时间
{FA();CA=0;}//执行,并清除CA计数器。
if(CB==3){FB();CB=0;}
if(CC==6){FC();CC=0;}
//如果不满足上述条件,执行其他程序。
。。。。
}
追问:你好!这种方法,三个延时是同时起步的吧?我想分开起步呢?请问大虾,可以么?本人也是刚起步,问的不妥的地方敬请大虾理解。
- 4楼网友:青灯有味
- 2021-02-12 00:18
我学的51系列单片机,可以定义多个定时器,分别控制延时
但是程序是顺序执行的,你的要求是多进程同时发展,每个进程有独立程序段和独立的定时器
你要看看你学的单片机是不是支持多进程
然后按照多进程编程,就能实现要求
比如现在的计算机都是多进程,你电影播放器暂停,但是播歌曲的不受影响,上网不受影响
但是程序是顺序执行的,你的要求是多进程同时发展,每个进程有独立程序段和独立的定时器
你要看看你学的单片机是不是支持多进程
然后按照多进程编程,就能实现要求
比如现在的计算机都是多进程,你电影播放器暂停,但是播歌曲的不受影响,上网不受影响
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯