51单片机中for循环延时时间的分析与仿真验证
2015-07-27薛金水广东工程职业技术学院广州510520
薛金水(广东工程职业技术学院,广州 510520)
51单片机中for循环延时时间的分析与仿真验证
薛金水
(广东工程职业技术学院,广州510520)
摘要:在单片机控制中,延时控制是最常用的程序之一。本文对51系列单片机中各种for循环程序对应的汇编代码进行分析,探究延时时间长短的各种决定因素,提出了应用for循环实现延时时间的一般估算方法和注意要素。并通过Proteus软件仿真,对延时控制程序的时间进行验证。
关键词:单片机;for循环;延时控制;汇编代码;Proteus仿真
1 引言
在单片机控制中,延时控制是最常用的程序之一。通过延时,一方面使系统硬件各部分按照步骤设定,一步一步执行下去;另一方面使系统的硬件和软件能够协调运行,完成设定的传输和控制功能。延时控制既可以用硬件、也可以用软件来实现。软件控制可以用汇编语言或者C语言程序来实现。虽然汇编语言有指令紧凑、控制时间精确、占用内存少等特点,但是它相对难于掌握。由于C语言具有语言功能齐全、使用灵活方便、开发效率高,相对容易掌握等特点,被广泛应用于在单片机系统开发应用中。
在C语言延时程序设计中,常用三种循环语句(while语句、do while语句和for语句)实现延时功能。其中以for循环延时最为常见。本文从应用需要角度出发,依据单片机C语言for循环的各种不同形式,通过具体实例,对照编译生成的汇编代码,分析、归纳总结出C语言for循环延时程序的延时时间估算方法及,通过Proteus软件仿真进行验证,并提出使用建议。
2 各种for循环语句程序延时结果分析
用C语言编写的单片机程序,首先要转换为汇编语言,最后编译为机器代码后才能真正运行。因此,对于用C语言编写的各种延时程序,只有通过从其汇编转换代码上计算其实现延时时间,才是比较准确时间估算的方法。
2.1决定for循环延时时间长短的因素
从各种for循环语句程序延时情况进行分析和验证,发现:与延时结果有关的因素有如下三个:循环变量类型(char或者int类型)、循环变量变化方式(递增或者递减)和循环次数(是否超过256)。下表是考虑上述三种因素的不同for循环延时程序的汇编代码与实际延时时间分析和比较。
表1 循环变量为char类型的for循环延时程序
从表1可以看出,以char类型为循环变量、循环变量递减变化时,是使用寄存器R7,以DJNZ语句为循环体,延时时间为1+2x125=251us;以char类型为循环变量、循环变量递增变化时,同样使用寄存器R7,以加1指令INC和CJNZ语句为循环体,延时时间为1+(2+1)x126=379us。采用char类型为循环变量时,循环变量递增与递减变化时,其延时时间差别比较大。
表2 循环变量为int类型的for循环延时程序
从表2可以看出,以int类型为循环变量时,只要循环次数不超过256次,则循环变量无论是递减还是递增变化,汇编语言都是使用寄存器R6和R7,以INC、CJNE或DJNZ语句为循环体,在循环次数相同时延时时间近似相等,循环次数增加时延时时间按照比例增加(见函数5、6、7、8);当循环次数超过256次,延时时间不再成比例增加,例如:采用(unsigned)int;for(i=500;i>=1;i--);的延时时间约为4000us;采用(unsigned)int;for(i=1;i<=500;i++);的延时时间约为3000us。读者可自行验证。
2.2for循环延时程序的应用
从以上分析可以看出:采用char类型为循环变量类型时,循环变量按照递加或者递减变化时,延时时间会差别较大;采用int类型为循环变量类型时,在循环次数不超过256次时,按照递加或者递减变化时,延时时间差别很小;而当循环次数超过256次时,其延时时间不能够实现等比例增加。
所以,从应用角度出发,采用定义i为整型时,以for(i=125;
i>=1;i--);或者for(i=1;i<=125;i++);语句来作为1ms基本延时函数,不用考虑循环变量是递加还是递减,比较简单易掌握。需要较长的延时时间采用二重循环的方式。采用二重循环的方式,最长可以延长255ms,能够满足一般的延时需求。如果需要更长时间延时,则可以用三重甚至多重循环方式,但是循环次数一般不能超过256次。
例如:要实现延时10ms,则可以用如下循环
3 C语言程序软件延时功能的Proteus仿真软件
C语言延时功能实现过程中,为了验证其延时的正确性,一方面可以利用示波器来测定延时程序执行时间,即设计一个基本单片机硬件电路,将包含实现延时函数的程序下载到单片机硬件电路,在程序中运行该延时函数,通过测量示波器相关输出引脚上的高、低电平时间,即可确定延时函数执行时间;也可以采用反汇编方法,即利用Proteus软件将用C51编写的延时函数转换为汇编语言程序,通过计算汇编语言程序的运行时间得到该延时函数的运行时间;或者利用KeilC51编译器中的断点调试功能来模拟执行延时代码所需的时间,即在延时函数前、后设置断点,通过比较两个断点的时间变化来确定延时程序实际执行时间。
这里介绍一种与单片机教学紧密结合,又比较容易实现的方法,即是利用Proteus软件仿真功能来搭建一个硬件电路,然后将目标程序经编译后生成HEX文件,写入C51单片机中,利用Proteus中的虚拟示波器观察设置输出引脚(如P1.0)波形的变化周期来判断是否实现预定延时功能。
例如:执行上述延时10ms程序来控制输出引脚(如P1.0)变化,将其生成的.HEX文件写入单片机仿真电路中,利用Proteus中的虚拟示波器生成波形来判断是否实现预定延时功能。如上述程序的波形图如图1。
从波形图和相关旋钮可以看出,该波形的幅度为5格*1V/格=5V,高、电平为2格*5ms/格=10ms,实现其延时功能。
图1
4 结束语
本文通过分析比较,提出一种比较可靠的1ms基本延时函数实现方法,通过对该延时函数的循环,便可以实现较长时间延时。通过软件仿真,对延时控制程序的时间精确度进行验证和分析,并且可以根据实际延时输出情况进行调整。本文介绍单片机延时控制的实现方法比较容易掌握实现,对延时精确度要求不是特别高的场合,具有一定的参考和应用价值。
参考文献:
[1]陈宏希.51单片机中for循环延时时间的估算[J].兰州石化职业技术学院学报,2013,13(04):34-36.
[2]戴娟.单片机技术与应用[M].高等教育出版社,2012(10).
[3]吴挺运,林成何.KeilC51精确延时程序设计[J].电子科技,2012 (12):103-106.
[4]林立,张俊亮.单片机原理及应用——基于Proteus和Keil C(第3版)[M].电子工业出版社,2014(08).
作者简介:薛金水(1974-),男,广东兴宁人,本科,研究方向:电子信息类专业教学和研究。