找回密码
 立即注册

QQ登录

只需一步,快速开始

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

求大神解释c51中delay 延时的作用以及算法

  [复制链接]
回帖奖励 24 黑币 回复本帖可获得 3 黑币奖励! 每人限 1 次(中奖概率 50%)
跳转到指定楼层
楼主
ID:134197 发表于 2016-7-20 21:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求解释
for(i=4;i>0;i--)
for(j=220;j>0;j--)
在程序中延时时长和算法
急!!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:96682 发表于 2016-7-20 21:30 | 只看该作者
条件不够没法回答
回复

使用道具 举报

板凳
ID:60379 发表于 2016-7-20 21:37 | 只看该作者

回帖奖励 +3 黑币

本帖最后由 无量寿经 于 2016-7-20 21:40 编辑

以下内容来源于《51单片机轻松入门-基于STC15W4K系列》第一章,里面有软件使用方法与软件源码。
完整函数格式
void delay500ms(void)
{
   unsigned char i,j,k;
   for(i=15;i>0;i--)     //注意后面没分号
   for(j=202;j>0;j--)    //注意后面没分号
   for(k=81;k>0;k--);    //注意后面有分号
}
使用下面的软件,你想延时多久就延时多久



延时程序.rar (2.4 MB, 下载次数: 179)




回复

使用道具 举报

地板
ID:134197 发表于 2016-7-20 22:53 来自手机 | 只看该作者
无量寿经 发表于 2016-7-20 21:37
以下内容来源于《51单片机轻松入门-基于STC15W4K系列》第一章,里面有软件使用方法与软件源码。
完整函数 ...

我知道这一类的软件,但是我想知道上面那个怎样进行计算,算出来是延时多久?还有咋算的,求个详细解释,谢谢
回复

使用道具 举报

5#
ID:7485 发表于 2016-7-21 20:35 | 只看该作者
汇编的算出来极准。C语言不一样。
回复

使用道具 举报

6#
ID:60379 发表于 2016-7-21 21:16 | 只看该作者
本帖最后由 无量寿经 于 2016-7-21 21:21 编辑

运算过程是根据反汇编指令得出的,推理过程较为复杂,C——汇编——VB,在书上总共讲了8页,怎样进行计算,算出来是延时多久,这个自己试试就知道了,也可以看下视频使用演示与要点说明。STC15单片机视频地址:
http://pan.baidu.com/share/home?uk=4077802723&view=share#category/type=0
延时软件使用说明在“” 4—硬件仿真.avi“,这个地址也可以下载到完整的程序代码。
完整内容请查阅下面这本书的第一章。


回复

使用道具 举报

7#
ID:61390 发表于 2016-7-22 07:04 来自手机 | 只看该作者
如像根据晶振来,一个语句多长时间,来算
回复

使用道具 举报

8#
ID:134197 发表于 2016-7-22 10:14 来自手机 | 只看该作者
无量寿经 发表于 2016-7-21 21:16
运算过程是根据反汇编指令得出的,推理过程较为复杂,C——汇编——VB,在书上总共讲了8页,怎样进行计算, ...

好的。谢谢
回复

使用道具 举报

9#
ID:134860 发表于 2016-7-26 22:36 | 只看该作者

回帖奖励 +3 黑币

#在这里快速回复##include <reg51.h>
回复

使用道具 举报

10#
ID:157993 发表于 2016-12-27 12:12 | 只看该作者
void delay(uint z)
{
uint i,j;
for (i=z;i>0;i--)
        for(j=110;j>0;j--);
}
纯手打
回复

使用道具 举报

11#
ID:213800 发表于 2017-6-22 19:54 | 只看该作者
厉害啊 但是不同的单片机怎么计算呢?
回复

使用道具 举报

12#
ID:60379 发表于 2017-6-22 21:45 | 只看该作者
lesterlzy 发表于 2017-6-22 19:54 | 只看该作者


厉害啊 但是不同的单片机怎么计算呢?

可以选择不同的单片机,AT89与STC89相同,低速单片机,STC11、STC12、STC15等同属于高速单片机。











回复

使用道具 举报

13#
ID:159139 发表于 2017-6-22 22:09 | 只看该作者
是根据执行单步需要多少时间,然后再执行了多少次来计算的。所以它与你的工作频率和所用的单片机有关联。
回复

使用道具 举报

14#
ID:269847 发表于 2018-1-1 19:38 | 只看该作者
好复杂!
回复

使用道具 举报

15#
ID:269995 发表于 2018-1-2 09:46 | 只看该作者
这应该是因单片机而议的吧,通过循环,来延时
回复

使用道具 举报

16#
ID:405152 发表于 2018-10-10 23:39 | 只看该作者
可以用!
回复

使用道具 举报

17#
ID:349742 发表于 2018-10-11 17:11 | 只看该作者
你现在这个用的是利用循环占用CPU时间起到延时效果,具体延时时间可以通过两种方法来得知:
1、通过debug,也即调试功能,调试有两种,有模拟有在线,我们直接用模拟即可。通过debug可知你这个延时函数延时的具体时间,注:软件模拟的晶振值需与实际硬件所用的晶振值一样,不然延时时间会有偏差。
2、第二种就是通过晶振算出振荡周期,机器周期,指令周期,然后算出这个循环的具体延时时间。
3、如果想要用循环来起到延时,且想要具体延时时间,可自己算出所需要的具体时间,觉得麻烦可以用软件来替代计算。我上传的附件就可以。4、如果会中断,也可以使用计时器来进行延时。
5、希望我的回答对你有所帮助。

单片机小精灵v1.3完美破解.zip

1.2 MB, 下载次数: 24

里面有各种用途,计算延时只是其中之一

回复

使用道具 举报

18#
ID:34853 发表于 2018-10-11 17:43 | 只看该作者
  使用软件小程序去算
回复

使用道具 举报

19#
ID:405708 发表于 2018-10-21 11:01 | 只看该作者
可以开个定时器中断,在里面放标志位,主循环中查询标志位,使程序有一定的节拍,这样程序中的时序会比较精确,例如:
  1. bit gFlag10ms = 0;
  2. void TIM10_IRQ(void) interrupt IRQ_T0
  3. {
  4.     TL0 = XXX;
  5.     TH0 = XXX;
  6.     gFlag10ms = 1;
  7. }
  8. void main(void)
  9. {
  10.     SYS_Init();
  11.     while(1)
  12.     {
  13.         if(gFlag10ms)
  14.         {
  15.             gFlag10ms = 0;
  16.             DUST_Server();
  17.             MTR_Server();
  18.             COVER_Server();
  19.         }
  20.     }
  21. }
复制代码
而如果用于模拟IIC等程序的延时可以先简单编写一个延时程序,然后仿真,在KEIL反汇编中查看反汇编代码,查询单片机规格书得到每个指令的周期,调教延时程序,如果有示波器或逻辑分析仪的话可以把某个IO口置1,延时,置零,用仪器观察延时时间然后调试。

回复

使用道具 举报

20#
ID:416241 发表于 2018-12-11 19:33 | 只看该作者
软件延时的基本原理是多次重复执行指令,比如1条指令执行需要1微妙的时间,那么执行一千条这个指令 就会消耗一毫秒的时间;  其中asm("nop");语句是插入汇编指令的写法。表示在for循环中插入一条nop指令,这是一个空操作指令;它的执行将消耗掉一个cpu周期,因为我们的目的就是延时,所以空操作就可以;  但是C语言书写的fof循环编译器会加入很多我们看不到的底层实现代码,它们的执行也需要时间,所以循环次数远小于1000;   注意:软件延时只能用到要求不高的场合,因为软件延时会无端的浪费掉单片机的资源,延时也容易被打断就不准确了
回复

使用道具 举报

21#
ID:215929 发表于 2019-7-16 12:54 | 只看该作者
用软件算方便
回复

使用道具 举报

22#
ID:382454 发表于 2019-7-16 16:35 | 只看该作者
求解释
for(i=4;i>0;i--)
for(j=220;j>0;j--)
在程序中延时时长和算法
先是i=4
之后i减1后不等于0
跳到下面j=220
之后j还是大于0 则减一,如此循环减去,减去的次数就是4*220了
因为CPU执行一次是要时间的,加在一起就是达到延时目地。

回复

使用道具 举报

23#
ID:580453 发表于 2019-7-16 21:33 | 只看该作者
ROGERER 发表于 2016-7-20 22:53
我知道这一类的软件,但是我想知道上面那个怎样进行计算,算出来是延时多久?还有咋算的,求个详细解释, ...

这是利用程序进行延时,和利用定时器延时还是有所区别的定时器可以根据机器周期算出来,软件delay程序,是依照执行代码的速率统计时间的,你可以利用keil软件进行模拟在调试窗口下可以查看delay所延迟的时间。
回复

使用道具 举报

24#
ID:464755 发表于 2019-7-17 01:16 | 只看该作者
psuxaog 发表于 2018-10-21 11:01
可以开个定时器中断,在里面放标志位,主循环中查询标志位,使程序有一定的节拍,这样程序中的时序会比较精 ...

非常感谢!
回复

使用道具 举报

25#
ID:648939 发表于 2019-12-10 22:48 | 只看该作者
无量寿经 发表于 2016-7-20 21:37
以下内容来源于《51单片机轻松入门-基于STC15W4K系列》第一章,里面有软件使用方法与软件源码。
完整函数 ...

需要这个程序,感谢分享
回复

使用道具 举报

26#
ID:657168 发表于 2019-12-11 15:08 | 只看该作者
条件不够没法回答
回复

使用道具 举报

27#
ID:664971 发表于 2019-12-16 11:29 | 只看该作者
是根据执行单步需要多少时间,然后再执行了多少次来计算的
回复

使用道具 举报

28#
ID:694299 发表于 2020-3-15 20:43 | 只看该作者
楼主 你这个问题解决没  我有同样的问题
回复

使用道具 举报

29#
ID:695233 发表于 2020-3-16 20:01 | 只看该作者
你这没写全啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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