单片机有哪些延时方法详细介绍

发布者:古通闲人最新更新时间:2013-01-30 来源: 21ic关键字:单片机  延时方法  周期时间 手机看文章 扫描二维码
随时随地手机看文章

实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。1 使用定时器/计数器实现精确延时

单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。

2 软件延时与时间计算

在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。下面介绍几种软件延时的方法。

2.1 短暂延时

可以在C文件中通过使用带_NOP_( )语句的函数实现,定义一系列不同的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等存放在一个自定义的C文件中,需要时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

void Delay10us( ) {

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

_NOP_( );

}

Delay10us( )函数中共用了6个_NOP_( )语句,每个语句执行时间为1 μs。主函数调用Delay10us( )时,先执行一个LCALL指令(2 μs),然后执行6个_NOP_( )语句(6 μs),最后执行了一个RET指令(2 μs),所以执行上述函数时共需要10 μs。  可以把这一函数当作基本延时函数,在其他函数中调用,即嵌套调用[4],以实现较长时间的延时;但需要注意,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延时时间将是42 μs,而不是40 μs。这是因为执行Delay40us( )时,先执行了一次LCALL指令(2 μs),然后开始执行第一个Delay10us( ),执行完最后一个Delay10us( )时,直接返回到主程序。依此类推,如果是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先执行一次LCALL指令(2 μs),然后执行两次Delay40us( )函数(84 μs),所以,实际延时时间为86 μs。简言之,只有最内层的函数执行RET指令。该指令直接返回到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此时的延时时间为82 μs。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。[page]

2.2 在C51中嵌套汇编程序段实现延时

在C51中通过预处理指令#pragma asm和#pragma endasm可以嵌套汇编语言语句。用户编写的汇编语言紧跟在#pragma asm之后,在#pragma endasm之前结束。

如:#pragma asm

汇编语言程序段

#pragma endasm

延时函数可设置入口参数,可将参数定义为unsigned char、int或long型。根据参数与返回值的传递规则,这时参数和函数返回值位于R7、R7R6、R7R6R5中。在应用时应注意以下几点:

◆ #pragma asm、#pragma endasm不允许嵌套使用;

◆ 在程序的开头应加上预处理指令#pragma asm,在该指令之前只能有注释或其他预处理指令;

◆ 当使用asm语句时,编译系统并不输出目标模块,而只输出汇编源文件;

◆ asm只能用小写字母,如果把asm写成大写,编译系统就把它作为普通变量;

◆ #pragma asm、#pragma endasm和 asm只能在函数内使用。

将汇编语言与C51结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

2.3 使用示波器确定延时时间

利用示波器来测定延时程序执行时间。方法如下:编写一个实现延时的函数,在该函数的开始置某个I/O口线如P1.0为高电平,在函数的最后清P1.0为低电平。在主程序中循环调用该延时函数,通过示波器测量P1.0引脚上的高电平时间即可确定延时函数的执行时间。方法如下:

sbit T_point = P1^0;

void Dly1ms(void) {

unsigned int i,j;

while (1) {

T_point = 1;

for(i=0;i<2;i++){

for(j=0;j<124;j++){;}

}

T_point = 0;

for(i=0;i<1;i++){

for(j=0;j<124;j++){;}

}

}

}[page]

void main (void) {

Dly1ms();

}

把P1.0接入示波器,运行上面的程序,可以看到P1.0输出的波形为周期是3 ms的方波。其中,高电平为2 ms,低电平为1 ms,即for循环结构“for(j=0;j<124;j++) {;}”的执行时间为1 ms。通过改变循环次数,可得到不同时间的延时。当然,也可以不用for循环而用别的语句实现延时。这里讨论的只是确定延时的方法。

2.4 使用反汇编工具计算延时时间

用Keil C51中的反汇编工具计算延时时间,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。为了说明这种方法,还使用“for (i=0;i

C:0x000FE4CLRA//1T

C:0x0010FEMOVR6,A//1T

C:0x0011EEMOVA,R6//1T

C:0x0012C3CLRC//1T

C:0x00139FSUBBA,DlyT //1T

C:0x00145003JNCC:0019//2T

C:0x00160E INCR6//1T

C:0x001780F8SJMPC:0011//2T

可以看出,0x000F~0x0017一共8条语句,分析语句可以发现并不是每条语句都执行DlyT次。核心循环只有0x0011~0x0017共6条语句,总共8个机器周期,第1次循环先执行“CLR A”和“MOV R6,A”两条语句,需要2个机器周期,每循环1次需要8个机器周期,但最后1次循环需要5个机器周期。DlyT次核心循环语句消耗(2+DlyT×8+5)个机器周期,当系统采用12 MHz时,精度为7 μs。

当采用while (DlyT--)循环体时,DlyT的值存放在R7中。相对应的汇编代码如下:

C:0x000FAE07MOVR6, R7//1T

C:0x00111F DECR7//1T

C:0x0012EE MOVA,R6//1T

C:0x001370FAJNZC:000F//2T

循环语句执行的时间为(DlyT+1)×5个机器周期,即这种循环结构的延时精度为5 μs。

通过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

C:0x0014DFFE DJNZR7,C:0014//2T

可以看出,这时代码只有1句,共占用2个机器周期,精度达到2 μs,循环体耗时DlyT×2个机器周期;但这时应该注意,DlyT初始值不能为0。

注意:计算时间时还应加上函数调用和函数返回各2个机器周期时间。

关键字:单片机  延时方法  周期时间 引用地址:单片机有哪些延时方法详细介绍

上一篇:新手常用单片机延时程序
下一篇:单片机延时问题20问

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

MSP430单片机的特点解析
MSP430系列单片机的迅速发展和应用范围的不断扩大,主要取决于以下的特点。 a. 强大的处理能力: MSP430系列单片机是一个16位的单 片机,采用了精简指令集(RISC)结构,具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令;大量的寄存器以及片内数据存储器都可参加多种运算;还有高效的查表处理指令;有较高的处理速度,在8MHz晶体驱动下指令周期为125 ns。这些特点保证了可编制出高效率的源程序。 b. 在运算速度方面,MSP430系列单片机能在8MHz晶体的驱动下,实现125ns的指令周期。16位的数据宽度、125ns的指令周期以及多功能的硬件乘法器(能实现乘加)
[单片机]
COP8CDR9微控制器在多路数据采集中的应用
    摘要: 前端数据采集是工业生产过程中获取生产信息的必要手段。本文结合美国国家半导体的芯片COP8CDR9的A/D转换特点和应用实际,给出由COP8CDR9微控制器构成的多路数据采集系统及其在列车实时监控系统中的应用     关键词: 微控制器 多路数据采集 A/D转换 CPO8CDR9 前端数据采集能够及时获取被控对象和生产过程的有效信息,在某些实时性要求高的场合尤为重要。工业生产过程中,为了清晰地反映出生产过程的详细信息,往往需要获得多个参量的动态数据,这就有必要对被控对象和生产过程进行多路数据采集。COP8CDR9系列微控制器是美国国家半导体公司(National Semiconduto
[嵌入式]
基于51单片机蓝牙模块控制风扇运行实现的经验
本次设计实现是在智能手机上,通过蓝牙控制器 软件,控制风扇的开、关、正传、反转。单片机最小系统 模块是整个设计的核心,通过单片机程序控制蓝牙信 息的接收、发送和电机的启动、停止、左转、右转。整个 设计采用两节 4.5 V 电池供电,电机驱动电压为 9 V, 单片机模块和蓝牙模块经过电压转换到 5 V。 对于单片机的选择,设计采用 AT89C51 单片机,工作稳定,使用简单,无需设计复位电路便可工作,还 可以作为开发板使用,程序下载和仿真方面不需要特 定的程序仿真设备,在较短时间内,即可通过单片机 本身的串口实现程序下载,对于程序容量和基本控制 方面,AT89C51 单片机都能满足设计要求 。 电机驱动,采用 L9110 驱
[单片机]
累加器A与片外数据存储器RAM传送指令(4条)举例——mcs51单
累加器A与片外数据存储器RAM传送 指令 (4条) 这4条指令的作用是累加器A与片外RAM间的数据传送。使用寄存器寻址方式: MOVX @DPTR,A ;(A)→((DPTR)) 累加器中的内容送到数据指针指向片外RAM地址中 MOVX A, @DPTR ;((DPTR))→(A) 数据指针指向片外RAM地址中的内容送到累加器A中 MOVX A, @Ri ;((Ri))→(A) 寄存器Ri指向片外RAM地址中的内容送到累加器A中 MOVX @Ri,A ;(A)→((Ri)) 累加器中的内容送到寄存器Ri指向片外RAM地址中 说明: 1、在89C51中,与外部存储器RAM打交道的只可以是累加器A,所有需要送入外部RA
[单片机]
基于PIC单片机的逆变电路设计初探
  针对现代电源变频调幅的要求,提出了利用PIC16F873产生SPWM波控制IR2136触发IGBT产生PWM波作用于逆变器产生标准的正弦波形,从而实现变频调幅。同时利用AD模块对逆变桥输出进行采样并进行滤波处理,实现对系统的PI闭环控制。通过MATLAB中的SIMULINK组件进行仿真分析,结果表明此方案输出电压动态响应速度快,具有良好的精度控制及实时性、波形失真小、可靠性高。   随着科学技术的进步,电源质量越来越成为各种电气设备正常和良好工作的基础。电源技术领域的一个持续的研究课题即是研究作为电子信息产业命脉的电源的可靠性和稳定性。   而逆变器作为电源的核心部分,其调制技术很大程度上决定了电源输出电压的质量。目前最常用的
[电源管理]
基于PIC<font color='red'>单片机</font>的逆变电路设计初探
运用PSD系列器件进行单片机外围电路扩展
1 引言   典型的微控制器(MCS51系列,MCS98系列,M68000系列,PIC系列等)片的内部都集成了少量的RAM、ROM及计数器,具有有限的 I/O能力,这在构成一般小型应用系统时,或许可以满足开发者的需求。但对于大型的单片机应用系统,仅单片机内的这一点资源是远远不够的。为了扩展单片机系统,设计者不得不外加EPROM、RAM、IO端口、存储器空间译码逻辑和各类外围芯片片选译码逻辑。因此,设计者就必须根据需求加入各类芯片,并在电路设计完成以后就不能再更改电路。1990年美国的WSI公司引入了可编程系统器件PSD(Pro-grammable System Device),PSD是世界上第一个把EPROM、SRAM、可编程逻
[单片机]
运用PSD系列器件进行<font color='red'>单片机</font>外围电路扩展
基于MSP430单片机的原油含水率测定仪的设计
原油含水率测定仪出现于20世纪90年代末,它是有温控仪、定时器等开关仪表组成的一种集测量与控制于一体的蒸馏法测定原油含水率的产品,适用于石油、石化等行业中原油含水率的测量。本仪器采用MSP430单片机,是集温度控制、时间控制、蒸馏功率控制和制冷循环水控制等功能为一体的自动化、智能化仪器。 系统设计方案 1温度传感器的选择 一般情况下,在温度测量中所采用的传感器有:热电偶和热电阻两大类。本系统需测控3处的温度,由于热电偶需温度补偿,而热电阻不需要,从硬件成本和软件复杂程度考虑确定采用热电阻PT100。 2 MSP430单片机 MSP430系列单片机为低功耗16位的精简指令构架,在线可编程,将大量的外围模块整合到片
[单片机]
基于MSP430<font color='red'>单片机</font>的原油含水率测定仪的设计
MCU巨头,血拼GPU性能
曾经,MCU是电子产品的控制核心,GPU是图像世界的掌控者,二者在过去很少有交集。随着越来越多图形处理需求,MCU中放GPU,已经不是什么新鲜操作。 最近一段时间,边缘AI概念的兴起,以及汽车图形显示性能的提升,越来越多的MCU厂商开始“卷”图像处理性能。 MCU的图形历史 在那个没有GPU的时代,所有图形还都是交给CPU绘制。虽然这没什么问题,但随着显示图形图像愈发复杂,CPU越来越力不从心。对计算机来说,低效率带来的就是延迟和卡顿,整体功耗也会随之攀升,GPU便应运而生,将CPU从繁重的图形计算任务中拯救了出来。 MCU也有类似的发展历程。早期MCU极少有图形显示的需求,即便有,也只是简单的12864之类
[单片机]
<font color='red'>MCU</font>巨头,血拼GPU性能
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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