打印

单片机中延时程序探讨

[复制链接]
3375|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)又是多长时间的?

使用特权

评论回复
5
smilingangel|  楼主 | 2013-3-11 18:47 | 只看该作者
还有各位还有其他的什么的延时方法的也请贡献出来的,并给我讲解分析下的,谢谢

使用特权

评论回复
6
cjhk| | 2013-3-11 20:37 | 只看该作者
一般我都是使用延时程序  这样延时比较方便   个人的一点意见  呵呵

使用特权

评论回复
7
i1mcu| | 2013-3-11 23:46 | 只看该作者
可以使用定时器来设定的

使用特权

评论回复
8
i1mcu| | 2013-3-11 23:46 | 只看该作者
相比于while循环更精确

使用特权

评论回复
9
三千花花世界| | 2013-3-12 11:36 | 只看该作者
利用软件循环来做定时,应该是51单片机时代的概念了,这个精度是受各个环节影响的

在定时器内置是标准配置的如今,要精确的定时控制,应该通过定时器

使用特权

评论回复
10
zhl100| | 2013-3-12 12:49 | 只看该作者
看情况吧,如果系统比较简单,就用循环做吧
如果复杂或是有精确要求还是用定时器
循环延时占用CPU时间,最好少用

使用特权

评论回复
11
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
这种定时的方式简单,而且精确度也非常的高。

使用特权

评论回复
12
三千花花世界| | 2013-3-12 16:40 | 只看该作者
jlass 发表于 2013-3-12 15:27
(1/8M)*2500*5
(1/8M)*50000*5
这种定时的方式简单,而且精确度也非常的高。

但是占用CPU资源啊

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

使用特权

评论回复
13
jlass| | 2013-3-12 17:11 | 只看该作者
本帖最后由 jlass 于 2013-3-12 17:14 编辑
三千花花世界 发表于 2013-3-12 16:40
但是占用CPU资源啊

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

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

使用特权

评论回复
14
leiyun1993| | 2013-3-12 17:15 | 只看该作者
这方面我的问题也很多呢!学习学习!

使用特权

评论回复
15
三千花花世界| | 2013-3-12 17:52 | 只看该作者
jlass 发表于 2013-3-12 17:11
定时器固然好,但是如果水平不够容易出问题,debug困难。
而且定时器是有限的资源,这样就用掉一个,太浪 ...

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

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

这样说对吧

在以上情况都不存在的情况下,用用FOR也无伤大雅,我个人认为,只要定时器资源足够,就应该使用定时器做时基管理

使用特权

评论回复
16
小营七郎| | 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毫秒。

使用特权

评论回复
17
huanghongxing| | 2013-3-12 22:52 | 只看该作者
感觉使用延时程序比较占用系统资源

使用特权

评论回复
18
kingTek| | 2013-3-12 23:37 | 只看该作者
系统里设置一个统一的定时中断,例如1ms,在这个基础上基本可以做任何延时动作,而且统一规划,可移植性好,精确。
不要被教科书所戕害:用指令延时,那样的毛病太多了。
时基问题是系统的基本问题,有时间我再作文以详细阐述

使用特权

评论回复
19
三千花花世界| | 2013-3-13 09:56 | 只看该作者
kingTek 发表于 2013-3-12 23:37
系统里设置一个统一的定时中断,例如1ms,在这个基础上基本可以做任何延时动作,而且统一规划,可移植性好 ...

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

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

期待KingTek的时基管理好文:victory:

使用特权

评论回复
20
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

粉丝