标题: 求助一个单片机定时器进行多个倒计时设计方法? [打印本页]

作者: dyliuxiang    时间: 2018-10-6 07:50
标题: 求助一个单片机定时器进行多个倒计时设计方法?
求助怎么设计用一个定时器制作多路倒计时?
作者: 围城    时间: 2018-10-6 13:06
不是特别明白楼主的要求
作者: 围城    时间: 2018-10-6 13:11
按我的理解,楼主要通过一个定时器倒计时同时控制多路,并没有什么冲突,定时器只能确认当时已经走过的时间,具体控制哪个多久由程序逻辑控制,假设有两路需要控制一路1s,一路3s时间到执行后续操作,我们用定时器定时50ms一次,累计两次第一路动作,累计6次第二路动作。
作者: 小猫猫爱吃鱼    时间: 2018-10-6 13:35
你好!
1、用的什么单片机
2、显示用什么?
3、需要几路倒计时?
4、可以加我 QQ ,代做设计
作者: sxhwdz    时间: 2018-10-6 15:05
用一个定时器中断做时基,有几路倒计时就用几个倒计时单元,分别置初值,在定时器中断程序内对各个计时单元减1,主程序只要不断查询各个计数单元,哪一个归零了,就是哪一路倒计时结束了。
作者: 快乐眼泪    时间: 2018-10-6 18:44
小猫猫爱吃鱼 发表于 2018-10-6 13:35
你好!
1、用的什么单片机
2、显示用什么?

qq号是多少?
作者: zl2168    时间: 2018-10-7 18:10
以1ms(可根据需要)作为定时基值,对其计数,10ms、50ms、100ms、~、Nms,计数值满,执行相应认为。
作者: wulin    时间: 2018-10-8 15:53
一个定时器作3路不同时间倒计时

程序+仿真.zip (99.08 KB, 下载次数: 99)






作者: th2009    时间: 2018-10-9 19:50
谢谢,收下来学习学习
作者: Robust_Gao    时间: 2018-11-2 20:50
感谢,感谢,正是我需要的
作者: 飞将军    时间: 2018-11-7 22:59
楼主描述的还是不太详细,多个倒计时环节的话,可能初始值和开启时间都不同,可以试试用一个定时器产生1秒钟脉冲,然后分别用按键控制不同工作寄存器读取1秒钟脉冲,每读取一次倒计时-1
作者: ljx8940    时间: 2018-11-8 11:00
可以在中断函数中设置多个变量来实现多路输出
作者: 一时    时间: 2019-10-29 08:00
受用了,谢谢,很好的思路
作者: zhuyafei    时间: 2019-10-29 09:23
51单片机实现数码管99秒倒计时,其实很简单,就是使用定时器中断来实现。目的就是学习怎样用单片机实现倒计时,从而实现一些延时控制类的东西,99秒只是一个例子,你完全可以做出任意倒计时如10秒倒计时程序。定时器定时时间计算公式:初值X=M(最大计时)-计数值。
初值,换算成十六进制,高位给TH0,低位给TL0,如果用定时器0的话。
M(最大计时)如果是16位的,就是2的16次方,最大定时,65535 微秒,实现1秒定时,可以通过定时10毫秒,然后100次改变一次秒值即可。10*100毫秒=1S
计数值:你要定时多长时间,如果定时1毫秒,就是1000微秒,(单位为微秒),如果定时10毫秒,就是10000(微秒),当然,最大定时被定时器本身位数限制了,最大2的16次方(16位定时计数器),只能定时65.535毫秒。定时1S当然不可能1S定时器中断。
下面为实现99秒倒计时C语言源程序
/*了解定时器,这样的话,就可以做一些基本的实验了,如定时炸弹~~,10秒后打开关闭继电器*/
/*数码管,12M晶振*/
作者: zhuyafei    时间: 2019-10-29 09:24
#include <reg52.h>
#define uchar unsigned char
sbit p11=P1^1; //连的是继电器。。
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar shiwei;
uchar gewei;
void delay(unsigned int cnt)
{
while(--cnt);
}
void main()
{
TMOD|=0x01; /*定时器0 16位定时器 X=65535-10000(10毫秒)=55535=D8F0(十六进制)定时10ms
*/
TH0=0xd8;
TL0=0xf0;
IE=0x82; //这里是中断优先级控制EA=1(开总中断),ET0=1(定时器0允许中断),这里用定时器0来定时
TR0=1; //开定时器0
while(1)
{
P0=shiwei; //99的十位
P2=0; //99的个位,
delay(300); //动态扫描数码管延时
P0=gewei;
P2=1;
delay(300);
}
}
void tim(void) interrupt 1 using 1 //定时器0中断
{
static uchar second=99,count; //99只是一个数,可以任意改,因为这里只学习怎样实现倒计时
TH0=0xd8; //定时10毫秒
TL0=0xf0;
count++;
if(count==100) //10毫秒定时,10*100=1000(毫秒)=1秒
{
count=0;
second--;
if(second==0)
{
p11=0; //这里让继电器动作,当然动作之后,要复位才能等下次倒定时再动作。
second=99; //回到99再循环来,当然,可以做其他的控制,
}
shiwei=tab[second/10]; //数码管10位
gewei=tab[second%10]; //数码管个位
}




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1