找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2472|回复: 24
打印 上一主题 下一主题
收起左侧

想问一下可以使用keil单片机实现十分钟的延时吗

  [复制链接]
回帖奖励 20 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
我在网上搜索的都是延时几十毫秒,我想问下可以实现十几分钟的延时吗?应该怎么实现,程序是什么?在哪里设置
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:94031 发表于 2020-3-3 14:05 | 只看该作者
可以在延时中断里加变量记录中断次数,根据中断次数就可得到更长的延时时间。
回复

使用道具 举报

板凳
ID:60830 发表于 2020-3-3 14:18 | 只看该作者
最简单的延时就是采用双层for
回复

使用道具 举报

地板
ID:60830 发表于 2020-3-3 14:22 | 只看该作者
最简单的延时是采用双层for(....)循环,既然可以实现几十毫秒的,多加几次循环就可以很轻松的实现,几十分钟的那种,不过这种循环消耗单片机的CPU时间,建议你去查一下定时器的用法,采用定时器中断来实现几十分钟的长时间延时。
回复

使用道具 举报

5#
ID:282850 发表于 2020-3-3 14:38 | 只看该作者
完全可以,keil下我用STC11F04E实现了高精度长延时(几百秒)。
1、先确认主晶振频率,并计算。计算方法没在家。
2、MCU主频用最大分频
3、每60S设一个计数变量,可以计分钟值了。
回复

使用道具 举报

6#
ID:285863 发表于 2020-3-3 14:44 | 只看该作者
多层循环 不断的重复
回复

使用道具 举报

7#
ID:426861 发表于 2020-3-3 14:45 | 只看该作者
C语言没学好吧,你能实现毫秒级的延时,循环一千次不就是秒级延时了吗?再循环六十次不就是分钟级的延时了吗?
回复

使用道具 举报

8#
ID:451629 发表于 2020-3-3 14:47 | 只看该作者
可以,循环就可以了
回复

使用道具 举报

9#
ID:451629 发表于 2020-3-3 14:47 | 只看该作者
可以,循环延时就可以了
回复

使用道具 举报

10#
ID:235200 发表于 2020-3-3 15:19 | 只看该作者
可以的,延时长的时间都是采用累加形式,不只是设置就可达到的
回复

使用道具 举报

11#
ID:407089 发表于 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时钟模块提供时间基准。通常对数据的采集往往需要时钟模块来配合。

回复

使用道具 举报

12#
ID:616230 发表于 2020-3-3 15:35 | 只看该作者
如果变量ms是1ms加1,那在ms加到1000的时候不就是1s了,就让变量s加1,在s加到300的时候不就是5min了吗
回复

使用道具 举报

13#
ID:697560 发表于 2020-3-3 16:18 | 只看该作者
brew9 发表于 2020-3-3 15:23
延时函数精度不高,实在要用可如下操作:以上方法中,虽然dealy_10ms()延时了10ms,但一个while循环显然要 ...

谢谢你,我想问下这个误差如果设置十分钟会有多长的误差
回复

使用道具 举报

14#
ID:407089 发表于 2020-3-3 17:30 | 只看该作者

回复

使用道具 举报

15#
ID:462827 发表于 2020-3-4 00:40 | 只看该作者
用定时器中断,怎么做的电子时钟就怎么计时十几分钟,在延时的地方检测这个计时到了没有就行
回复

使用道具 举报

16#
ID:595454 发表于 2020-3-4 08:41 | 只看该作者
一个比较精确的方法(循环不是很精确):使用T0定时(16位,使能溢出中断,中断里让某个IO口翻转),翻转的IO口给T1计数(外部输入),这样相当于一个65536*2*65536=33bit的计数器。如果主频是12M(基本51单片机),(T0)一次就是1us,1us*2^33=2个多小时(嫌不够的话,就再串个定时器),区区10几分钟....
回复

使用道具 举报

17#
ID:697917 发表于 2020-3-4 09:24 | 只看该作者
可以的。嵌套,但是软件仿真的和实际的还是有出入的。需要自己调整。
回复

使用道具 举报

18#
ID:702127 发表于 2020-3-4 09:34 | 只看该作者
可以采取两种办法:
1、利用定时器延时,一次定时60ms,然后在定时器中断中设置标志变量,使这个标志变量从1开始加,一直加到10000,然后重新开始计数,就可以实现10分钟的延时。
2、利用延时函数,多次循环。
回复

使用道具 举报

19#
ID:316880 发表于 2020-3-6 00:06 | 只看该作者
用定时器可以实现,并且程序执行效率高
回复

使用道具 举报

20#
ID:559684 发表于 2020-3-6 10:34 | 只看该作者
完全可以你用库函数调用delay()给参数就行
回复

使用道具 举报

21#
ID:559684 发表于 2020-3-6 10:44 | 只看该作者
用滴答定时器也行,程序简单易理解
回复

使用道具 举报

22#
ID:703392 发表于 2020-3-6 14:59 | 只看该作者
多层循环
回复

使用道具 举报

23#
ID:403593 发表于 2020-3-6 19:09 | 只看该作者
需要的话,延时一年都行。我用的是定时器中断,每1ms触发中断,这里就可以使用ms延时,然后ms>1000以后,s++,这就是秒延时,s>60了,min++,这就是分钟延时,当min>60了,hour++,这就是小时延时,这样就可以实现任意的延时了。
回复

使用道具 举报

24#
ID:701661 发表于 2020-3-7 05:54 | 只看该作者
多层嵌套就可以实现,想要精确就好好算算每条指令执行时间
回复

使用道具 举报

25#
ID:437615 发表于 2020-3-7 08:49 来自手机 | 只看该作者
延时时间稍长就要用定时器,其他的都无所谓
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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