一.相关换算
-
1s=10^3ms(毫秒)=10^6μs(微秒)=10^9ns(纳秒)=10^12ps(皮秒)=10^15fs(飞秒)=10^18as(阿秒)=10^21zm(仄秒)=10^24ym(幺秒)
- 物质在1秒内完成周期性变化的次数叫做频率,常用f表示。
物 理中频率的单位是赫 兹(Hz),简称赫,也常用千赫(kHz)或兆赫(MHz)或GHz做单 位。1kHz=1000Hz,1MHz=1000000Hz 1GHz=1000MHz。频率f是周期T的倒数,即f =1/T,波速=波长*频率。 而像中国使用的电是一种正弦交流电,其频率是50Hz,也就是它速度惊人的地方,一秒钟内做了50次周期性变化
-
定时器定时原理采用的方法为对某标准时钟进行记数,根据记数个数来确保定时的长短。单片机机定时器不同于8253的根本点是8253采用减法记数,而单片机内部定时器采用加法记数,原理上都为计算标准时钟的个数。系统外部时钟采用22.1184M,经2分频后成为内部时钟信号,定时器的时钟采用内部时钟信号,因此,每定时1s时间需要计系统内部时钟11059200个,即为1843200个机器周期。需要定时多长就定时多少个机器周期即可,如下图所示。
二.代码
/*********************************************************************
**
** 创建人:Fly
** 创建日期:2010.07.18
**
** 实现功能:精确定时
** 描述: 几种方法实现精确定时
** 1.中断 InitTime0();
** 2.合理运用_nop_(); Delay_10us(); Delay_1s();
** 3.循环控制void delay_50ms(unsigned int i)
**
** 适用机型:AT89S52
**
********************************************************************/
#include <at89x52.h>
#include <intrins.h>
unsigned char count = 0x00;
long i;
/*********************************************************************
**
** 实现功能:定时 10us
** 描述:_nop_();空操作为1us
**
********************************************************************/
void Delay_10us()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************************************************************
**
** 实现功能:定时 1s
** 描述:用Delay_10us()来实现;经过计算可得为3E01次
**
********************************************************************/
void Delay_1s()
{
for(i=0x00; i<0x3E01; i++) //经过计算可得为3E01次
{
Delay_10us();
}
}
void InitTime0()
{
TMOD = 0x01;
TH0 = 0x3C;
TL0 = 0xAF;
TR0 = 0x01;
IE = 0x82;
}
void Time0(void) interrupt 1
{
P1 = 0xFF;
count ++;
if( count == 0x14 )
{
P1 = 0x00;
Delay_1s();
count = 0x00;
}
TH0 = 0x3C;
TL0 = 0xAF;
}
/*********************************************************************
**
** 实现功能:定时基本时间为50ms 1s = 50ms*20次
** 描述:用Delay_10us()来实现;经过计算可得为3E01次
**
********************************************************************/
void delay_50ms(unsigned int i)
{
unsigned int j;
for(;i>0;i--)
for(j=6245;j>0;j--);
}
void main(void)
{
Delay_10us();
delay_50ms(20);
Delay_1s();
InitTime0();
while(1) {}
}
三.解释
void Delay_10us()
可以在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。通过修改基本延时函数和适当的组合调用,上述方法可以实现不同时间的延时。
void Delay_1s()
用Delay_10us()来实现;经过计算可得为3E01次
for(i=0x00; i<0x3E01; i++) //经过计算可得为3E01次
{
Delay_10us();
}
KEIL调试根据汇编代码可得出相应时间 T = 40us + 4us + 63*循环次数
其中40us 为开始为变量i(long)赋初值,函数调用4us,6us为++,与<操作,以及延时总共为63us
注意:不同的数据类型40的值不一样
四.总结
1.尽量使用unsigned型的数据结构。
2.尽量使用char型,实在不够用再用int,然后才是long。
3.如果有可能,不要用浮点型。
4.使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立)。
5.中断计时精确最高
分享到:
相关推荐
在本文中,我们将深入探讨与标题"高精度 通用C51延时程序 delay time C51 12MHz"相关的知识点,包括C51编程、延时程序的实现以及针对12MHz晶振频率的优化。 C51是Atmel公司为8051系列微控制器设计的一种高级语言,...
原理,利用h,i,j,k循环指令消耗掉一定时间来达到延时,为什么利用循环延时的做法,在12M晶振延时1秒中需要h,i,j,k四个变量,且各变量的值是上面代码中那样呢?这要从单片机的周期说起,单片机有指令周期,机器
在C51单片机编程中,延时函数是一种基本而重要的功能,它可以在程序中创建一个暂停,以满足特定的时间要求。理解并能够编写准确的延时函数是单片机开发的重要技能之一。通过这篇关于“用C51编写单片机延时函数”的...
本文将深入解析C51精确延时子程序的设计原理、注意事项及其实现方法,帮助读者理解如何在C51单片机上创建高效、准确的延时功能。 ### 延时子程序原理 延时子程序的核心在于通过循环或特定指令的执行次数来消耗CPU...
总的来说,单片机C51延时程序的设计涉及到对单片机硬件特性的理解,包括晶振频率、机器周期以及指令执行时间。通过合理地组合循环和使用定时器,可以实现从微秒到秒级的延时,满足各种应用场景的需求。对于初学者来...
/* 作者:Nick for C51 使用晶振:11.0592 MHZ 参考文档:C51精确延时程序.doc 日期:2010.11.06 5:19 */
### C51单片机1ms精准延时函数解析及实现 #### 一、引言 在嵌入式系统开发中,尤其是对于基于C51单片机的应用设计,精确控制时间延迟是十分重要的环节之一。它直接关系到系统的稳定性和可靠性。本文将详细介绍一个...
软件延时,也被称为阻塞延时,是一种简单但有效的控制程序执行时间的方法。在C51编程中,我们通常通过循环计数来实现延时。这种延时函数的设计原理是利用处理器执行循环指令的时间来达到特定的延时效果。由于不同...
5. **定时器和计数器**:8051单片机具有内置定时器/计数器,可以通过C51源程序进行配置和控制,用于定时、延时、波特率生成等任务。 6. **串行通信**:C51支持UART(通用异步收发传输器)协议,可以编写源程序进行...
《Keil C51实例程序详解》 Keil C51是专为8051微控制器设计的一种高级编程语言,它将C语言的强大功能与8051汇编语言的高效性相结合,使得8051应用开发变得更加便捷。本实例程序集是针对初学者设计的一系列教学资源...
C51源程序集锦是面向微控制器编程领域的一个重要资源,主要针对的是Atmel公司的8位AVR系列单片机。C51是Keil公司开发的一种针对8051系列微控制器的编译器,它扩展了标准C语言,以适应8051架构的特殊性。这个压缩包...
单片机C51延时时间计算是对单片机C51的延时时间进行计算和分析的技术,旨在帮助开发者实现精确的延时程序。在实际应用中,单片机的延时时间可能需要从数微秒到数秒不等,而计算延时时间是实现精确延时程序的关键。 ...
### 51单片机1ms延时程序详解 #### 一、引言 在51单片机的应用中,精确的时间控制对于实现各种功能至关重要。延时函数是实现定时控制的基本工具之一,广泛应用于定时任务、信号同步、数据采集等场景。本文将详细...
本文将深入探讨单片机中的延时程序设计方法,包括使用定时器/计数器实现精确延时、软件延时方法以及如何结合C51与汇编语言优化延时程序。 #### 二、使用定时器/计数器实现精确延时 单片机内部通常集成了定时器/...
"keil"文件可能包含的是使用Keil C51编译器编写的延时程序源代码。Keil C51是专门针对8051系列单片机的C语言编译器,具有丰富的库函数支持,使得编写8051程序更为便捷。通过Keil,开发者可以方便地调试和优化延时...
根据提供的文件信息,我们可以从《单片机高级语言C51应用程序设计》这一主题中提炼出以下相关的知识点: ### 单片机概述 单片机(Microcontroller Unit, MCU)是一种将中央处理器(CPU)、存储器(RAM和ROM)、...
《C51程序集锦》是针对51系列单片机的一份综合性的学习资源,主要包含了一系列使用C语言编写的程序示例。C51是C语言的一个变种,专为8051系列单片机设计,使得开发者能够用更高级、更接近自然语言的方式来编写单片机...
C51项目程序资料包是针对C51编程语言的一个综合资源集合,主要涉及的是基于C51编写的嵌入式系统项目。C51是Microchip Technology公司为8051系列微控制器设计的一种高级语言,它允许开发者用更接近自然语言的方式来...
HD7279是一款基于8051内核的国产微控制器,它的C51源程序是用于控制和编程这款芯片的关键工具。8051是经典的微控制器架构,广泛应用于各种嵌入式系统,而C51是针对8051系列微控制器的优化编译器,它允许开发者用...
随后重点分析了延时程序运行时间的计算方法,并针对51系列单片机中常见的汇编语言和C51语言编程,分别阐述了两种不同语言环境下延时程序运行时间的具体计算过程。 #### 1 引言 在基于51系列单片机的应用系统中,...