51单片机延迟函数

合集下载

基于51单片机的精确延时(微秒级)

基于51单片机的精确延时(微秒级)

声明:*此文章是基于51单片机的微秒级延时函数,采用12MHz晶振。

*此文章共包含4个方面,分别是延时1us,5us,10us和任意微秒。

前三个方面是作者学习过程中从书本或网络上面总结的,并非本人所作。

但是延时任意微秒函数乃作者原创且亲测无误。

欢迎转载。

*此篇文章是作者为方便初学者使用而写的,水平有限,有误之处还望大家多多指正。

*作者:Qtel*2012.4.14*QQ:97642651----------------------------------------------------------------------------------------------------------------------序:对于某些对时间精度要求较高的程序,用c写延时显得有些力不从心,故需用到汇编程序。

本人通过测试,总结了51的精确延时函数(在c语言中嵌入汇编)分享给大家。

至于如何在c 中嵌入汇编大家可以去网上查查,这方面的资料很多,且很简单。

以12MHz晶振为例,12MHz 晶振的机器周期为1us,所以,执行一条单周期指令所用时间就是1us,如NOP指令。

下面具体阐述一下。

----------------------------------------------------------------------------------------------------------------------1.若要延时1us,则可以调用_nop_();函数,此函数是一个c函数,其相当于一个NOP指令,使用时必须包含头文件“intrins.h”。

例如:#include<intrins.h>#include<reg52.h>void main(void){P1=0x0;_nop_();//延时1usP1=0xff;}----------------------------------------------------------------------------------------------------------------------2.延时5us,则可以写一个delay_5us()函数:delay_5us(){#pragma asmnop#pragma endasm}这就是一个延时5us的函数,只需要在需要延时5us时调用此函数即可。

51单片机delay()延时的用途和用法讲解

51单片机delay()延时的用途和用法讲解

{ unsigned int i; for(i=0;i<uiDelayShort;i++) { ; //一个分号相当于执行一条空语句 }
}
/* 注释八: * delay_long(unsigned int uiDelayLong)是大延时函数, * 专门用在上电初始化的大延时, * 此函数的特点是能实现比较长时间的延时,细分度取决于内嵌 for 循环的次数, * uiDelayLong 的数值的大小就代表里面执行了多少次 500 条空指令的时间。 * 数值越大,延时越长。时间精度不要刻意去计算,感觉差不多就行。 */ void delay_long(unsigned int uiDelayLong) {
unsigned int i; unsigned int j; for(i=0;i<uiDelayLong;i++) {
for(j=0;j<500;j++) //内嵌循环的空指令数量 { ; //一个分号相当于执行一条空语句 }
}பைடு நூலகம்}
void initial_myself() //初始化单片机 {
led_dr=0; //LED 灭 } void initial_peripheral() //初始化外围 {
delay()延时的用途讲解
(1)硬件平台:基于朱兆祺 51 单片机学习板。
(2)实现功能:让一个 LED 闪烁。
(3)源代码讲解如下:
#include "REG52.H"
void initial_myself(); void initial_peripheral();
void delay_short(unsigned int uiDelayshort); void delay_long(unsigned int uiDelaylong); void led_flicker();

51 单片机 定时器 延时1s函数

51 单片机 定时器 延时1s函数

51 单片机定时器延时1s函数1.引言1.1 概述本文介绍了51单片机中的定时器功能以及如何通过定时器实现延时1秒的函数。

在单片机应用中,定时器是一种非常重要且常用的功能模块之一。

它能够精确计时,并可用于实现周期性的任务触发、计时、脉冲输出等功能。

本文首先将对51单片机进行简要介绍,包括其基本概念、结构和特点。

随后,重点讲解了定时器的基本原理和功能。

定时器通常由一个计数器和一组控制寄存器组成,通过预设计数器的初值和控制寄存器的配置来实现不同的计时功能。

接着,本文详细介绍了如何通过编程实现一个延时1秒的函数。

延时函数是单片机开发中常用的功能,通过定时器的计时功能可以实现精确的延时控制。

本文将以C语言为例,介绍延时函数的编写步骤和原理,并给出示例代码和详细的说明。

最后,本文对所述内容进行了总结,并展望了定时器在单片机应用中的广泛应用前景。

通过学习定时器的相关知识和掌握延时函数的编写方法,我们可以更好地应用定时器功能,提高单片机应用的效率和精确性。

综上所述,通过本文的学习,读者可全面了解51单片机中定时器的功能和应用,并能够掌握延时函数的编写方法,为单片机应用开发提供一定的参考和指导。

1.2 文章结构本文以51单片机定时器功能为主题,旨在介绍如何使用定时器进行延时操作。

文章分为引言、正文和结论三个主要部分。

在引言部分,首先会对文章的背景进行概述,介绍单片机的基本概念和应用领域。

然后,给出本文的整体结构,并阐述文章的目的和意义。

正文部分将分为两个小节。

在2.1节中,将对单片机进行详细介绍,包括其构造与工作原理。

这部分的内容将帮助读者全面了解单片机的基本知识,为后续的定时器功能介绍打下基础。

2.2节将重点介绍定时器的功能和特点。

这部分将涵盖定时器的基本原理、工作模式以及在实际应用中的使用方法。

同时,还将详细讲解如何使用定时器进行1秒钟的延时操作,包括具体的代码实现和注意事项。

结论部分将对全文进行总结,并强调定时器的重要性和应用前景。

转用C51编写单片机延时函数

转用C51编写单片机延时函数

转用C51编写单片机延时函数这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us.参考了51单片机Keil C延时程序的简单研究后,我们可知道,在Keil C 中获得最为准确的延时函数将是void delay(unsigned char t){while(--t);}反汇编代码如下:执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,在不计算调用delay()所需时间的情况下,具体时间延时如下:t Delay Time(us)1 2×1+2=4 22×2+2=6 N2×N+2=2(N+1)当在main函数中调用delay(1)时,进行反汇编如下:调用delay()时,多执行了两条指令,其中MOV R,#data需要1个机器周期,LJMP需要2个机器周期,即调用delay()需要3us.Keil C仿真截图与计算过程:加上调用时间,准确的计算时间延时与Keil C仿真对比如下:(可见,仿真结果和计算结果是很接近的)t Delay Time(us)仿真11.0592 Mhz时钟(us)1 3+2×1+2=7|7.7(实际)7.60 23+2×2+2=9|9.9 9.76 N3+2×N+2=2N+5|(2N+5)*1.1/3 11|12.1 11.94 15 35|38.5 37.98 100 205|225.5 222.44 255515|566.5 558.81也就是说,这个延时函数的精度为2us,最小的时间延时为7us,最大的时间延时为3+255×2+2=515us.实际中使用11.0592 MHz的时钟,这个延时函数的精度将为2.2us,最小时间延时为7.7us,最大时间延时为566.5us.这个时间延时函数,对于与DS18B20进行单总线通信,已经足够准确了。

现在,我们将时钟换成11.0592 MHz这个实际用到的频率,每个机器周期约为1.1us.现在让我们来分析一下这个之前用过的延时函数://延时函数,对于11.0592 MHz时钟,例i=10,则大概延时10ms.void delayMs(unsigned int i){unsigned int j;while(i--){for(j=0;j 125;j++);}}它的反汇编代码如下:分析:T表示一个机器周期(调用时间相对于这个ms级的延时来说,可忽略不计)1 C:0000 MOV A,R7;1T 2DEC R7;1T低8位字节减1 3MOV R2,0x06;2T 4JNZ C:0007;2T若低8位字节不为0,则跳到C:0007 5DEC R6;1T低8位字节为0,则高8位字节减1 6C:0007 ORL A,R2;1T 7JZ C:001D;2T若高8位也减为0,则RET 8CLR A;1T A清零9 MOV R4,A;1T R4放高位10 MOV R5,A;1T R5放低位11 C:000D CLR C;1T C清零12 MOV A,R5;1T 13 SUBB A,#0x7d;1T A=A-125 14 MOV A,R4;1T 15 SUBB A,#0x00;1T A16 JNC C:0000;2T A为零则跳到C:0000 17 INC R5;1T R5增1 18 CJNE R5,#0x00,C:001B;2T R5 0,跳转到C:000D 19 INC R4;1T 20 C:001B SJMP C:000D;2T 21 C:001D RET对于delayMs(1),执行到第7行就跳到21行,共需时12T,即13.2us对于delayMs(2),需时9T+13T+124×10T+7T+12T=9T+13T+1240T+7T+12T=1281T=1409.1 us.对于delayMs(3),需时9T×(3-1)+(13T+124×10T+7T)×(3-1)+12T=1269T×(3-1)+12T=2550T=2805us.对于delayMs(N),N 1,需时1269T×(N-1)+12T=1269NT-1257T=(1395.9 N-1382.7)us.利用Keil C仿真delayMs(1)=0.00166558 s=1.67ms截图如下:由分析可知具体的计算延时时间与Keil C仿真延时对比如下:i Time Delay仿真延时1 13.2us 1.67ms 21409.1 us 3.31ms 32805us 4.96ms N(1395.9 N-1382.7)us 10 12.6ms 16.50ms 20 26.5ms 32.98ms 30 40.5ms 49.46ms 50 68.4ms 82.43ms 100 138.2ms 164.84 ms 200 277.8ms 329.56 ms 500696.6ms 824.13 ms 1000 1394.5 ms 1648.54 ms 1500 2092.5 ms 2472.34 ms 2000 2790.4 ms 3296.47 ms 55.6ms 8.26ms 73 100.5ms 120.34 ms 720 1003.7 ms=1s 1186.74 ms计算delayMs(10)得到延时时间为:12576.3 us约等于12.6ms,接近我们认为的10ms。

51单片机C语言精确延时程序(超级准)

51单片机C语言精确延时程序(超级准)
单片机c语言单片机c语言教程pic单片机c语言教程pic单片机c语言单片机c语言指令集单片机c语言入门单片机c语言中断c语言和单片机avr单片机c语言单片机c语言编程
51单片机 C语言精确延时程序(超级准)
51单片机C语言精密延时程序 程序如下: void delayms(unsigned char t) { unsigned char j; unsigned char i; do { j=3; do { i=165; do { --i; } while(i!=0); --j; } while(j!=0); --t; } while(t!=0); } 该程序延时时基为1ms,所以最大延时时间是255ms 下面是反编译的汇编程序 C:0x0031 7E03 MOV R6,#0x03 C:0x0033 7DA5 MOV R5,#0xA5 C:0x0035 DDFE DJNZ R5,C:0035 C:0x0037 DEFA DJNZ R6,C:0033 C:0x0039 DFF6 DJNZ R7,delayms(C:0031) C:0x003B 22 RET 延时时间计算公式如下: ((R5*2 + 2+1)*R6+2+1)R7
假设R7=1,上式为(165*2+3)*3+2+1 =1002us!!!!! 以上程序使用的晶振是12MHz,如果使用的是其他频率的晶振只需计算出1ms的机器周期 数,代入5*2 + 2+1)*R6+2+1,选择合适的R

51单片机延时函数设计

51单片机延时函数设计

58:
unsigned char i = 0;
C:0x11A5 E4
CLR
A
C:0x11A6 FF
MOV
R7,A
59:
unsigned char j = 0;
60:
for(i = 0;i < 29;i++)
61:
{
62:
for(j = 0;j < 62;j++)
C:0x11A7 E4
CLR
A
C:0x11A8 FE
djnz r6,DELAY2 ;2 个机器周期
djnz r5,DELAY1 ;2 个机器周期
ret
;2 个机器周期
假定已经给 delayr5、delayr6 和 delayr7 赋予了正确的数值,当调用 DELAY
函数的时候就会进行一段时间的空循环,然后返回,达到延时的目的。必须遵守
如下的调用顺序:
我找到了解决之道,参看示例代码 7。
示例代码 7
unsigned char i = 0;
unsigned char j = 0;
for(i = 0;i < 29;i++)
{
for(j = 0;j < 62;j++)
{
_nop_();
}
_nop_();
}
编译器做出来的代码类似如下格式(蓝色行是汇编代码,红色行是 C 源代码):
再次强调,延时时间是包括“DelayConstantInner = XXX”这些语句在内 的总时间。当然,在 C 程序中嵌入汇编,还要设置一些编译器选项,这个你自己 找书看。这一步很重要哦,要不编译根本通不过。

51单片机延时函数

51单片机延时函数

51单片机延时函数在嵌入式系统开发中,51单片机因其易于学习和使用、成本低廉等优点被广泛使用。

在51单片机的程序设计中,延时函数是一个常见的需求。

通过延时函数,我们可以控制程序的执行速度,实现定时器功能,或者在需要的时候进行延时操作。

本文将介绍51单片机中常见的延时函数及其实现方法。

一、使用for循环延时这种方法不精确,但是对于要求不高的场合,可以用来估算延时。

cvoid delay(unsigned int time){unsigned int i,j;for(i=0;i<time;i++)for(j=0;j<1275;j++);}这个延时函数的原理是:在第一个for循环中,我们循环了指定的时间次数(time次),然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有很大差异,所以只适用于对延时时间要求不精确的场合。

二、使用while循环延时这种方法比使用for循环延时更精确一些,但是同样因为硬件和编译器的不同,延时时间会有差异。

cvoid delay(unsigned int time){unsigned int i;while(time--)for(i=0;i<1275;i++);}这个延时函数的原理是:我们先进入一个while循环,在这个循环中,我们循环指定的时间次数(time次)。

然后在每一次循环中,我们又循环了1275次。

这样,整个函数的执行时间就是time乘以1275,大致上形成了一个延时效果。

但是需要注意的是,这种方法因为硬件和编译器的不同,延时时间会有差异,所以只适用于对延时时间要求不精确的场合。

三、使用定时器0实现精确延时这种方法需要在单片机中开启定时器0,并设置定时器中断。

在中断服务程序中,我们进行相应的操作来实现精确的延时。

这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。

51单片机延时函数

51单片机延时函数

51单片机延时函数
151单片机延时函数
51单片机是一种常用的微控制器,它可以实现一系列功能,如定时器,定时器中断等。

随着科技的发展,许多人需要使用单片机来实现特定功能,而51单片机是最受欢迎的也是最知名的。

本文旨在介绍51单片机延时函数的实现方法。

1.1时钟
任何有效的51单片机使用的延时函数都受时钟的控制。

由于50单片机本身的频率有限,为了让计算机更有效地运行,我们需要精确设置时钟频率。

由于时钟频率的不同,51单片机的延时函数也有所不同。

1.2延时函数的实现
51单片机的延时函数是用来延迟任务的一种方法。

延时函数可以延迟任务的执行,并且可以按照用户设定的起点和终点执行任务。

51单片机使用指令延时来实现延时函数。

指令延时就是指通过控制51单片机内部时钟,来让程序暂停一段指定时间。

这样,我们就可以实现受时钟控制的延时函数。

1.3延时函数的实际应用
51单片机的延时函数可以用来实现许多不同的功能,如断电保护,延时启动,定时控制等。

由于这些函数可以精确控制任务的执
行,可以适应复杂的工作环境。

同时,51单片机还可以实现节能,使系统能够更加稳定可靠。

2结论
51单片机延时函数是51单片机应用中最基础的功能之一。

该函数可以满足不同用户的需求,帮助产品在实际应用中更好地发挥作用,同时还可以实现节能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

51单片机延迟函数
51单片机延迟函数是一种非常重要的函数,它可以帮助我们在程序中实现延迟的效果。

在很多应用场景中,我们需要让程序暂停一段时间,比如等待传感器采集数据、等待外设响应等等。

这时候,延迟函数就可以派上用场了。

在51单片机中,延迟函数的实现方式有很多种,比如使用定时器、循环计数等等。

其中,使用循环计数实现延迟函数是最简单、最常用的方法。

具体实现方式如下:
```c
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 1141; j++);
}
}
```
这个函数的原理很简单,就是通过两个嵌套的循环来实现延迟。

外层循环控制延迟的时间,内层循环则是一个空循环,用来消耗CPU 的时间。

通过调整内层循环的次数,就可以控制延迟的时间。

需要注意的是,这种延迟函数的精度并不高,因为它的延迟时间受到CPU时钟频率的影响。

如果CPU时钟频率发生变化,延迟时间也会发生变化。

因此,在实际应用中,我们需要根据具体的情况来选择合适的延迟函数。

除了使用循环计数实现延迟函数外,还可以使用定时器来实现。

定时器可以精确地控制延迟时间,而且不会受到CPU时钟频率的影响。

但是,定时器的使用比较复杂,需要对定时器的寄存器进行配置,不太适合初学者使用。

51单片机延迟函数是一种非常实用的函数,可以帮助我们在程序中实现延迟的效果。

在实际应用中,我们需要根据具体的情况来选择合适的延迟函数,以达到最佳的延迟效果。

相关文档
最新文档