找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6007|回复: 14
收起左侧

求助一个单片机定时器进行多个倒计时设计方法?

  [复制链接]
ID:405738 发表于 2018-10-6 07:50 | 显示全部楼层 |阅读模式
求助怎么设计用一个定时器制作多路倒计时?
回复

使用道具 举报

ID:213173 发表于 2018-10-8 15:53 | 显示全部楼层
一个定时器作3路不同时间倒计时

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

使用道具 举报

ID:313481 发表于 2018-10-6 13:06 | 显示全部楼层
不是特别明白楼主的要求
回复

使用道具 举报

ID:313481 发表于 2018-10-6 13:11 | 显示全部楼层
按我的理解,楼主要通过一个定时器倒计时同时控制多路,并没有什么冲突,定时器只能确认当时已经走过的时间,具体控制哪个多久由程序逻辑控制,假设有两路需要控制一路1s,一路3s时间到执行后续操作,我们用定时器定时50ms一次,累计两次第一路动作,累计6次第二路动作。
回复

使用道具 举报

ID:303383 发表于 2018-10-6 13:35 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

ID:387733 发表于 2018-10-6 15:05 | 显示全部楼层
用一个定时器中断做时基,有几路倒计时就用几个倒计时单元,分别置初值,在定时器中断程序内对各个计时单元减1,主程序只要不断查询各个计数单元,哪一个归零了,就是哪一路倒计时结束了。
回复

使用道具 举报

ID:399179 发表于 2018-10-6 18:44 来自手机 | 显示全部楼层
小猫猫爱吃鱼 发表于 2018-10-6 13:35
你好!
1、用的什么单片机
2、显示用什么?

qq号是多少?
回复

使用道具 举报

ID:111634 发表于 2018-10-7 18:10 | 显示全部楼层
以1ms(可根据需要)作为定时基值,对其计数,10ms、50ms、100ms、~、Nms,计数值满,执行相应认为。
回复

使用道具 举报

ID:366583 发表于 2018-10-9 19:50 | 显示全部楼层
谢谢,收下来学习学习
回复

使用道具 举报

ID:322454 发表于 2018-11-2 20:50 | 显示全部楼层
感谢,感谢,正是我需要的
回复

使用道具 举报

ID:89835 发表于 2018-11-7 22:59 | 显示全部楼层
楼主描述的还是不太详细,多个倒计时环节的话,可能初始值和开启时间都不同,可以试试用一个定时器产生1秒钟脉冲,然后分别用按键控制不同工作寄存器读取1秒钟脉冲,每读取一次倒计时-1
回复

使用道具 举报

ID:381277 发表于 2018-11-8 11:00 | 显示全部楼层
可以在中断函数中设置多个变量来实现多路输出
回复

使用道具 举报

ID:476909 发表于 2019-10-29 08:00 | 显示全部楼层
受用了,谢谢,很好的思路
回复

使用道具 举报

ID:631355 发表于 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晶振*/
回复

使用道具 举报

ID:631355 发表于 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]; //数码管个位
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表