单片机中延时程序探讨

[复制链接]
4011|24
 楼主| smilingangel 发表于 2013-3-11 18:40 | 显示全部楼层 |阅读模式
在做单片机程序中,经常会用到延时程序的,而演示程序有很多种的,问下各位大虾的,这些延时的有哪些方式?它们的延时准确度及占用资源情况又是怎样的呢?

 楼主| smilingangel 发表于 2013-3-11 18:42 | 显示全部楼层
我知道的一个简单地就是利用for 语句循环的,但是不知道其精确时间是多少的,每次都是大致的延时时间,这个说事跟单片机的主频率有关的,但是是怎样计算延时时间的,我还是不太清楚的,请教大家了。。。
 楼主| smilingangel 发表于 2013-3-11 18:44 | 显示全部楼层
void Delay_S(uint tt)   //约0.5s
{
for(uint i=0;i<tt;i++)
  for(uint j=0;j<50000;j++);
}

void Delay_ms(uint kk)   //
{
for(uint i=0;i<kk;i++)
  for(uint j=0;j<2500;j++);
}
 楼主| smilingangel 发表于 2013-3-11 18:46 | 显示全部楼层
像楼上所示的两个延时程序的,若我的MCLK=8MHz,则请问Delay_S(5)为多长时间的?Delay_ms(5)又是多长时间的?
 楼主| smilingangel 发表于 2013-3-11 18:47 | 显示全部楼层
还有各位还有其他的什么的延时方法的也请贡献出来的,并给我讲解分析下的,谢谢
cjhk 发表于 2013-3-11 20:37 | 显示全部楼层
一般我都是使用延时程序  这样延时比较方便   个人的一点意见  呵呵
i1mcu 发表于 2013-3-11 23:46 | 显示全部楼层
可以使用定时器来设定的
i1mcu 发表于 2013-3-11 23:46 | 显示全部楼层
相比于while循环更精确
三千花花世界 发表于 2013-3-12 11:36 | 显示全部楼层
利用软件循环来做定时,应该是51单片机时代的概念了,这个精度是受各个环节影响的

在定时器内置是标准配置的如今,要精确的定时控制,应该通过定时器
zhl100 发表于 2013-3-12 12:49 | 显示全部楼层
看情况吧,如果系统比较简单,就用循环做吧
如果复杂或是有精确要求还是用定时器
循环延时占用CPU时间,最好少用
jlass 发表于 2013-3-12 15:27 | 显示全部楼层
本帖最后由 jlass 于 2013-3-12 15:29 编辑
smilingangel 发表于 2013-3-11 18:46
像楼上所示的两个延时程序的,若我的MCLK=8MHz,则请问Delay_S(5)为多长时间的?Delay_ms(5)又是多长时间的 ...

(1/8M)*2500*5
(1/8M)*50000*5
这种定时的方式简单,而且精确度也非常的高。
三千花花世界 发表于 2013-3-12 16:40 | 显示全部楼层
jlass 发表于 2013-3-12 15:27
(1/8M)*2500*5
(1/8M)*50000*5
这种定时的方式简单,而且精确度也非常的高。

但是占用CPU资源啊

有定时器模块,为何不用呢?
jlass 发表于 2013-3-12 17:11 | 显示全部楼层
本帖最后由 jlass 于 2013-3-12 17:14 编辑
三千花花世界 发表于 2013-3-12 16:40
但是占用CPU资源啊

有定时器模块,为何不用呢?

定时器固然好,但是如果水平不够容易出问题,debug困难。
而且定时器是有限的资源,这样就用掉一个,太浪费了。
for循环完全可以的情况下,没必要强求。

leiyun1993 发表于 2013-3-12 17:15 | 显示全部楼层
这方面我的问题也很多呢!学习学习!
三千花花世界 发表于 2013-3-12 17:52 | 显示全部楼层
jlass 发表于 2013-3-12 17:11
定时器固然好,但是如果水平不够容易出问题,debug困难。
而且定时器是有限的资源,这样就用掉一个,太浪 ...

对于复杂系统来说,用定时器做时基管理是必不可少的

FOR循环的问题在于不稳定,首先作为C语言,时基的精度不可控,其次,完全无法在有中断的系统中进行时基管理,最后代码不可移植。

这样说对吧

在以上情况都不存在的情况下,用用FOR也无伤大雅,我个人认为,只要定时器资源足够,就应该使用定时器做时基管理
小营七郎 发表于 2013-3-12 18:49 | 显示全部楼层
void delay(uint z)
{
    uint x,y;
      for(x=z;x>0;x--)
        for(y=110;y>0;y--);
}  这个是晶振11.0592时候的延时,延时z毫秒。
huanghongxing 发表于 2013-3-12 22:52 | 显示全部楼层
感觉使用延时程序比较占用系统资源
kingTek 发表于 2013-3-12 23:37 | 显示全部楼层
系统里设置一个统一的定时中断,例如1ms,在这个基础上基本可以做任何延时动作,而且统一规划,可移植性好,精确。
不要被教科书所戕害:用指令延时,那样的毛病太多了。
时基问题是系统的基本问题,有时间我再作文以详细阐述
三千花花世界 发表于 2013-3-13 09:56 | 显示全部楼层
kingTek 发表于 2013-3-12 23:37
系统里设置一个统一的定时中断,例如1ms,在这个基础上基本可以做任何延时动作,而且统一规划,可移植性好 ...

说的不错,很多教科书还停留在51的时代,那时候芯片没有内置定时器或者内置定时器的数量有限

如果是几K的代码量,用用FOR也无妨,但意识上应该转移到新型的时基管理系统上了,而不是一想起时延,就是FOR循环

期待KingTek的时基管理好文:victory:
qiujiahongde 发表于 2013-3-15 09:06 | 显示全部楼层
1、如果是IAR,和MSP430的前提下可以用IAR自带的延迟函数,优点相对精确,缺点函数只能带常量,实现方式如下:
#define CPU_F ((double)8000000)   //MCU主频
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
2、软件延迟,自己写个延迟函数,中间填NOP,然后用示波器量一下,或者仿真看下汇编指令自己算算;优点灵活,缺点不那么精确;
3、配合定时器做精确延迟;优点精确,缺点要定时器配合;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

4066

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部