关于for、while循环延时时间

注:12M晶振,一周期为1us

#include<reg51.h>
main()
{
unsigned int i;
i=70;
while(i--);

}

上述程序汇编代码:

C:0x0007 EF MOV A,R7
C:0x0008 1F DEC R7
C:0x0009 AC06 MOV R4,0x06
C:0x000B 7001 JNZ C:000E
C:0x000D 1E DEC R6
C:0x000E 4C ORL A,R4
C:0x000F 70F6 JNZ C:0007

//为何此循环延时640us?因为根据汇编结果,循环一次需9个周期(如何得出?可以通过keil仿真下断点的方式得出,当然也可以直接算出,根据指令的类型来确定其运行所需周期,具体的可以搜索“指令周期”来详细了解),故70x9=630;而当最后i=0时,还要再运行一次判断为0后跳转出循环,故为630+10(为何为10?见下)=639;
 //最后i为零时循环一次需10个周期,因为i不为0时语句“JNZ C:000E DEC R6"此两个语句,由于前面JNZ判断条件成立,故把后面语句跳过,而
//当i为0时,此语句不在跳过,故执行时间加一个周期;
//综上,包括”i=70“语句在内的while循环共延时了642us;
//特别注意:如果变量i的定义类型不同,延时的时间也不相同;
//比如:如果定义i为unsigned char i;那么延时的时间将只有400多us,具体原因看两种情况所产生的汇编代码即可知晓!!

//注:以上是通过keil仿真得到的结果
//通过下断点来确定一条指令或一次循环所需时间

for循环与此类似,不在赘述。

时间: 2024-10-05 23:37:46

关于for、while循环延时时间的相关文章

关于51精确延时及keil仿真延时时间

转自:http://blog.sina.com.cn/s/blog_980e19e00101b5dh.html 有时候需要精确的延时,比如18B20温度传感器对时序要求非常严格,必须精确到微秒级别 一.用NOP函数 在keil C51中,直接调用库函数: #include // 声明了void _nop_(void); _nop_(); // 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒.NOP指令为单周期指令,可由晶振

UPS延时时间计算方法

UPS延时时间计算: (单电池容量*电池个数*12V电池电压)                  设备功率*0.8损耗 || 可延时时间(小时) 例如:APS1500配置2只12V100AH电池供500W服务器使用: (100AH*2*12V) 500W*0.8 || 6(小时) 例如:山特C6KS设备总用电6000W,要求能延时4小时,配置12V100AH电池需要几只: (6000W*0.8)*4/(100AH*12V)=16(只) 在购买UPS要按拟带负载量的1.5倍去选择 例如:拟带负载总

数据库 SQL server 连接查询 变量 选择 循环 延时语句

use lianxigo--1.供应商表 gong-- (gcode 供应商编号-- gname 供应商名称-- gtel 供应商电话)create table gong(gcode int primary key,gname varchar(20),gtel varchar(20),)goinsert into gong values(101,'淄博商贸','0533-123456')insert into gong values(102,'济南商贸','0531-234567')insert

C# 记录循环消耗时间

今天写了循环段代码,但是感觉好像性能很差的样子,就想看一下整个循环的执行时间,最开始我想到了DateTime.Now,但是诡异的是,如果我循环的次数比较少的话(少于30000次)就会发现2次时间间隔是一样的!无论是DateTime.Now.Tick还是DateTime.Now.TimeOfDay.ToString(),网上找了资料,好像是说DateTime.Now的精确度比较低,找了许久终于找见一个解决办法,直接贴代码 private static void Test() { do { Cons

shell 中可以for 循环的时间加减日期格式

for num in {88..3};do # LAST_HOUR=`date -d '-${num} hour' +%H` 不可for循环,报格式错误 LAST_HOUR=`date "+%H" -d -${num}hour` 原文地址:https://www.cnblogs.com/tnsay/p/9996826.html

页面js循环输出时间,日期,手机号码suij

<pre name="code" class="javascript"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAU8AAAGACAYAAAAtc+CTAAAgAElEQVR4Aey9f0xbV543/JlHi7vqnUqgmbHaglT4I7BSXKmQqp5MQdPwB1jaMJOG6TSZJBSKFJq3CbtJ/MLQklBSpjQsP2YJWZJoaRgmm

动态规划_基础_任意子区间序列求和问题_滑动窗口解法_多种思路_分治思想演变

题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入描述 第一行是一个正整数 N ( 1 ≤ N ≤ 200000 ) ,表示了序列的长度. 接下来的 N 行包含 N 个绝对值不大于 10000 的整数 A [ i ] ,描述了这段序列. 输出描述 仅包括 1 个整数,为最大的子段和是多少,子段的最小长度为 1 . 样例输入 72-43-12-43 样例输出 4 Hint Origin: SidneyEdit by stdKonjac in 2020 解题思路: 关于求子区间求

linux设备驱动归纳总结(七):1.时间管理与内核延时【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-100005.html linux设备驱动归纳总结(七):1.时间管理与内核延时 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这节将介绍一些很枯燥的内核,大体是内核中时间的概念和内核延时的使用,并没有源代码. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)

解决上一节中延时函数占CPU使用率(达50%)的第二种方法是利用消息机制,通过API函数MsgWaitForMultipleObjects等待消息或超时的到来,从而避免使用循环检测使CPU占用率过高.完整的改进版Delay函数代码如下: [delphi] view plaincopyprint? procedure Delay(dwMilliseconds:DWORD); var endTick: DWORD; Event: THandle; begin Timer1.Enabled:=Fals