标题: 想问一下可以使用keil单片机实现十分钟的延时吗 [打印本页]

作者: 13199937120    时间: 2020-3-3 13:28
标题: 想问一下可以使用keil单片机实现十分钟的延时吗
我在网上搜索的都是延时几十毫秒,我想问下可以实现十几分钟的延时吗?应该怎么实现,程序是什么?在哪里设置
作者: xuyaqi    时间: 2020-3-3 14:05
可以在延时中断里加变量记录中断次数,根据中断次数就可得到更长的延时时间。
作者: lanxin    时间: 2020-3-3 14:18
最简单的延时就是采用双层for
作者: lanxin    时间: 2020-3-3 14:22
最简单的延时是采用双层for(....)循环,既然可以实现几十毫秒的,多加几次循环就可以很轻松的实现,几十分钟的那种,不过这种循环消耗单片机的CPU时间,建议你去查一下定时器的用法,采用定时器中断来实现几十分钟的长时间延时。
作者: f556    时间: 2020-3-3 14:38
完全可以,keil下我用STC11F04E实现了高精度长延时(几百秒)。
1、先确认主晶振频率,并计算。计算方法没在家。
2、MCU主频用最大分频
3、每60S设一个计数变量,可以计分钟值了。
作者: bemc    时间: 2020-3-3 14:44
多层循环 不断的重复
作者: 天风情    时间: 2020-3-3 14:45
C语言没学好吧,你能实现毫秒级的延时,循环一千次不就是秒级延时了吗?再循环六十次不就是分钟级的延时了吗?
作者: 时间苍白了誓言    时间: 2020-3-3 14:47
可以,循环就可以了
作者: 时间苍白了誓言    时间: 2020-3-3 14:47
可以,循环延时就可以了
作者: csmyldl    时间: 2020-3-3 15:19
可以的,延时长的时间都是采用累加形式,不只是设置就可达到的
作者: brew9    时间: 2020-3-3 15:23
延时函数精度不高,实在要用可如下操作:
  1. void main()
  2. {                       
  3.         unsigned int i=0;
  4.         unsigned char j=0;

  5.         while(1)
  6.         {
  7.                 dealy_10ms();        //延时10ms函数
  8.                 i++;       
  9.                 if(i==30000)        //(30000*10/1000/60)=5分钟,每5钟j自加1次
  10.                 {
  11.                         i=0;
  12.                         j++;
  13.                 }
  14.                 if(j==3)        //相当于3*5=15分钟的延时
  15.                 {
  16.                          //你想执行的语句

  17.                 }
  18.         }
  19. }
复制代码
以上方法中,虽然dealy_10ms()延时了10ms,但一个while循环显然要大于10ms,这会产生误差,且延时函数本身也存在误差。

要提高精度的话可以用定时器来做累加,如果觉得精度还不够,可以用ds1302/ds3231时钟模块提供时间基准。通常对数据的采集往往需要时钟模块来配合。


作者: 酱油兑啤酒    时间: 2020-3-3 15:35
如果变量ms是1ms加1,那在ms加到1000的时候不就是1s了,就让变量s加1,在s加到300的时候不就是5min了吗
作者: 13199937120    时间: 2020-3-3 16:18
brew9 发表于 2020-3-3 15:23
延时函数精度不高,实在要用可如下操作:以上方法中,虽然dealy_10ms()延时了10ms,但一个while循环显然要 ...

谢谢你,我想问下这个误差如果设置十分钟会有多长的误差
作者: brew9    时间: 2020-3-3 17:30


作者: hantu    时间: 2020-3-4 00:40
用定时器中断,怎么做的电子时钟就怎么计时十几分钟,在延时的地方检测这个计时到了没有就行
作者: yuzhengxin    时间: 2020-3-4 08:41
一个比较精确的方法(循环不是很精确):使用T0定时(16位,使能溢出中断,中断里让某个IO口翻转),翻转的IO口给T1计数(外部输入),这样相当于一个65536*2*65536=33bit的计数器。如果主频是12M(基本51单片机),(T0)一次就是1us,1us*2^33=2个多小时(嫌不够的话,就再串个定时器),区区10几分钟....
作者: 黎明初至    时间: 2020-3-4 09:24
可以的。嵌套,但是软件仿真的和实际的还是有出入的。需要自己调整。
作者: ii11nnocent    时间: 2020-3-4 09:34
可以采取两种办法:
1、利用定时器延时,一次定时60ms,然后在定时器中断中设置标志变量,使这个标志变量从1开始加,一直加到10000,然后重新开始计数,就可以实现10分钟的延时。
2、利用延时函数,多次循环。
作者: 余生不负    时间: 2020-3-6 00:06
用定时器可以实现,并且程序执行效率高
作者: hghvhgv    时间: 2020-3-6 10:34
完全可以你用库函数调用delay()给参数就行
作者: hghvhgv    时间: 2020-3-6 10:44
用滴答定时器也行,程序简单易理解

作者: qcm755    时间: 2020-3-6 14:59
多层循环
作者: 这一生只为你    时间: 2020-3-6 19:09
需要的话,延时一年都行。我用的是定时器中断,每1ms触发中断,这里就可以使用ms延时,然后ms>1000以后,s++,这就是秒延时,s>60了,min++,这就是分钟延时,当min>60了,hour++,这就是小时延时,这样就可以实现任意的延时了。
作者: 271671439    时间: 2020-3-7 05:54
多层嵌套就可以实现,想要精确就好好算算每条指令执行时间
作者: zhy123654    时间: 2020-3-7 08:49
延时时间稍长就要用定时器,其他的都无所谓




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