单片机精确毫秒延时函数
单片机精确毫秒延时函数
单片机精确毫秒延时函数单片机精确毫秒延时函数实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
今天主要介绍软件延时以及单片机精确毫秒延时函数。
单片机的周期介绍在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。
脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。
电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。
对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
时钟周期:也称为振荡周期,一个时钟周期= 晶振的倒数。
对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。
机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。
机器周期=6个状态周期=12个时钟周期。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x s。
常用单片机的晶振为11.0592MHz,12MHz,24MHz。
其中11.0592MHz 的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 s和2 s,便于精确延时。
基于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时调用此函数即可。
单片机常用延时函数
1、延时0.5ms
void delay0.5ms(void) //误差 0us
{
unsigned char a,b;
for(b=71;b>0;b--)
for(a=2;a>0;a--);
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=214;a>0;a--);
_nop_; //if Keil,require use intrins.h
}
13、延时500ms
1·void delay500ms(void) //误差 0us
{
unsigned char a,b,c;
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(c=23;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
}
2·void Delay500ms()
51单片机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
用delay函数进行延时
在使用delay进行延时的时候,delay()括号中的数是多少则代表延时多少毫秒,即单位为毫秒。
举个例子:delay(100)则代表延时100ms;delay(200)则代表延时200ms。
delay是循环等待延时,该程序还在运行,占用处理器。
下面举例如何让在程序中进行编程采用51单片机范例:
#include<reg52.h> //52单片机头文件
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit led1=P1^1; //单片机管脚位声明
void delay(uintu) //延时函数,u代表的取值为这个函数的延时ms数,如delay(200);大约延时200ms.
}
}
{//delay(300);大约延时300ms.
uint x,y;
for(x=u;x>0;x--)
for(y=110;y>0;y--);
}
void main()//主函数
{
while(1) //大循环
{
d1=0; //点亮小灯
delay(300); //延时300毫秒
led1=1;//熄灭小灯
delay(300); //延时300毫秒
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,并设置定时器中断。
在中断服务程序中,我们进行相应的操作来实现精确的延时。
这种方法需要使用到单片机的定时器中断功能,相对复杂一些,但是可以实现精确的延时。
STM32延时函数的三种方法——最好掌握第三种
STM32延时函数的三种方法——最好掌握第三种单片机编程过程中经常用到延时函数,最常用的莫过于微秒级延时delay_us( )和毫秒级delay_ms( )。
1.普通延时法这个比较简单,让单片机做一些无关紧要的工作来打发时间,经常用循环来实现,不过要做的比较精准还是要下一番功夫。
下面的代码是在网上搜到的,经测试延时比较精准。
//粗延时函数,微秒void delay_us(u16 time){u16 i=0;while(time--){i=10; //自己定义while(i--) ;}}//毫秒级的延时void delay_ms(u16 time){u16 i=0;while(time--){i=12000; //自己定义while(i--) ;}}2.SysTick 定时器延时CM3 内核的处理器,内部包含了一个SysTick 定时器,SysTick是一个24 位的倒计数定时器,当计到0 时,将从RELOAD 寄存器中自动重装载定时初值。
只要不把它在SysTick 控制及状态寄存器中的使能位清除,就永不停息。
SysTick 在STM32 的参考手册里面介绍的很简单,其详细介绍,请参阅《Cortex-M3 权威指南》。
这里面也有两种方式实现:a.中断方式如下,定义延时时间time_delay,SysTick_Config()定义中断时间段,在中断中递减time_delay,从而实现延时。
volatile unsigned long time_delay; // 延时时间,注意定义为全局变量//延时n_msvoid delay_ms(volatile unsigned long nms){//SYSTICK分频--1ms的系统时钟中断if (SysTick_Config(SystemFrequency/1000)){while (1);}time_delay=nms;//读取定时时间while(time_delay);SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}//延时nusvoid delay_us(volatile unsigned long nus){//SYSTICK分频--1us的系统时钟中断if (SysTick_Config(SystemFrequency/1000000)){while (1);}time_delay=nus;//读取定时时间while(time_delay);SysTick->CTRL=0x00; //关闭计数器SysTick->VAL =0X00; //清空计数器}//在中断中将time_delay递减。
51单片机延时函数
51单片机延时函数
151单片机延时函数
51单片机是一种常用的微控制器,它可以实现一系列功能,如定时器,定时器中断等。
随着科技的发展,许多人需要使用单片机来实现特定功能,而51单片机是最受欢迎的也是最知名的。
本文旨在介绍51单片机延时函数的实现方法。
1.1时钟
任何有效的51单片机使用的延时函数都受时钟的控制。
由于50单片机本身的频率有限,为了让计算机更有效地运行,我们需要精确设置时钟频率。
由于时钟频率的不同,51单片机的延时函数也有所不同。
1.2延时函数的实现
51单片机的延时函数是用来延迟任务的一种方法。
延时函数可以延迟任务的执行,并且可以按照用户设定的起点和终点执行任务。
51单片机使用指令延时来实现延时函数。
指令延时就是指通过控制51单片机内部时钟,来让程序暂停一段指定时间。
这样,我们就可以实现受时钟控制的延时函数。
1.3延时函数的实际应用
51单片机的延时函数可以用来实现许多不同的功能,如断电保护,延时启动,定时控制等。
由于这些函数可以精确控制任务的执
行,可以适应复杂的工作环境。
同时,51单片机还可以实现节能,使系统能够更加稳定可靠。
2结论
51单片机延时函数是51单片机应用中最基础的功能之一。
该函数可以满足不同用户的需求,帮助产品在实际应用中更好地发挥作用,同时还可以实现节能。
单片机的几种延时函数
摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。
本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。
关键词 Ke il C51 精确延时程序执行时间引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。
有时还要求有很高的精度,如使用单总线芯片D S18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。
用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。
因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CP U的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MH z、12MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MH z的晶振。
最长的延时时间可达216=65 536μs。
stc32g 延时函数
STC32G延时函数简介在嵌入式系统开发中,延时函数是一项非常重要且常用的功能。
STC32G是一款基于STC89系列芯片的单片机,本文将探讨如何在STC32G上使用延时函数来实现精确的时间控制。
为什么需要延时函数在很多嵌入式系统应用中,我们需要控制事件的发生时间间隔或者延时一定的时间后执行某些操作。
例如,需要让LED灯闪烁1秒钟,并且每次闪烁的时间间隔是500毫秒。
这个时候,就需要使用延时函数来实现准确的时间控制。
常用的延时方法在嵌入式系统中,常用的延时方法有三种:软件延时、硬件延时和定时器延时。
下面我们将逐一介绍这三种延时方法的优缺点和适用场景。
软件延时软件延时是通过编写循环来实现的。
简单来说,就是利用循环来浪费一定的时间。
这种方法的优点是简单易懂,不需要额外的硬件支持。
但是其缺点也显而易见,由于是通过循环来实现延时,所以在延时期间,CPU是忙碌的,无法执行其他任务。
这意味着不能同时做其他的操作,系统的响应时间会受到一定的影响。
硬件延时硬件延时是通过硬件电路来实现的,通常使用计数器和外部时钟源来精确控制时间。
由于硬件延时不占用CPU的工作时间,所以在延时期间可以执行其他任务。
但是硬件延时需要额外的硬件支持,增加了系统的复杂度。
定时器延时定时器延时是使用单片机内部的定时器功能来实现的。
定时器是单片机的一个重要模块,可以产生定时中断,实现精确的时间控制。
定时器延时结合了软件延时和硬件延时的优点,同时也继承了它们的缺点。
使用定时器延时能够准确控制时间,同时不影响CPU的正常工作。
但是需要编写中断服务函数来处理定时器中断,增加了代码的复杂度。
STC32G延时函数的使用方法STC32G芯片是STC89系列的一种,它具有丰富的外设和强大的功能。
STC32G芯片具备多种延时方式供用户选择,下面将详细介绍STC32G延时函数的使用方法。
延时函数的声明在使用STC32G延时函数之前,首先需要在程序中引入相关的头文件,并且声明延时函数。
单片机C51延时时间怎样计算
单片机C51延时时间怎样计算计算单片机C51延时时间通常需要考虑以下几个因素:1. 单片机的工作频率:单片机的工作频率决定了每个时钟周期的时长。
时钟周期(T)为1 / 片内晶振频率。
例如,若单片机的晶振频率为11.0592MHz,则时钟周期为1 / 11.0592MHz ≈ 90.52ns。
2. 延时的时间要求:您需要计算的是具体的延时时间,例如1毫秒(ms),10毫秒(ms)等。
有了上述信息,我们可以使用下面的公式来计算延时时间:延时时间(单位:时钟周期)=(目标延时时间(单位:秒)/时钟周期(单位:秒))延时时间(单位:毫秒)=延时时间(单位:时钟周期)×1000下面是一个示例的代码来演示如何计算并实现一个1毫秒的延时:```c#include <reg51.h>//定义时钟周期#define CLOCK_PERIOD 100 // 以纳秒为单位//定义延时函数void delay_ms(unsigned int milliseconds)unsigned int i, j;for (i = 0; i < milliseconds; i++)for (j = 0; j < 120; j++) // 这里的120是根据实际测量得到的,可以根据硬件和软件环境适当微调//每次循环消耗的时间为120*100纳秒≈12微秒//因此,总延时时间为12*1000微秒=1毫秒}}//主函数void mainP1=0x00;//把P1引脚置为低电平while (1)delay_ms(1000); // 1秒的延时P1=~P1;//翻转P1引脚的电平}```上述代码中,我们通过嵌套循环实现了一个1毫秒的延时。
根据实际硬件和软件环境,您可能需要微调内层循环的次数以达到准确的1毫秒延时。
需要注意的是,单片机的延时准确性受到各种因素影响,包括时钟精度、环境温度等。
在实际应用中,如果对延时精度有较高要求,可能需要进一步进行校准或采用其他更精确的延时方式。
单片机的几种延时函数
单片机的几种延时函数摘要实际的单片机应用系统开发过程中,由于程序功能的需要,经常编写各种延时程序,延时时间从数微秒到数秒不等,对于许多C51开发者特别是初学者编制非常精确的延时程序有一定难度。
本文从实际应用出发,讨论几种实用的编制精确延时程序和计算程序执行时间的方法,并给出各种方法使用的详细步骤,以便读者能够很好地掌握理解。
关键词Keil C51 精确延时程序执行时间引言单片机因具有体积小、功能强、成本低以及便于实现分布式控制而有非常广泛的应用领域[1]。
单片机开发者在编制各种应用程序时经常会遇到实现精确延时的问题,比如按键去抖、数据传输等操作都要在程序中插入一段或几段延时,时间从几十微秒到几秒。
有时还要求有很高的精度,如使用单总线芯片DS18B20时,允许误差范围在十几微秒以内[2],否则,芯片无法工作。
用51汇编语言写程序时,这种问题很容易得到解决,而目前开发嵌入式系统软件的主流工具为C语言,用C51写延时程序时需要一些技巧[3]。
因此,在多年单片机开发经验的基础上,介绍几种实用的编制精确延时程序和计算程序执行时间的方法。
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。
若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。
使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。
延时函数—微秒级
说明:以下程序测试都是在晶振频率12MHZ下测试的。
在写51单片机的程序中会用到延迟函数,但是能精确到微秒级的函数,由于一个机器周期就1us,所以几乎写不出来。
倘若用到这类函数,只能迷糊的写一些延迟函数,但究竟延迟多长时间也不知道。
以下是我的研究结果,仅供参考,有错难免,望谅解。
/********************************************************** ******************关于以下函数延迟时间的研究:void delay_us(unsigned int n){while(n--);}微秒级延时函数,其延时结果的特殊情况如下:n=0 delaytime=17 usn=1 delaytime=25 usn=2 delaytime=34 usn=3 delaytime=43 usn=4 delaytime=52 usn=5 delaytime=61 us delaytime/n=12.2us/次n=10 delaytime=106 us delaytime/n=10.6us/次n=50 delaytime=466 us delaytime/n=9.3us/次n=100 delaytime=916 us delaytime/n=9.2us/次n=500 delaytime=4517 us delaytime/n=9.0us/次n=1000 delaytime=9019 us delaytime/n=9.0us/次结论:推测将n趋于无穷大,delaytime/n=9us/次其他运算的延迟时间:_nop_(); delaytime=1 usi++; delaytime=2 us*********************************************************** *****************//********************************************************** ******************关于该函数延迟时间的测试*********************************************************** #include <reg51.h> //52系列头文件#include<intrins.h> //包含_nop_()函数定义的头文件void delay_us(unsigned int n){while(n--);}main(){_nop_();delay_us(10);_nop_();}。
51单片机延时函数
51单片机延时函数
51单片机延时函数是51单片机在实际应用中必不可少的一种函数,它的作用是延迟指令的执行,可以让程序运行的更加精确,因此十分重要。
51单片机延时函数可以用来控制时间、分析数据、检测信号、按指定时间触发特定事件等等。
以实际应用为例,如果使用51单片机实现一个报警装置,延时函数可以用来实现报警时间的控制,以及报警过程间隔时间的控制,从而控制不同报警信号的发出。
51单片机延时函数的实现有很多种,比如空循环实现、定时器实现等。
空循环实现的51单片机延时函数,是通过一个无限循环来实现的,这样就可以让程序在循环中计算循环次数,从而实现对时间的控制。
但是,空循环有其局限性,在51单片机运行的环境越来越复杂的今天,空循环实现的51单片机延时函数的灵敏度越来越低,达不到精确控制时间的需要。
另外,定时器实现的51单片机延时函数,是通过51单片机自带的定时器来实现的,定时器实现的51单片机延时函数能够精确控制时间,而且还可以实现多种复杂的功能,比如定时检测信号、定时触发特定事件等。
51单片机延时函数在实际应用中十分重要,有空循环实现和定时器实现两种实现方法,空循环实现的51单片机延时函数简单易实现,但在复杂环境下灵敏度较低;而定时器实现的51单片机延时函数能够精确控制时间,实现复杂功能,但程序复杂度较高。
所以,在51单片机实际应用中,应根据实际情况选择最佳的实现方法。
单片机delay函数用法
单片机delay函数用法1. 引言在单片机编程中,延时函数是一项非常重要的功能。
通过延时函数,我们可以控制程序在执行过程中的时间间隔,以实现各种需要时间控制的功能。
本文将详细介绍单片机中延时函数的用法。
2. 延时函数的原理延时函数的原理是通过软件实现的。
在单片机中,可以使用定时器或循环控制来实现延时功能。
定时器是单片机中的一个硬件模块,通过设置定时器的计数值和时钟源,可以实现精确的定时功能。
而循环控制是通过在程序中加入循环,让程序在指定的时间内空转一段时间,从而实现延时的效果。
3. 延时函数的分类延时函数可以根据其实现的方式进行分类。
常见的延时函数有以下几种:3.1 定时器延时函数定时器延时函数是通过使用定时器模块来实现的。
通过设置定时器的相关参数,可以实现准确的延时功能。
定时器延时函数的优点是精确度高,但需要花费一定的时间和精力来配置定时器。
3.2 循环延时函数循环延时函数是通过在程序中加入循环来实现延时的效果。
循环延时函数的原理是让程序在指定的时间内进行循环,从而实现一段时间的延时。
循环延时函数的优点是简单易实现,但由于程序在延时期间需要不断进行循环,可能会占用较多的处理器资源。
3.3 软件中断延时函数软件中断延时函数是通过使用软件中断的方式实现延时功能。
在延时函数中,可以设置软件中断的定时器,当定时器计数值达到预设值时,触发软件中断,从而实现延时效果。
软件中断延时函数的优点是不需要额外的硬件支持,但在延时期间无法进行其他操作。
4. 常见的延时函数4.1 _delay_ms函数_delay_ms函数是一个常见的延时函数,用于实现以毫秒为单位的延时。
该函数的原型为:void _delay_ms(unsigned int ms);参数ms表示需要延时的毫秒数。
该函数的实现原理是通过循环控制来实现延时的效果。
使用_delay_ms函数时,需要注意以下几点:•延时时间的精确度取决于单片机的主频和循环次数。
关于单片机C语言的精确延时
for(i = 0; i < 600; i++); } } /********************************************************************************************
/******************************************************************************************** void main (void){ //主程序 while(1){
LED = ~LED; //取LED相反状态 DELAY_MS(1000); //修改这里的数值看看会有什么变化 }
} /******************************************************************************************** - 应用实例
可将其模板下载到本地硬盘,在编写新程序的时候复制、粘贴到工程当 中,然后根据情况写入具体内容。
- 使用说明
data unsigned char cou = 0; // 定义软计数器,放在程序最前面的寄存 器定义部分
/********************************************************************************************
stc15w4k48s4延时函数
stc15w4k48s4延时函数STC15W4K48S4是一款由深圳市富泰宏微电子有限公司生产的单片机。
该芯片基于8031芯片的核心,在功能上进行了扩展和优化,使其成为一款功能强大、可靠性高的单片机。
其中,STC15W4K48S4延时函数是该单片机中的一个重要功能。
在单片机的程序设计中,经常需要进行一些延时操作,以确保程序能够按照要求执行。
STC15W4K48S4延时函数就是针对这个需求而编写的。
STC15W4K48S4延时函数的实现方法主要有两种。
一种是使用循环来进行延时,即在程序中使用一个循环进行空转,从而达到延时的效果。
另一种是使用定时器来进行延时,即设置一个定时器,并在定时器到达预定时间后进行中断处理。
无论是哪种实现方法,STC15W4K48S4延时函数的使用都非常简单。
首先需要定义延时的时长,然后调用相应的函数即可。
例如,如果需要延时100毫秒,可以使用以下代码:```void delay_ms(unsigned int i){while(i--){delay_us(990);}}void delay_us(unsigned int i){while(i--);}```以上代码定义了两个函数,delay_ms()函数用于实现毫秒级的延时,而delay_us()函数用于实现微秒级的延时。
在delay_ms()函数中,通过循环调用delay_us()函数来实现延时。
delay_us()函数中的while循环会进行i次空转,从而实现了微秒级的延时。
总体来说,STC15W4K48S4延时函数是一款非常实用的单片机功能。
它不仅能够满足程序设计中常见的延时需求,而且还非常简单易用,可以大大提高程序设计的效率和可靠性。
在实际应用中,程序员只需要根据具体的需求选择合适的延时函数,并用适当的参数调用即可。
51单片机精确延时实现方法
51单片机精确延时实现方法51单片机的几种精确延时实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
1 使用定时器/计数器实现精确延时单片机系统一般常选用11.059 2 MHz、12 MHz或6 MHz晶振。
第一种更容易产生各种标准的波特率,后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。
本程序中假设使用频率为12 MHz的晶振。
最长的延时时间可达216=65 536 μs。
若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
在实际应用中,定时常采用中断方式,如进行适当的循环可实现几秒甚至更长时间的延时。
使用定时器/计数器延时从程序的执行效率和稳定性两方面考虑都是最佳的方案。
但应该注意,C51编写的中断服务程序编译后会自动加上PUSH ACC、PUSH PSW、POP PSW 和POP ACC语句,执行时占用了4个机器周期;如程序中还有计数值加1语句,则又会占用1个机器周期。
这些语句所消耗的时间在计算定时初值时要考虑进去,从初值中减去以达到最小误差的目的。
2 软件延时与时间计算在很多情况下,定时器/计数器经常被用作其他用途,这时候就只能用软件方法延时。
下面介绍几种软件延时的方法。
2.1 短暂延时可以在C文件中通过使用带_NOP_()语句的函数实现,定义一系列不同的延时函数,如Delay10us()、Delay25us()、Delay40us ()等存放在一个自定义的C文件中,需要时在主程序中直接调用。
如延时10 μs的延时函数可编写如下:void Delay10us(){_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();}Delay10us()函数中共用了6个_NOP_()语句,每个语句执行时间为1 μs。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机精确毫秒延时函数
实现延时通常有两种方法:一种是硬件延时,要用到定时器/计数器,这种方法可以提高CPU的工作效率,也能做到精确延时;另一种是软件延时,这种方法主要采用循环体进行。
今天主要介绍软件延时以及单片机精确毫秒延时函数。
单片机的周期介绍在电子技术中,脉冲信号是一个按一定电压幅度,一定时间间隔连续发出的脉冲信号。
脉冲信号之间的时间间隔称为周期;而将在单位时间(如1秒)内所产生的脉冲个数称为频率。
频率是描述周期性循环信号(包括脉冲信号)在单位时间内所出现的脉冲数量多少的计量名称;频率的标准计量单位是Hz(赫)。
电脑中的系统时钟就是一个典型的频率相当精确和稳定的脉冲信号发生器。
指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的,指令不同,所需的机器周期也不同。
对于一些简单的的单字节指令,在取指令周期中,指令取出到指令寄存器后,立即译码执行,不再需要其它的机器周期。
对于一些比较复杂的指令,例如转移指令、乘法指令,则需要两个或者两个以上的机器周期。
通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
时钟周期:也称为振荡周期,一个时钟周期= 晶振的倒数。
对于单片机时钟周期,时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。
机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。
机器周期=6个状态周期=12个时钟周期。
51单片机的指令有单字节、双字节和三字节的,它们的指令周期不尽相同,一个单周期指令包含一个机器周期,即12个时钟周期,所以一条单周期指令被执行所占时间为12*(1/ 晶振频率)= x s。
常用单片机的晶振为11.0592MHz,12MHz,24MHz。
其中11.0592MHz 的晶振更容易产生各种标准的波特率,后两种的一个机器周期分别为1 s和2 s,便于精确延时。
单片机精确毫秒延时函数对于需要精确延时的应用场合,需要精确知道延时函数的具体延。