Keil C51精确延时程序设计

发布者:幸福时光最新更新时间:2013-05-18 来源: 电子设计工程 关键字:Keil  C51  C语言  软件延时  单片机 手机看文章 扫描二维码
随时随地手机看文章
    C语言具有较强的数据处理能力、语言功能齐全、使用灵活方便、开发效率高,被广泛应用于在单片机系统开发应用中。在单片机幕统开发的过程中,经常需要使用到延时程序,但C语言代码执行时间。的可预见性和实时性较差,在开发一些具有严格通信时序要求的系统时,往往需要反复调试延时代码,给开发者带来了较大困难。比如使用DS18B20进行温度测控时,必须按照其单总线通信协议,否则无法读取温度数据。针对上述问题,结合Keil C51开发工具和Proteus仿真软件,介绍在Keil C51开发系统中,利用C语言编写的延时程序设计及其运行的时间的计算方法。

1 常用延时程序的设计方法
1.1 利用定时器/计数器延时
   
利用C51单片机内部2个16位定时器/计数器实现精确的程序,由于定时器/计数器不占用CPU的运行时间,可以提高CPU的使用效率。但假设使用12 MHz晶振,定时器工作在方式1模式下,其最长定时时间也只能达到65.53 ms,由此,可以采用中断方式进行溢出次数累加的方法进行长时间的延时程序设计。但在开发过程中要考虑C51自动对断点的保护和重装初值所带来的延时误差,也可以使用定时器工作在方式2模式下,减少重装初值所带来的误差。
1.2 利用空操作实现延时
   
当所需的延时非常短,可以利用Keil C51自带intrins.h头文件中的_nop_()函数实现函数延时。
    当主程序调用delay()函数时,首先执行LCALL指令,占用2个机器周期,然后执行_nop_()函数,它相当于汇编中的NOP指令,占用一个指令周期,最后执行一个RET返回指令,一共占用5个机器周期。若要增加延时时间,可以在delay()函数中增加_nop_()函数的数目。但利用这种方法进行长时间的延时,会降低成程序的可读性。
1.3 利用C语言中嵌套汇编程序实现延时
   
与C语言相比,在编写汇编程序的时候可以清楚地知道执行每一条指令所需的机器周期,从而精确确定其执行时间。Keil C51开发环境可以实现C语言中嵌入汇编语言,可以在延时程序设计时,结合汇编语言的优点,精确确定延时时间。C语言中嵌入汇编程序的方法:
    #pragma asm
    ;汇编程序代码
    #pragma endasm
    以12 MHz晶振为例,介绍C语言嵌套汇编语言设计延时程序:
    a.JPG
    delay函数采用单循环延时,主函数调用delay函数时,首先执行LJMP指令占用2个指令,delay函数执行结束后,执行一个RET返回指令。而DJNZ执行占用2个机器周期,一共执行了10次,所以在12 MHz晶振下,延时函数执行的时间为△t=2×10+1+2+2=25μs。如果需要进行长时间延时,可以采用多重循环嵌套实现。
1.4 利用for循环实现延时
   
在单片机开发过程中,for语句和while语句也经常用于延时程序的设计。设晶振频率为12 MHz,在调用延时函数时,一共需要18个机器周期。当delay函数中的实参改变时,函数的延长时间变长,具体的延时时间△t=3×i+5×(i+1)+5。由于delay函数中变量的类型为unsigned char,最大值为255,不能进行长时间延时。可以通过改变变量的类型和利用for语句嵌套,实现长时间延时,但是延时时间的计算和delay函数有差异。
    如表1所示,在设计延时程序时,应该考虑延时的长短,开发系统的资源利用与二次开发等情况进而确定设计延时程序设计的方法。

b.JPG[page]

2 延时时间的精确计算
   
在开发过程中,经常需要知道代码执行的时间,以确定延时时间。在单片机开发中经常使用硬件或Keil C51中的一些功能来确定延时时间。下面通过在频率12 MHz晶振下的一些实例进行分析。
2.1 利用示波器确定延时时间
   
单片机系统开发应用中,经常用示波器来确定代码执行的时间,如在延时后面进行IO口中的某位电平翻转,用示波器来观察IO中某位输出的标准PWM波形来确定延时时间,但是此方法必须是用来计算延时时间为毫秒级别的延时程序,否则会存在误差因为在进行IO口电平翻转和程序执行结束跳转到while函数入口,需要占几μm的时间。例如上面介绍的for循环编写的延时程序中,假设实参为249,则△t=3×249+5×(249+1)+5=2 002μs≈2 ms。
    c.JPG
    将上述代码经编译后生成HEX文件,写入C51单片机中,利用Proteus中的虚拟示波器观察P1.0后波形的变化。

d.JPG


    从图1的PWM波形可以看出,高电平或者低电平占的时间分别为2 ms,即为以上延时程序所执行的时间,由于示波器精度的问题,存在误差为2μs。所以用这种方法确定延时时间,会存在一定误差。
2.2 利用Keil C51确定延时时间
2.2.1 Keil C51反汇编
   
对于经验丰富的开发者,可以利用Keil C51中反汇编的功能,仔细分析C语言转化成的汇编代码,从而也可以计算出代码执行所需的时间,精确得出延时时间。在Keil C51中编写好程序后,按ctrl+F5进入软件调试状态,然后点击工具栏的view → disassembly window,即可看到编译生成的汇编代码。例如2.1中例子的汇编代码为:
    e.JPG
    分析上面的汇编代码,可以看出调用delay函数时,先执行MOV R7,#0xF9然后执行LACALL跳转到delay函数的入口处,一共占用3个机器周期。而地址0x000F到0x0013的指令一共被执行了250次,0x0015到0x0016的语句被执行了249次。最后执行PET语句,占用2个机器周期。则delay函数的执行时间△t=3×249+5×250+5=2 002μs。另外从上述汇编语句中可以看出,P1=P1^0x01相当于汇编中XRL direct,#data指令,占用2个机器周期。
2.2.2 Keil C51软件调试模式
   
在开发过程中,还可以利用Keil C51编译器中的断点调试功能来模拟执行延时代码所需的时间。上述举例进入软件调试状态后如图2所示。

f.JPG

[page]

    光标为当前程序的停止处,左侧的寄存器窗口可以看到一些寄存器名称及其值。可以通过设置断点的功能,每遇到断点,程序会自动停止在断点处。“sec”中数据的变化即为程序执行处到断点处所需的时间。对上述程序将断点设置在“P1=P1^0x01”代码处,然后点击全速运行可以得表2所示。

g.JPG


    从表2可以看出,delay函数执行的时间△t=2 391-389=2 002μs,与理论分析结果一样。

3 应用实例
   
DS18B20是一款单总线数字式温度传感器,对其控制必须按照严格的时序要求,有3个重要时序,分别是初始化、读以及写时序,时序图如图3所示。

h.JPG


    由图3可知,涉及到延时程序的要求为:
    初始化。(1)将总线低480~960μs,然后释放总线。(2)DS18B20等待15~60μs,然后返回低电平并持续60~240μs的存在脉冲。
    写时序。(1)将总线置低电平并且持续15μs后发送数据的某一位。(2)延时60~120μs然后将总线拉高并持续至少1μs的时间后开始下一次发送。
    读时序。(1)将总线置低电平,并且持续至少1μs,然后释放总线。(2)释放总线后15μs内读取并处理数据。(3)处理数据后延时,保证第一个步骤到延时结束时间至少60μs后为电阻上拉状态。
    采用延时程序的设计方法,利用for循环编写delay函数和_nop_()函数控制DS18B20。
    通过以上延时程序的控制方法,DS18B20稳定实现了温度采集。充分说明了高效的延时程序设计,在开发一些需要使用到延时程序时,可以先用Keil C51先设计好延时程序,然后利用以上方法进行分析计算,最后直接调用,可节省大量的时间、提高CPU的使用效率。

4 结束语
    Keil C51具有强大的功能,只要利用合理,可以给开发者节省大量的时间,从而提高开发效率。另外在设计延时程序的时候,应该综合考虑各种延时程序的特点,以优化CPU的使用效率。

关键字:Keil  C51  C语言  软件延时  单片机 引用地址:Keil C51精确延时程序设计

上一篇:基于Proteus的温控报警器设计
下一篇:51单片机P0口什么时候使用上拉电阻?

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

STM32单片机学习笔记(2):DHT11温湿度传感器
项目简介 利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第二部分针对单总线通信的一个典型例子——DHT11温湿度传感器,主要用于对STM32中GPIO模块和单总线通信的理解。 硬件模块 STM32F103R4 DHT11 LCD1602 74HC373 软件工具 CubMX Proteus KEIL 电路连接图 STM32F103R4 DHT11 LCD1602 工作流程 首先还是先利用CubMX创建一个KEIL工程设置PA0位DHT11的数据口,这里之所以选用PA0,主要是有些版本的Prot
[单片机]
STM32<font color='red'>单片机</font>学习笔记(2):DHT11温湿度传感器
低功耗高能效的电源MCU方案
  当电池需要在几年甚至几十年中为某个产品供电时,不断改进MCU集成产品和轻微修改基本处理器结构都不能满足人们急剧增加的节能需要。针对很多能源敏感产品,如:计量器、楼宇自动化产品、安全产品和便携式医疗设备,如果节能需求和处理功率之间发生了冲突,就必须要大规模发展MCU设计。   EnergyMicro采用了一种‘bluesky’的方法来设计它的低功率EFM32Gecko微处理器,也开发了支持这个产品的软件和硬件工具(图1)。EnergyMicro现已生产了一种装置,仅够消耗现有8位、16位和32位MCU所耗能量的四分之一,使现有电池的寿命大大延长了。换句话说,有了这样的节能MCU,产品设计人员能够大大削减电池的成本、缩小它的尺寸
[单片机]
低功耗高能效的电源<font color='red'>MCU</font>方案
STM32单片机智能电饭煲系统设计方案
一、功能简介 本项目使用Proteus8.12仿真STM32单片机控制器,使用继电器加热/保温模块、数码管模块、按键模块、LED指示灯、蜂鸣器模块等。 主要功能: 系统运行后,数码管默认不显示,当按下K5键选择功能模式,此时数码管会显示对应模式所需时间,且LED指示灯工作,系统默认有煮饭、煮粥、蒸、煲汤四种功能,还可按下K6键设置预约时间,通过K2和K3键修改时间,当设置好时间后,按下K4键开始,预约时间开始倒计时,当时间达到后,继电器开启加热,在所选功能时间倒计时结束后停止加热,开启保温。若不需要保温,可按下K1键关闭。 主要功能如下: (1)功能:煮饭、煮粥、蒸、煲汤; (2)按键:开始、取消、功能、加减、预约; 二、
[单片机]
STM32<font color='red'>单片机</font>智能电饭煲系统设计方案
51单片机的串口通信原理
一、并行和串行通信方式 通信有并行和串行两种通信方式。在单片机系统以及现代单片机测控系统中信息交换多采用串行通信方式。 1、并行通信方式 并行通信通常是将数据字节的各位用多条数据线同时进行传送,每一位数据都需要一条传输线。如下图所示,8位数据总线的通信系统,一次传送8位数据(1字节),需要8条数据线。还需要一条信号线和若干控制信号线,这种方式仅适合短距离的数据传输。 2、串行通信方式 串行通信方式是将数据字节分为一位一位的形式在一条传输线上逐个传输,此时只需要一条数据线,外加一条公共信号地线和若干控制信号线。因为一次只能传输一位,所以1字节的数据至少要分8位才能传输完毕。如下图所示 串行通信的必要过程是:发送时把并行数据变
[单片机]
51<font color='red'>单片机</font>的串口通信原理
PIC单片机之时钟设置
什么时钟? 首先我们先讲讲什么是时钟。时钟就是单片机的心脏。每跳动一下。整个单片机的各个电路就同步的动作一下。就好像我们做广播体操的时候 广播上喊的节拍1234 2234 3234。。。。然后我们全部的同学就按照这个节奏进行一个个动作。节拍越快我们动作越快。节拍越慢我们动作的越慢。 内部时钟和外部时钟? PIC单片机有许多型号可以设置成 用外部时钟(如外部接个4MHZ的石英晶振),也可以设置成用内部RC时钟。而且还有许多型号可以选择多种频率的时钟。 如 PICLF1823 内部时钟最高可以到达32MHZ 最低可以达到 31kHz. 这事实上提供了一条降低功耗的新路子。一般的单片机降低功耗常常用的睡眠,而睡眠期间CPU是什么都
[单片机]
PIC<font color='red'>单片机</font>之时钟设置
基于89C52/C51系列单片机实现电力载波模块的设计及应用研究
电力载波(PowerLine CarrierWave,简称PLCW)通信是利用电力线进行信息传送的一种通信方式。电力载波通信在远程三表(水表、电表、煤气表)信息的自动采集和传输中得到广泛的应用,在智能小区建设中备受青睐。随着信息技术的发展,智能化网络家电逐渐成为研究热点,而将电力载波应用于智能化网络家电控制则刚刚开始。国内目前尚未有应用于智能化网络家电控制的电力载波通讯产品的研究报道;而国外已经有稳定的构建智能化网络家电的电力载波通讯产品,但其价格昂贵,中国普通家庭难以接收,而且电压是110V,也不适合中国国情。因此,有必要对电力载波技术进行深入探索,研究开发出适合中国国情、成本低廉而可靠的电力载波通讯产品。 将电力载波应用于智能
[单片机]
基于89C52/<font color='red'>C51</font>系列<font color='red'>单片机</font>实现电力载波模块的设计及应用研究
基于AVR单片机的ISP1362OTG设计
0 引言   本文采用的设计方案是基于Philips公司的ISP1362 OTG控制芯片,参照最新的USB OTG技术规范,设计了一种遵循USB协议的主/从机系统。   1 ISP1362芯片的内部结构   Philips公司的ISP1362是一款符合USB 2.0总线协议的接口芯片,内部有3个USB控制器一主机控制器、设备控制器和OTG控制器。其中,主机控制器具备高度优化的USB主机功能;设备控制器则具有多达14个可编程端点,又可以被配置成双缓冲端点进一步提高吞吐量:而OTG控制器主要提供包括监控和转换功能在内的所有OTG控制。ISP1362内部构造如图1所示。      2 USB OTG主/从机系统设计   
[模拟电子]
基于AVR<font color='red'>单片机</font>的ISP1362OTG设计
基于SST89C54/58的单片机仿真器的设计
1 概 述   SST89C54/58(简称89C54/58)是美国SST公司推出的多用途51系列单片机,片内集成了20 kB/36 kB的SuperFlashE'PROM程序存储器,分为BLOCK0(16kB/32kB)和BLOCKl(4kB)两块。其中,BLOCKl可以映射(Mapping)到64kB存储空间的最高端或最低端,而且,对于程序计数器来说可以是不可见的。由于其存储结构上独特的优点,使得89C54/58非常适合于用做单片机仿真器。 2 SST89C54/58的程序存储结构 2.1 存储器结构   89C54/58片内的存储块BLOCK0占据从0000H到3FFFH/7FFFH的存储空间,BLOCKl占据从F0
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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