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单片机的几种常用延时程序设计2024

C51单片机的几种常用延时程序设计2024

引言概述:C51单片机是一种广泛应用于嵌入式系统中的微控制器,它具有高度集成化、易于编程和灵活性强等特点。

在C51单片机的软件开发过程中,延时程序设计是非常重要的一部分。

本文将介绍C51单片机中几种常用的延时程序设计方法,包括循环延时、定时器延时、外部中断延时等。

这些方法不仅可以满足在实际应用中对延时的需求,而且可以提高程序的稳定性和可靠性。

正文内容:一、循环延时1. 使用循环控制语句实现延时功能,例如使用for循环、while循环等。

2. 根据需要设置延时的时间,通过循环次数来控制延时的时长。

3. 循环延时的精度受到指令执行时间的影响,可能存在一定的误差。

4. 循环延时的优点是简单易用,适用于较短的延时时间。

5. 注意在循环延时时要考虑其他任务的处理,避免长时间的等待造成程序卡死或响应延迟。

二、定时器延时1. 使用C51单片机内置的定时器模块来实现延时。

2. 配置定时器的工作模式,如工作方式、定时器精度等。

3. 设置定时器的初值和重装值,控制定时器中断的触发时间。

4. 在定时器中断服务函数中进行延时计数和延时结束标志的设置。

5. 定时器延时的优点是精确可控,适用于需要较高精度的延时要求。

三、外部中断延时1. 在C51单片机上配置一个外部中断引脚。

2. 设置外部中断中断触发条件,如上升沿触发、下降沿触发等。

3. 在外部中断中断服务函数中进行延时计数和延时结束标志的设置。

4. 外部中断延时的优点是能够快速响应外部信号,适用于实时性要求较高的场景。

5. 注意在外部中断延时时要处理好外部中断的抖动问题,确保延时的准确性。

四、内部计时器延时1. 使用C51单片机内部的计时器模块来实现延时。

2. 配置计时器的工作模式,如工作方式、计时器精度等。

3. 设置计时器的初值和重装值,使计时器按照一定的频率进行计数。

4. 根据计时器的计数值进行延时的判断和计数。

5. 内部计时器延时的优点是能够利用单片机内部的硬件资源,提高延时的准确性和稳定性。

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单片机应用中最基础的功能之一。

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

51单片机延时时间计算和延时程序设计

51单片机延时时间计算和延时程序设计

一、关于单片机周期的几个概念时钟周期时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12MHz 的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。

在一个时钟周期内,CPU仅完成一个最基本的动作。

机器周期完成一个基本操作所需要的时间称为机器周期。

以51 为例,晶振12M,时钟周期(晶振周期)就是(1/12)μs,一个机器周期包含12 个时钟周期,一个机器周期就是1μ s。

指令周期:执行一条指令所需要的时间,一般由若干个机器周期组成。

指令不同,所需的机器周期也不同。

对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。

对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。

2.延时常用指令的机器周期1.指令含义DJNZ:减 1 条件转移指令这是一组把减 1 与条件转移两种功能结合在一起的指令,共2条。

DJNZ Rn,rel ;Rn←(Rn)-1;若(Rn)=0,则PC←(PC)+2 ;顺序执行;若(Rn)≠ 0,则PC←(PC)+2+rel,转移到rel 所在位置DJNZ direct,rel ;direct ←(direct )-1;若(direct)= 0,则PC←(PC)+3;顺序执行;若(direct)≠ 0,则PC←(PC)+3+rel,转移到rel 所在位置2.DJNZ Rn,rel 指令详解例:MOV R7,#5DEL:DJNZ R7,DEL; r在el本例中指标号DEL三、51 单片机延时时间的计算方法和延时程序设计1.单层循环由上例可知,当Rn赋值为几,循环就执行几次,上例执行 5 次,因此本例执行的机器周期个数=1(MOV R7,#5)+2(DJNZ R7,DE)L ×5=11,以12MHz的晶振为例,执行时间(延时时间)=机器周期个数×1μs=11μ s,当设定立即数为0 时,循环程序最多执行256 次,即延时时间最多256μ s。

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

51单片机独立模块
一、延时模块
1、for循环延时
void delayms(UINT8 ms)
{
UINT8 x,y;
for(x=ms;x>0;x--)
for(y=112;y>0;y--);
}
2、while循环延时
void delayms(UINT8 ms)
{
UINT8 x;
while(ms--)
for(x=112;x>0;x--);
}
3、精确的单片机常用延时函数:(c代码误差0us 12M)(1)、延时0.5ms
void delay0.5ms(void) //误差 0us
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
}
(2)、延时1ms
void delay1ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
(3)、延时2ms
void delay2ms(void) //误差 0us
{
unsigned char a,b;
for(b=4;b>0;b--)
for(a=248;a>0;a--);
_nop_; //if Keil,require use intrins.h
}
(4)、延时3ms
void delay3ms(void) //误差 0us
{
unsigned char a,b;
for(b=111;b>0;b--)
for(a=12;a>0;a--);
}
(5)、延时4ms
void delay4ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=7;c>0;c--)
for(b=8;b>0;b--)
for(a=34;a>0;a--);
}
(6)、延时5ms
void delay5ms(void) //误差 0us
{
unsigned char a,b;
for(b=19;b>0;b--)
for(a=130;a>0;a--);
}
(7)、延时10ms
void delay10ms(void) //误差 0us
{
unsigned char a,b,c; for(c=1;c>0;c--) for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
(8)、延时15ms
void delay15ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=238;b>0;b--)
for(a=30;a>0;a--);
}
(9)、延时20ms
void delay20ms(void) //误差 0us
{
unsigned char a,b;
for(b=215;b>0;b--)
for(a=45;a>0;a--);
_nop_; //if Keil,require use intrins.h
_nop_; //if Keil,require use intrins.h
}
(10)、延时50ms
void delay50ms(void) //误差 0us
{
unsigned char a,b;
for(b=173;b>0;b--)
for(a=143;a>0;a--);
}
(11)、延时100ms
void delay100ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=19;c>0;c--)
for(b=20;b>0;b--)
for(a=130;a>0;a--);
}
(12)、延时200ms
void delay200ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=4;c>0;c--)
for(b=116;b>0;b--)
for(a=214;a>0;a--);
_nop_; //if Keil,require use intrins.h }
(13)、延时500ms
void delay500ms(void) //误差 0us
{
unsigned char a,b,c;
for(c=23;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
}
(14)、延时1000ms
void delay(void) //误差 0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_; //if Keil,require use intrins.h
}。

相关文档
最新文档