几种延时的汇编执行代码对比与总结

发布者:幸福时光最新更新时间:2013-04-07 来源: 21ic关键字:51单片机  KeilC  延时程序 手机看文章 扫描二维码
随时随地手机看文章

拜读了网上《51单片机 Keil C 延时程序的简单研究 》(by: InfiniteSpace Studio/isjfk, 1.21.2004 )一文,借鉴了文中的方法,测试发现有一点点出入,原文作者在计算延时时间的时候是否忘了加上RET指令……下面介绍我的测试结果,欢迎交流探讨——

一、单独定义变量,for语句

28: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1121 ACALL delay1(C:0021)

12: void delay1(unsigned char k)

13: {

17: unsigned char i=0;

C:0x0021 E4 CLR A

C:0x0022 FE MOV R6,A

18: for(i=0;i0;i--);相同

C:0x0023 EE MOV A,R6

C:0x0024 C3 CLR C

C:0x0025 9F SUBB A,R7

C:0x0026 5003 JNC C:002B

C:0x0028 0E INC R6

C:0x0029 80F8 SJMP C:0023

19: }

C:0x002B 22 RET

分析:

delay1(1); 410-390=20

delay1(2); 439-411=28

delay1(3); 476-440=36

即:指令周期(即实际延时)= 12 + 延时参数 * 8

二、不再重新定义变量,for语句

28: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

12: void delay1(unsigned char k)

13: {

18: for(;k>0;k--);

C:0x0023 EF MOV A,R7

C:0x0024 D3 SETB C

C:0x0025 9400 SUBB A,#0x00

C:0x0027 4003 JC C:002C

C:0x0029 1F DEC R7

C:0x002A 80F7 SJMP delay1(C:0023)

19: }

C:0x002C 22 RET

分析:

delay1(1); 491-473=18

delay1(2); 518-492=26

指令周期(即实际延时)= 10 + 延时参数 * 8

对比一和二可知,延时函数中有重新定义循环变量i时,理所当然地多了2行代码

不知原文中 “其生成的代码是一样的。”的结论是如何得来的?

三、for语句,改变循环结束条件

23: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

11: void delay1(unsigned char i)

12: {

13: // while(--i);

14: // while(i--);

15: for(; i != 0; i--);

C:0x0023 EF MOV A,R7

C:0x0024 6003 JZ C:0029

C:0x0026 1F DEC R7

C:0x0027 80FA SJMP delay1(C:0023)[page]

16: }

C:0x0029 22 RET

分析:

delay1(1); 404-390=14

delay1(2); 425-405=20

delay1(3); 452-426=26

指令周期(即实际延时)= 8 + 延时参数 * 6

对比二和三可知循环结束条件不同,编译结果理当不同,用i != 0快2个周期。

四、while语句1

21: delay1(1);

C:0x0005 7F01 MOV R7,#0x01

C:0x0007 1123 ACALL delay1(C:0023)

11: void delay1(unsigned char i)

12: {

13: while(i--);

C:0x0023 AE07 MOV R6,0x07

C:0x0025 1F DEC R7

C:0x0026 EE MOV A,R6

C:0x0027 70FA JNZ delay1(C:0023)

14: }

C:0x0029 22 RET

407-390=17,有点夸张

当delay1(2)时,为431-408=23

delay1(3)时,为461-432=29

指令周期(即实际延时)= 11 + 延时参数 * 6

五、while语句2

21: delay1(1);

444 C:0x0005 7F01 MOV R7,#0x01

445 C:0x0007 111D ACALL delay1(C:001D)

11: void delay1(unsigned char i)

12: {

13: while(--i);

447 C:0x001D DFFE DJNZ R7,delay1(C:001D)

14: }

449 C:0x001F 22 RET

451

从上看出451-444=7个周期,指令周期为1us的话,就是7us

指令周期(即实际延时)= 5 + 延时参数 * 2

综上可知:

共性:装载函数参数用时1,调用用2,返回用2,1+2+2=5为固定开销。

从以上各个结果的指令周期和延时参数的关系上看,很明显,以后如果要求不用定时器实现us级的延时(按晶振12M,指令周期1us算),那么首选第五:

while(--i);

语句,其分辨率是最高,最精确的,当然,对于相同的延时参数,它的实际延时时间也是最短的,它只能最高延时5+255*2=515us,若所需延时大于此值,则需要循环嵌套;或者,可考虑选用

for(;k>0;k--);

最高延时=10 + 255*8=2050us=2.05ms

需要其他的延时时间片的话,再参考以上的公式计算即可。

关键字:51单片机  KeilC  延时程序 引用地址:几种延时的汇编执行代码对比与总结

上一篇:89C52单片机串行通信编程两则
下一篇:单片机中SCON 、串口的问答

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

51单片机应用之无线通讯模块NRF24L01+
本教程关于NRF24L01+的内容十分详细,对于大家的学习和调试及其有帮助 内含详细教程: 单片机源程序如下: 接下来我们写发送程序: //********************************** // NRF24L01+模块发射程序 // 用8个LED调试 // Txz001 2012.05.16 //********************************** #include reg52.h typedef unsigned char uchar; //将无符号字节类型重定义为uchar typedef unsigned int uint; //将无符号整数类型重定义为Uint
[单片机]
<font color='red'>51单片机</font>应用之无线通讯模块NRF24L01+
51单片机外围模块——DS18B20温度传感器
一. DS18B20简介 DS18B20数字温度传感器接线方便,封装后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。 二. DS18B20的特点 适应电压范围更宽,电压范围:3.0~5.5V,在寄生电源方式下可由数据线供电 独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。 DS18B20支持多点组
[单片机]
<font color='red'>51单片机</font>外围模块——DS18B20温度传感器
51单片机 数码管的静态显示和动态显示
数码管(Segment Displays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。这些段分别由字母a,b,c,d,e,f,g,dp来表示。 数码管原理图: 数码管共阴极接法: 数码管共阳极接法: 数码管中有位选和段选,位选就是选择哪个数码管,段选就是被选择的数码管要显示什么数字! 根据数码管的段选,可以总结出数码管的显示数据表: 数码管的静态显示: /*======================================================*/ /* 时间:
[单片机]
<font color='red'>51单片机</font> 数码管的静态显示和动态显示
51单片机模拟串口的三种方法解析
随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采**需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,或者做点阵驱动时,又需上机位串口。但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。 本文所说的模拟串口, 就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的
[单片机]
<font color='red'>51单片机</font>模拟串口的三种方法解析
AT89S51单片机实现可预置可逆4位计数器的设计
1. 利用AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,用来指示当前计数的数据;用P1.4-P1.7作为预置数据的输入端,接四个拨动开关K1-K4,用P3.6/WR和P3.7/RD端口接两个轻触开关,用来作加计数和减计数开关。具体的电路原理图如下图所示 2. 电路原理图 图4.12.1 3. 系统板上硬件连线 (1. 把“单片机系统”区域中的P1.0-P1.3端口用8芯排线连接到“八路发光二极管指示模块”区域中的L1-L4上;要求:P1.0对应着L1,P1.1对应着L2,P1.2对应着L3,P1.3对应着L4; (2. 把“单片机系统”区域中的P3.0/RXD,P3.1/TXD,P3.2/INT0,P3.
[单片机]
AT89S<font color='red'>51单片机</font>实现可预置可逆4位计数器的设计
51单片机串口通信原理与应用
  这节我们主要讲单片机上串口的工作原理和如何通过程序来对串口进行设置,以及根据所给出的实例实现与PC 机通信。   一、原理简介   51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。   与之前一样,首先我们来了解单片机串口相关的寄存器。   SBUF 寄存器:它是两个在物理上独立的接收、发送缓冲器,可同时发送、接收数据,可通过指令对SBUF 的读写来区别是
[单片机]
<font color='red'>51单片机</font>串口通信原理与应用
51单片机与D/A接口设计详解
D/A转换器 输入的是数字量,经转换后输出的是模拟量。有关D/A转换器的技术性能指标很多,例如绝对精度、相对精度、线性度、输出电压范围、温度系数、输入数字代码种类(二进制或BCD码)等。 1) 分辩率 分辨率是D/A转换器对输入量变化敏感程度的描述,与输入数字量的位数有关。如果数字量的位数为n,则D/A转换器的分辨率为2-n。这就意味着数/模转换器能对满刻度的2-n输入量作出反应。 2) 建立时间 建立时间是描述D/A转换速度快慢的一个参数,指从输入数字量变化到输出达到终值误差±(1/2)LSB(最低有效位)时所需的时间。通常以建立时间来表示转换速度. 转换器的输出形式为电流时,建立时间较短;输出形式为电压时,由于建
[单片机]
<font color='red'>51单片机</font>与D/A接口设计详解
51单片机对SAA7113初始化和控制的程序
  用51单片机对7113初始化和控制   SAA7113的初始化就是对寄存器配置合适的参数,使其能够有符合要求的输出。寄存器配置通过I2C总线来进行,很多可以控制I2C总线的器件都可以作为主器件对7113进行初始化,这里介绍用51单片机初始化7113的例子。   51单片机和7113的硬件连接非常简单,只要把单片机的两个I/O口(如P1.0、P1.0)直接和7113的SCL、SDA管脚相连,再加上上拉电阻即可。   用单片机初始化7113的主要任务是程序的编写,首先要熟悉I2C总线协议,根据I2C总线的原理写出启动、停止、应答信号等的子程序,由子程序再写出发送、接收1个字节的程序,然后根据7113的寄存器操作格式写出
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

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

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