Keil C51程序设计中精确延时的总结

发布者:Whisper123最新更新时间:2016-11-24 来源: eefocus关键字:Keil  C51  精确延时 手机看文章 扫描二维码
随时随地手机看文章

一、实现延时的两种方法


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  精确延时 引用地址:Keil C51程序设计中精确延时的总结

上一篇:Keil C51使用教程---开发系统基本知识(一)
下一篇:C51的日历时钟程序

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

让ADS与KEIL共存 Warning: L6373W: libattrs.map file not found
注意:不能共存,自己电脑上还是把ads卸载了。 【提要】本篇《 MDK V4.60版本,安装完成后,打开工程编译会出现如下警告与错误的问题_》由66test小编特别为需要经典综合文库的朋友收集整理,仅供参考。 MDK V4.60版本,安装完成后,打开工程编译会出现如下警告与错误: 1、xxxxx.axf: Warning: L6373W: libattrs.map file not found in System Library directory C:Program FilesARMADSv1_2LIBarmlib. Library selection may be impaired. 2、xxxxx.axf: W
[单片机]
使用notepad++作为keil的外部编辑器
之前一直不喜欢keil的编辑界面,但是又不想太浮夸。看到很多群里有人用vscode写stm32的序,但是直接用vscode编写的花,各种设置很麻烦。而且还不能调试。于是想到有没有一个轻便简约的外部编辑器呢?你还别说,真有。notepad++就是这样一款轻量级的外部编辑器。可以说是秒开。 notepad官网: https://notepad-plus-plus.org/ 可以下载最新版,安装ing 安装好之后,在MDK5的界面点击这个: 打开之后填写如下: 然后你的那个选项里面就多了一个可用的外部编辑器。 点开它!! 然后就会打开界面简洁完美的notepad++,但是刚打开会发现他默认打开的是你在MDK里面编辑
[单片机]
使用notepad++作为<font color='red'>keil</font>的外部编辑器
基于keil5新建STM32F10x寄存器版本工程
一、前言 前面文章分享了很多关于STM32F103系列知识点、物联网相关的小项目,工程都采用的是寄存器方式编写;很多小伙伴接触STM32开始都采用库函数编程,不清楚如何使用寄存器方式开发STM32;这篇文章就讲一下如何新建寄存器风格的STM32工程,并介绍需要用到哪些官方系统文件等。 比较具有代表性的几篇物联网教程: 1. 智慧农业项目(基于腾讯物联网服务器) 2. 遥控小车项目 3. 智能门锁项目(基于腾讯物联网服务器) 4. 物联网项目(基于阿里云物联网服务器) 5. 智能家居项目(基于中国移动OneNet物联网服务器) 二、环境介绍 开发环境: keil5.25 编程语言: C语言 操作系
[单片机]
基于<font color='red'>keil</font>5新建STM32F10x寄存器版本工程
STM32:keil的软件逻辑分析仪( logic analyzer)使用
在keil MDK中软件逻辑分析仪很强的功能,可以分析数字信号,模拟化的信号,CPU的总线(UART、IIC等一切有输出的管脚),提供调试函数机制,用于产生自定义的信号,如Sin,三角波、澡声信号等,这些都可以定义。   以keil里自带的stm32的CPU为例,对PWM波形跟踪观测,打开C:\Keil\ARM\Boards\Keil\MCBSTM32\PWM_2目录下的stm32的Dome,第一步:进行仿真配置,如图: 把开工程中的Abstract.txt文件有对工程的描述,PWM从PB0.8和PB0.9输出,稍后将它加入软件逻辑分析仪里。 The 'PWM' project is a simpl
[单片机]
STM32:<font color='red'>keil</font>的软件逻辑分析仪( logic analyzer)使用
Keil C51使用教程---高级编程(四)
本章讨论以下内容: ●绝对地址访问 ●C与汇编的接口 ●C51软件包中的通用文件 ●段名转换与程序优化 第一节 绝对地址访问 C51提供了三种访问绝对地址的方法: 1. 绝对宏: 在程序中,用“#include”即可使用其中定义的宏来访问绝对地址,包括: CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD 具体使用可看一看absacc.h便知 例如: rval=CBYTE ;指向程序存贮器的0002h地址 rval=XWORD ;指向外RAM的0004h地址 2. _at_关键字 直接在数据定义后加上_at_ const即可,但是注意: (1)绝
[单片机]
关于keil调试不能下断点的问题解决
原因其实很简单,keil默认设置的优化等级太高了!需要更改下即可 改成0后,任何地方就都能下断点了 对了,改完之后不要忘记编译,完了之后才生效
[单片机]
关于<font color='red'>keil</font>调试不能下断点的问题解决
C51玩8x8LED点阵:PointGame
** 前言 ** 我借同学的光驱把光盘中的文件拷出来后,开始尝试玩一玩单片机。 目前做的比较难的是8X8Led点阵的使用,元件感觉有点多啊。 我用的是普中科技HC6800-ES V2.0的开发板,很多人说什么普中垃圾,我觉得还是他们自己C语言和数电等知识还没弄懂之类的吧。还有老师的教程到8X8LED点阵这里,很多人说有问题,我甚至见过一篇博客写这个教程但是在结果后写:没有显示… dots… 也是,视频里说了有个地方需要短接的,至于是哪里,请往下看! 像以往一样,做个预想,这篇结束时,可以尽量在LED点阵上显示文字等。 ** 8X8LED阵列 ** 我用的单片机中的LED阵列是左边这种。 行,是D7~D0,而列是P0
[单片机]
<font color='red'>C51</font>玩8x8LED点阵:PointGame
C51跟atmega64的串行通信及PROTEUS仿真设计
script src="/jf/jf-arcMain-1.js" type=text/javascript /script script type=text/javascript /script script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript /script script src="http://pagead2.googlesyndication.com/pagead/js/r20110914/r20110914/show_ads_impl.js" /script script src="
[单片机]
<font color='red'>C51</font>跟atmega64的串行通信及PROTEUS仿真设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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