如何正确计算多重循环延时程序的延时时间

发布者:MysticMoon最新更新时间:2018-05-08 来源: eefocus关键字:多重循环  延时程序  延时时间 手机看文章 扫描二维码
随时随地手机看文章

题目:MCS-51单片机,使用 6MHz 晶振,一个机器周期为 2us,计算出下列程序的延时时间。

DEL: MOV R5, #100
DEL0: MOV R6, #200
DEL1: MOV R7, #248
DEL2: DJNZ R7, DEL2
       DJNZ R6, DEL1
       DJNZ R5, DEL0
       RET


最佳答案: 题目中的答案是错的。应该是:19 960 606 us。
本题目的程序,共有三重循环,耗时的正确计算方法,可见下图。

如何正确计算多重循环延时程序的延时时间 - 非著名博主 - 电子信息角落


后记:
能够精确计算程序的执行时间,是汇编语言的长处。而用C语言编写程序,执行的时间只能进行估算和测试。
但是有很多网友,都把这两者弄混了:
  在用C语言编程的时候,偏要追问程序执行时间的计算公式;
  在用汇编语言编程的时候,却采用简略的时间计算方法。
特别是现在这道题,要求精确算出 us 量级的数值,很明显是应该采用精确的计算方法。多数网友却马虎的很!采用了简略的算法。如果这是考试题,显然会挂科一批人。
精确的计算方法,其实并不难,看看插图,划分出几个循环结构的圈,逐“层”计算即可。

如果用简易的估算方法,只是计算主要的循环体(本题仅为2T)的循环耗时时间,过程如下:

    100 * 200 * 248 * 2T = 9 920 000 T

    如:T = 2us,则延时时间为:19 940 000 us 。

这个数字和精确计算的结果相比,误差约为千分之一。这个算法,在实际应用方面,是完全可以的。

但是,这个简易的算法,精度仅在 10ms 的等级,如果作为理论分析来用,误差还是相当大的。

另外,用 keil 软件进行单步调试的时候,所耗用所机器周期和时间, keil 都能够十分清晰给出,它要比 Proteus 软件的效果好得多。
对于本题目,做而论道提出的答案,完全得到了验证,可见插图所示。


关键字:多重循环  延时程序  延时时间 引用地址:如何正确计算多重循环延时程序的延时时间

上一篇:单片机89S51,4×4矩阵键盘,控制16个发光二极管
下一篇:51单片机演奏乐曲的程序

推荐阅读最新更新时间:2024-03-16 16:02

stm32的微秒延时程序
我的stm32系统时钟为72MHZ,用软件延时方法实现微秒级的延时,既空循环: 延时函数为: #define delayUs(x) { unsigned int _dcnt; \ _dcnt=(x*16); \ while(_dcnt-- 0) \ { continue; }\ } x---------为延时时间(单位为us) 其中_dcnt=(x*16); 中的16,是可以改的,改为8的时候延时间时间为x*0.5。
[单片机]
各种汇编延时程序大集合
在论坛上看到不少不错的延时程序,整理如下共同分享: 精确延时计算公式: 延时时间= *第三层循环+5 ;延时5秒左右 DELAY5S:PUSH 04H PUSH 05H PUSH 06H MOV R4,#50 DELAY5S_0:MOV R5,#200 DELAY5S_1:MOV R6,#245
[单片机]
C8051F(330)精确延时程序(24.5M)
//********************************************** // 功能:C8051F(330)精确延时 24.5M //********************************************** #include c8051f330.h #include intrins.h //---------------------------------------------- void Reset_Sources_Init() { RSTSRC = 0x04; } void PCA_Init() { PCA0MD &= ~0x40; PCA
[单片机]
51单片机 Keil C 延时程序的简单研究
应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。 以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要: mov r0, #09h loop: djnz r0, loop 51单片机的指令周期是晶振频率的1/12,也就是1us一个周期。
[单片机]
单片机延时程序解析
我们已经知道,程序中的符号R7、R6是代表了一个个的RAM单元,是用来放一些数据的,下面我们再来看一下其它符号的含义。 DELAY: MOV R7,#250   ;(6) D1: MOV R6,#250   ;(7) D2: DJNZ R6,D2    ;(8) DJNZ R7,D1   ;(9)    RET        ;(10) 〈单片机延时程序〉 MOV:这是一条指令,意思是传递数据。说到传递,我们都很清楚,传东西要从一本人的手上传到另一本人的手上,也就是说要有一个接受者,一个传递者和一样东西。从指令MOV R7,#250中来分析,R7是一个接受者,250是被传递的数,传递者在这条指令中
[单片机]
单片机<font color='red'>延时</font><font color='red'>程序</font>解析
单片机写延时程序的几种方法
1)空操作延時 (12MHz) void delay10us() { _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); _NOP_(); } 2)循環延時 (12MHz) Void delay500ms() { unsigned char i,j,k; for(i=15;i 0;i--) for(j=202;j 0;j--) for(k=81;k 0;k--); } 延時總時間= *i+5 k*2+3=165 us 165*j+3=33333 us 33333*i+5=500000 us=500 ms 3)計時器中斷延時(工作方式2) (12MHz) #inc
[单片机]
单片机写<font color='red'>延时</font><font color='red'>程序</font>的几种方法
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved