51单片机的几种精确延时

发布者:好的哎最新更新时间:2016-11-18 来源: eefocus关键字:51单片机  精确延时 手机看文章 扫描二维码
随时随地手机看文章

51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高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。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。 

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++){;} 
      } 
    } 
  } 
  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个机器周期时间。

关键字:51单片机  精确延时 引用地址:51单片机的几种精确延时

上一篇:7219芯片驱动LED的电子时钟
下一篇:单片机12V数控电源

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

51单片机学习笔记(二)_流水灯实验
流水灯实验电路图 一、控制一/多灯亮灭 汇编实现 ;注释 LOOP: ;SETB P1.1 ;(1)熄灭灯 MOV P1,#0FFH; LCALL DELAY ;(2)延时一段时间 ;CLR P1.1 ;(3)点亮灯 MOV P1,#0FDH; LCALL DELAY ;(4)延时一段时间 AJMP LOOP ;(5)跳转到第一句LOOP处 ;以下子程序 DELAY: MOV R7,#250 ; D1: MOV R6,#250 ; D2: DJNZ R6,D2 ;R6=R6-1;IF(R6!=0) GOTO D2; DJNZ R7,D1 ; RET ;返回主程序 END
[单片机]
<font color='red'>51单片机</font>学习笔记(二)_流水灯实验
单片机C语言精确延时值的计算
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而51hei给出的本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。 共有三条延时函数说明如下: 函数调用分两级:一级是小于10US的延时,二级是大于10US的延时 //====================小于10US的【用1US级延时】==================== //----------微秒级延时--------- for(i=X;i X;i--) 延时时间=(3+5*X)/12 提示(
[单片机]
基于GSM模块Q2403A和8051单片机实现短消息收发系统的应用方案
基于GSM短消息的业务不需要建立拨号连接,只需把待发的消息加上目的地址发送至短消息中心,再由短消息中心转发到最终目标。GSM 短消息业务以其连接简单、费用低廉、覆盖范围广、实现方便等优点得到了广泛的应用。运用 GSM 短消息实现远程测控的可靠性较高、信号传播距离远、覆盖面积广,并且可以节省建网初期的巨额投资。 本文对基于GSM短消息收发系统的设计与实现作了具体描述,给出了系统的软硬件设计方案,对主要硬件,即GSM模块Q2403A 和8051单片机作了重点介绍。给出了系统的软件设计,包括PC与单片机通信部分和短消息收发部分。最后实现系统监控功能。 系统硬件实现 总体系统结构 该系统硬件主要由8051单片机扩展电路、Q2403
[单片机]
基于GSM模块Q2403A和80<font color='red'>51单片机</font>实现短消息收发系统的应用方案
基于51单片机的1602+ADC0832烟雾报警系统
本设计基于51单片机,共有ADC0832数模转换模块,1602液晶显示模块,按键控制与声光报警模块4大模块组成!可实现对烟雾浓度的实时监测与反应 之后是仿真目录 下面是部分代码,想要了解,可以下载文末完整附件! //基于1602+ADC0832的烟雾/温度报警系统 //作者:科技小宅神 //创作时间:2020/09/20 //版权:科技小宅神原创!抄袭必究,仅供参考学习! #include reg51.h //包含51单片机寄存器的头文件 #include 1602.h //调用1602.h文件 #include intrins.h //包含_nop_函数定义的头文件 #define uchar unsigned char #
[单片机]
基于<font color='red'>51单片机</font>的1602+ADC0832烟雾报警系统
51单片机学习——8.3--串口通信
串口通信原理 计算机串口通信基础 随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。在多微机系统以及现代测控系统中信息的交换多采用串行通信方式。 计算机通信 计算机通信是将计算机技术和通信技术的相结合,完成计算机与外部设备或计算机与计算机之间的信息交换 。可以分为两大类:并行通信与串行通信。 串行通信 串行通信是将数据字节分成一位一位的形式在一条传输线上逐个地传送。 串行通信的特点:传输线少,长距离传送时成本低,且可以利用电话网等现成的设备,但数据的传送控制比并行通信复杂。 并行通信 并行通信
[单片机]
<font color='red'>51单片机</font>学习——8.3--串口通信
51单片机+MAX7219数码管显示C程序
/************************************************** *程序名称: MAX7219 C语言控制程序 *程序功能: 3线串行控制8位共阴数码管 *3线定义:DIN 串行数据输入 * LOAD 数据锁存 * CLK 时钟输入 ***************************************************/ #
[单片机]
基于51单片机IIC通信的AT24C02学习笔记
引言 最近在学习几种串行通信协议,感觉收获很多,这篇文章是学习IIC总线协议的第一篇文章,以后还会再写一篇关于PCF8591 IIC通信的ADDA转换芯片的文章. 关于IIC总线 IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司在八十年代初设计出来的一种简单、双向、二线制、同步串行总线,主要是用来连接整体电路(ICS) ,IIC是一种多向控制总线,也就是说多个芯片可以连接到同一总线结构下,同时每个芯片都可以作为实时数据传输的控制源。主要包括启始、停止、读、写、应答信号。这种方式简化了信号传输总线接口。 IIC总线上可以挂多个器件,而每个器件都有唯一的地址,这样可以标识通信
[单片机]
基于<font color='red'>51单片机</font>IIC通信的AT24C02学习笔记
简述8051单片机结构与原理
单片机的基本结构包括中央处理器(CPU) 、存储器、定时/计数器、输入输出接口、中断控制系统和时钟电路六部分。 一、基本组成 中央处理器(CPU) 包括运算器和控制器两部分,是单片机的核心。运算器可用于各种运算,控制器用于控制单片机各部分协调工作。 存储器 用于存放程序和原始数据。 时钟电路 时钟电路产生单片机运行的控制信号,控制单片机严格按时序执行指令。 定时/计数器:实现定时或计数功能。 输入输出接口(I/O)实现单片与其他设备之间的数据传送。 中断控制系统: 用于响应中断源的中断请求; 二、单片机引脚 双列直插式封装(DIP,Dual Inline Package) 方形封装(PLCC,Plastic
[单片机]
简述80<font color='red'>51单片机</font>结构与原理
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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