,即这种循环结构的延时精度为
5 μs。
通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:
C:0x0014DFFE DJNZR7,C:0014//2T
可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。
这3种循环结构的延时与循环次数的关系如表1所列。
表1 循环次数与延时时间关系单位:μs
注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。
2.5 使用性能分析器计算延时时间
很多C程序员可能对汇编语言不太熟悉,特别是每个指令执行的时间是很难记忆的,因此,再给出一种使用Keil C51的性能分析器计算延时时间的方法。这里还以前面介绍的for (i=0;i<124;i++)结构为例。使用这种方法时,必须先设置系统所用的晶振频率,选择Options for target中的target选项,在Xtal(MHz)中填入所用晶振的频率。将程序编译后,分别在_point = 1和T_point = 0处设置两个运行断点。选择start/stop debug session按钮进入程序调试窗口,分别打开Performance Analyzer window和Disassembly window。运行程序前,要首先将程序复位,计时器清零;然后按F5键运行程序,从程序效率评估窗口的下部分可以看到程序到了第一个断点,也就是所要算的程序段的开始处,用了389 μs;再按F5键,程序到了第2个断点处也就是所要算的程序段的结束处,此时时间为1 386 μs。最后用结束处的时间减去开始处时间,就得到循环程序段所占用的时间为997 μs。
当然也可以不用打开Performance Analyzer window,这时观察左边工具栏秒(SEC)项。全速运行时,时间不变,只有当程序运行到断点处,才显示运行所用的时间。
3 总结
本文介绍了多种实现并计算延时程序执行时间的方法。使用定时器进行延时是最佳的选择,可以提高MCU工作效率,在无法使用定时器而又需要实现比较精确的延时时,后面介绍的几种方法可以实现不等时间的延时: 使用自定义头文件的优点是,可实现任意时间长短的延时,并减少主程序的代码长度,便于对程序的阅读理解和维护。编写延时程序是一项很麻烦的任务,可能需要多次修改才能满足要求。掌握延时程序的编写,能够使程序准确得以执行,这对项目开发有着重要的意义。本文所讨论的几种方法,都是来源于实际项目的开发经验,有着很好的实用性和适应性。
参考文献
[1] 何立民.MCS51系列单片机应用系统设计[M].北京:北京航空航天大学出版社,1992.
[2] 戚新波,范峥,陈学广.DS18B20与ATMega8单片机接口的C语言实现方法[J].微计算机信息,2005,21(72):71-73.
[3] 贺虎,秦建敏.MSP430的软硬件C延时程序设计[J].单片机与嵌入式系统应用,2006(3):65-67.
[4] 马忠梅,藉顺心,张凯,等.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003.
段向东(硕士研究生),主要研究方向为嵌入式系统及应用;
毋玉芝(讲师),主要研究方向为远程控制;
毋茂盛(博士、教授),主要研究方向为嵌入式系统应用、网络控制。