当前位置:首页 > 单片机 > 单片机
[导读]一、实现延时的两种方法1、硬件延时优点:用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;缺点:往往在精度要求不是很高时,会使定时器/计数器大材小用,而且很极端时,定时器根本不够的。2、

一、实现延时的两种方法


1、硬件延时

优点:用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;

缺点:往往在精度要求不是很高时,会使定时器/计数器大材小用,而且很极端时,定时器根本不够的。

2、软件延时

优点:节省硬件资源的同时,只要正确使用可接近要求的精度,这种方法主要采用循环体进行;

缺点:精度不高,对编程者经验要求甚高。

二、硬件延时

1、常用晶振:11.059 2 MHz(容易产生各种标准的波特率)、12 MHz或6 MHz(机器周期

分别为1 μs和2 μs,便于精确延时)。

2、本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达2的16次方=65 536。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考

虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

3、在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延

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

三、软件延时(通过调用延时函数)


1、调用延时函数三要素:

入口周期Te、返回周期Tr、内部代码执行周期Ti

则:该函数总执行周期Tf=Te+Tr+Ti;其中:Ti=循环次数*循环周期N

2、短暂延时

如Delay10us( ):总执行高峰期为10us=2us+6us+2us.

void Delay10us()

{

_nop_;

_nop_;

_nop_;

_nop_;

_nop_;

_nop_;

}

说明:不宜嵌套调用,嵌套次数越多误差越大。

3、在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结合起来,充分发挥各自的优势,无疑是单片机开发人员的最佳选择。

4、使用示波器确定延时时间

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

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

说明:这里讨论的只是确定延时的方法。

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

对于不熟悉示波器的开发人员可用Keil C51中的反汇编工具计算延时时间,在反汇编窗

口中可用源程序和汇编程序的混合代码或汇编代码显示目标应用程序。但要求对于汇编的指令周期要熟悉。

说明:此种方法如果你熟悉汇编指令周期是比较简单的,这里不作详细讨论。

6、使用性能分析器计算延时时间(即:Keil C51的debug技巧)

A51的程序执行时间可能通过指令周期计算出来,而C51的却无从下手,很多程序员为了得到精确的执行时间而研读反汇编代码,何等的悲哀。巧妙的使用Keil中的debug功能,问题就迎刃而解了。
下面举例说明:

该程序为一个延时程序,在12M的晶振下,调用一次的时间为16uS ,执行一次循环的时间为9uS(延时范围(25us~589.831ms))。这样来,假设有语句Delay(N);那么该语句的精确延时的计算公式就是(9*N+16)uS了.这个公式可以理解吧!
如何得到程序的调用时间和执行一次循环的时间了。接着看下面:

在主程序MAIN()函数下添加上面两条语句,当前的SEC栏为执行到DELAY(1);语句所花的时间。T(0-)


上面的SEC栏为执行完DELAY(1)所花的时间,这样就可以得到DEALY(1)这条语句的执行时间为595-570=25uS.

上面的SEC栏为执行完DELAY(2)所花的时间,这样就可以得到DEALY(2)这条语句的执行时间为629-595=34uS.
结果不就出来了嘛,T[DELAY(2)]-T[DELAY(1)]不就是执行一次循环的时间嘛,

而T[DELAY(1)]减去执行一次循环的时间就是调用一次要花的时间了。精确到1个机器周期。(这里可以通过列简单的一元二次方程组求出来的,因此不作详细讨论)


本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

嵌入式开发作为一种专业且技术密集型的领域,涵盖了从硬件底层驱动、中间件到应用层软件开发等多个层面的工作,其所需的工具种类繁多,各有针对性,旨在提升开发效率、保证代码质量以及简化调试过程。

关键字: 嵌入式开发 keil

单片机内部有很多的特殊功能寄存器,每个寄存器在单片机内部都分配有唯一的地址,一般我们会根据寄存器功能的不同给寄存器赋予各自的名称,当我们需要在程序中操作这些特殊功能寄存器时,必须要在程序的最前面将这些名称加以声明,声明的...

关键字: C51 数据类型 扩充定义

数据元(Data Element),也称为数据元素,是用一组属性描述其定义、标识、表示和允许值的数据单元,在一定语境下,通常用于构建一个语义正确、独立且无歧义的特定概念语义的信息单元。数据元可以理解为数据的基本单元,将若...

关键字: C51 数据类型

之后新建新的工程,添加.a文件就可以使用了,当然也可以使用keil来添加,但是keil默认的是用.lab,需要自己配置一下文件属性,改为lib文件即可。一半release sdk的时候用这种方式很关键的,毕竟自己的核心代...

关键字: keil 文件属性 lib文件

▼点击下方名片,关注公众号▼欢迎关注【玩转单片机与嵌入式】公众号,回复关键字获取更多免费资料。回复【加群】,限时免费进入知识共享群;回复【3D封装库】,常用元器件的3D封装库;回复【电容】,获取电容、元器件选型相关的内容...

关键字: C51 MDK RealView

在Keil C51软件中51单片机的中断服务和外设驱动程序的开发

关键字: keil5 编译 C51

Intel公司1980年推出了MCS-51系列单片机:集成 8位CPU、4K字节ROM、128字节RAM、4个8位并口、1个全双工串行口、2个16位定时/计数器。寻址范围64K,并有控制功能较强的布尔处理器。 80C5...

关键字: C51 KEIL 编程

c上标3下标5怎么算用计算机,c上标3下标5怎么算

关键字: C51 KEIL

DSP28335与AD7606通过SPI的串行数据交互

关键字: keil C

AD7606的并行采集

关键字: ad7606 数据 C keil
关闭
关闭