历史上的今天
今天是:2025年03月11日(星期二)
2018年03月11日 | 一种比较实用的定时程序的简单的设计方法探讨
2018-03-11 来源:eefocus
在单片机的控制应用中,常有延时的需要。使用汇编语言可以编制能够精确控制延时时间的程序,但参数计算却比较复杂。延时参数的计算,是一个让专业人员都感到头痛的问题。
为了工作需要,专业人员一般都建立有满足不同延时需要的程序。但对于初学者来说,却是一个比较困难的问题。利用WAVE3.2集成调试软件的强大仿真调试功能,通过反复几次修改延时参数,就可以轻而易举地编制出精确延时程序,即使是初学者也不例外。下面通过一个实例,介绍这种编制精确延时程序的方法。
10ms精确延时程序的编制与调试
1.基本程序编制
延时程序的延时时间主要与两个因素有关,一是所用晶振的频率,二是延时程序中的循环次数。晶振确定之后,则主要是如何设计和计算需给定的延时循环次数。例如假设晶振频率为6.000MHz,如果不计子程序调用、子程序返回等因素的影响,则单重循环程序能够实现的最大延时时间为255×2×2μs≈1ms;二重循环程序能够实现的最大延时时间为255×255×2μs=130.05ms;三重循环程序能够实现的最大延时时间为255×255×255×2μs=3.316275s。因此,实现延时10ms的程序,需要使用二重循环程序,且第二重循环程序需要循环的次数大约为:AT=10ms/1ms=10(次)。因此,10ms延时的基本程序如下:
DELY10ms:MOVR0,#255;第
一重循环的次数装入R0
LOOP2:MOVR1,#10;第二重
循环的次数装入R1
LOP1:DJNZR0,LOOP1
DJNZR1.LOOP2
RET
2.WAVE3.2集成调试软件参数设置和延时时间基本程序的测试
运行WAVE3.2集成调试软件,并对软件的“仿真器”选项中的“仿真头设置”项的“晶体频率”进行如下图所示的设置。

将以上基本程序输入新创建的文件,进行编译后,即可进行基本程序的测试,下面介绍两种简单的测试方法:
(1)使用“执行到光标处”的方式进行程序测试步骤如下:
A.将光标移到“RET”指令处(单击一下,可以看到光标在这一行上闪烁);B.按“执行到光标处”快捷键F4或从菜单栏“执行/执行到光标处”。
(2)使用“设置断点”的方式进行程序测试步骤如下:
A.将光标移到“RET”指令处,按“断点/取消断点”快捷键CTRl+F8或从菜单栏“执行/设置/取消断点”,进行断点设置(设置成功的画面如下图);B.按全速执行快捷键Ctrl+F9或从菜单栏“执行/全速执行”。
通过以上任意一种方式的操作,程序运行到“RET”行将自动停止。即可看到图3所示的执行结果,在WAVE3.2集成调试软件的窗口下部的“执行时间”窗看到这段程序的执行时间为10262.0μs。
3.延时时间程序的初步调试
通过延时时间基本程序的测试,看到这段程序的执行时间为10262.0μs。
比目标延时需要多了262μs。如何得到更加精确的延时,是软件延时的难点。
由以上10ms延时的基本程序可见,第一重循环的参数变化1与第二重循环的参数变化1,对定时时间的影响是不同的。这与4×400m接力赛类似,第二重循环的参数相当于是4个人,第一重循环的参数相当于是400m,如果人数变化1个数值,而保持单位路程仍为400m,则总路程将变化400m;如果保持人数不变,而单位路程变化1m,则总路程将变化4m。由此可见,第二重循环的参数变化对定时时间的影响更大。延时程序可以通过增减循环程序段的循环参数的数值来进行延时时间的基本调整。
由于延时仅多了262μs,因此,可以通过调整第一重循环的参数来进行初步调整。将传送给R0的循环的参数改为245,编译后,重新进行测试,程序的执行时间变为9862.0μs,延时误差为-138μs;将传送给R0的循环的参数改为248后测试,程序的执行时间变为9982.0μs,延时误差为-18μs;将传送给R0的循环的参数改为249,编译后,重新进行测试,程序的执行时间变为10022.0μs,延时误差为+22μs。至此,最后的两个结果,对于要求不是很高的控制过程,这样的延时精度已经足够了。
4.延时程序的精确调试
如果要进一步提高延时精度,需要对延时程序进行微调。在程序中,对延时时间进行微调的方法是:在程序中加入只是起到调节机器周期作用的指令。常用1字节空操作指令NOP进行微调。通过微调后的程序编译后,进行测试,程序的执行时间变为10000.0μs。经微调后的程序如下:
DELY1S:MOVR1,#10
LOOP2:MOVR0,#248
LOOP1:DJNZR0,LOOP1
DJNZR1.LOOP2
NOP
……
RET
本文只是探讨了一种比较实用的定时程序的简单的设计方法,适用于初涉自动控制系统开发的初学者。对于精确的计时系统的开发,单纯采用提高延时子程序的方式是不可取的。
下一篇:一个循迹小车的C语言程序
史海拾趣
|
我这里只提一些基础的入门概念,给真正的入门者起一点抛砖引玉的作用。 一块我们刚刚从商家手里拿到的单片机芯片,还是一块空白,什么也做不了。如同一个刚出世的孩子,我们开发人员要做的,就是教会单片机处理各种各样的问题,给单 ...… 查看全部问答> |
|
VxWorks应用设计高级研习班 通过VxWorks培训课程的学习,学员将可以对当今最主流的高端嵌入式操作系统VxWorks有一个全面的了解,具备使用VxWorks开发基于VxWorks的驱动程序、BSP和应用程序的能力。本课程注重实际经验的 ...… 查看全部问答> |
|
EVC 中怎么提取专号的短信.同时不影响其它号的信息. 我想提出一个特定号码的短信,对它的处理入在专用的文件夹中(专用). 我的程序已连GPRS的.… 查看全部问答> |
|
还在因为手机的续航问题每天按时回家么?自己做一个电源,即使你随身带不同品牌、不同型号不同接口的两部或者以上手机,也毫无压力。一个电源能有效延长你的夜生活时间,你还犹豫什么? DIYer: fu-80 制作时间: 一天 制作难度: ...… 查看全部问答> |
|
typedef struct { uint8 *rxBuf;//接收缓存 uint8 rxHead;//头 uint8 rxTail;//尾 uint8 rxMax;//接收最大长度 uint8 rxCnt;//计数 uint8 rxTick;//时间 uint8 rxHigh;//高位 uint8 *txBuf; #if HAL_UART_BIG_TX_BUF uint16 txHead; ui ...… 查看全部问答> |
|
日本欧姆社电子类图书系列(2.16 新增数字图像处理系列丛书) 2月10日,增加“机器人竞技系列”(共7本书),详见6楼。 2.15 新增OHM实用手册系列丛书(共5本),详见12楼. 2.16 新增数字图像处理系列(2本),详见14楼 休假的时间总是很短,转眼春节假期已经结束了,接下来又该步入学习 ...… 查看全部问答> |




