51单片机延时函数

合集下载

51单片机C程序标准延时函数

51单片机C程序标准延时函数

51单片机C程序标准延时函数在此,我用的是12M晶振,一个时钟周期是1/12us,一个机器周期为12个时钟周期,则机器周期为1us,而51单片机执行一条语句,为1,2,4个机器周期不等,根据语句的长度来定,一般为1个机器周期。

而_nop_()为一条空语句,执行一次需要一个机器周期。

1us#include<intrins.h>_nop_();执行了一条_nop_();所以延时为1us;10usvoid delay10us(){_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}执行了6条_nop_(),延时6us,主函数调用delay10us 时,先执行了LCALL指令2us,然后执行6条_nop_()语句6us,最后执行一条RET指令2us,所以总共延时10us。

100usvoid delay100us(){delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();delay10us();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}与上面的一样,主函数调用delay100us();先执行了LCALL语句2us,再调用9个delay10us()函数90us,然后执行了6条_nop_()语句6us,最后执行了一条RET语句2us,总共100us。

1msvoid delay1ms(){f=1;TH0=0xe1;TL0=0X13;TR0=1;while(f);}void T0_3() interrupt 1{TR0=0;f=0;}这里就直接用51单片机内部定时器延时了,如果用_nop_();如果要做到微妙不差,那程序就太长了。

这里我用的是定时器0的方式0,13位定时器,这里为了方便,我就没就EA=1;ET0=1;TM0D=0X00;写在延时函数里。

基于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秒钟的延时操作,包括具体的代码实现和注意事项。

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

单片机延时函数

单片机延时函数

单⽚机延时函数1.51单⽚机延时,晶振为11.0592MHz(1)粗略延时void delay_ms(uint x){uint i,j;for(i=x;i>0:i--)for(j=110;j>0;j--);}(2)定时器延时void delay_ms(uint i){TMOD=0x01; //设置定时器⼯作模式while(i != 0){TR0=1; //开启定时器TH0=(65535-1000)/256; //赋初值TL0=(65535-1000)%256;while(TF0 != 1); //溢出标志TF0=0;i--;}TR0=0; //关闭定时器}2.stm32l151C8T6延时,外部晶振8MHz(1)粗略延时void delay_us(uint32_t time) //us延时{uint32_t i=4\*time;while(i--);}void delay_us(uint32_t time) //ms延时{uint32_t i=4000\*time;while(i--);}(2)使⽤nop延时通过使⽤__NOP()函数进⾏延时,因为使⽤了8M晶振4倍频,所以是32MHz,所以⼀个nop约等于1/32us,所以使⽤32个nop函数为⼀个us,然后根据需要的定时时间进⾏计算。

void delay_us(uint32_t time) //us延时{uint32_t i=0;for(i=0;i(3)利⽤SysTick延时void delay_init() //初始化{SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟fac_us=SystemCoreClock/8000000; //为系统时钟的1/8 4fac_ms=1000\*fac_us;}void delay_us(uint16_t nus) //延时us{uint32_t ui_tmp=0x00;SysTick->LOAD=nus\*fac_us;SysTick->VAL=0x00;SysTick->CTRL=0x01;do{ui_tmp=SysTick->CTRL;}while((ui_tmp&0x01) && (!(ui_tmp & (1<<16))));SysTick->CTRL=0x00;SysTick->VAL=0x00;}void delay_ms(uint16_t nms) //延时ms{uint32_t ui_tmp=0x00;SysTick->LOAD=nms\*fac_ms;SysTick->VAL=0x00;SysTick->CTRL=0x01;do{ui_tmp=SysTick->CTRL;}while((ui_tmp&0x01) && (!(ui_tmp&(1<<16))));SysTick->VAL=0x00;SysTick->CTRL=0x00;}void SysTick_Handler(void){flag=~flag;}(4)定时器延时void TIM3_Int_Init(uint16_t arr,uint16_t psc){TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//设置在下⼀个更新事件装⼊活动的⾃动重装载寄存器周期的值,计数10000为1s;TIM_TimeBaseStructure.TIM_Period = arr;//设置⽤来作为TIMx时钟频率除数的预分频值,10kHz的计数频率TIM_TimeBaseStructure.TIM_Prescaler = psc;//设置时钟分割:TDIS = Tck_timTIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置TIM向上计数模式TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//初始化TIMx的时间基数单位TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);//使能指定的TIM3中断,允许更新中断TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);//TIM3中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;//抢占优先级 0 级NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//从优先级 3 级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;//IRQ通道被使能NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//初始化外设NVIC寄存器NVIC_Init(&NVIC_InitStructure);//使能TIMx外设TIM_Cmd(TIM3,ENABLE);}void TIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_Update) != RESET) //检查指定的TIM中断发⽣与否 {TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除TIMx的中断待处理位if(flag==0){flag=1;GPIO_ResetBits(GPIOB,GPIO_Pin_0) ;}else{flag=0;GPIO_SetBits(GPIOB,GPIO_Pin_0);}}}注意:定时时间的计算定时器时钟为:CK_CLK预分频数值:PSC⾃动装载寄存器数值:ARR进⼊中断的次数:timet=time\*(ARR+1)\*(PSC+1)/(CK_CLK)。

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单片机精确延时实现方法 - 单片机

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。

51单片机延时函数

51单片机延时函数

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

以某晶振为12MHz 的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序程序:void delay500ms(void){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us子程序调用2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0;j --)for(k=150;k>0;k --);}三. 10ms延时子程序程序:{unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0;k --);}四. 1s延时子程序程序:void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0;j --)for(k=214;k>0;k --);}关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

51单片机延迟函数

51单片机延迟函数

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

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

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

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

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

具体实现方式如下:```cvoid 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单片机延迟函数是一种非常实用的函数,可以帮助我们在程序中实现延迟的效果。

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

51单片机延时函数

51单片机延时函数

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。

以某晶振为12MHz 的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序程序:void delay500ms(void){unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);}计算分析:程序共有三层循环一层循环n:R5*2 = 81*2 = 162us DJNZ 2us二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ2us + R5赋值 1us = 3us三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us循环外: 5us子程序调用2us + 子程序返回 2us + R7赋值 1us = 5us延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5二. 200ms延时子程序程序:void delay200ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=132;j>0; j--)for(k=150;k>0; k--);}三. 10ms延时子程序程序:void delay10ms(void){unsigned char i,j,k;for(i=5;i>0;i--)for(j=4;j>0;j--)for(k=248;k>0; k--);}四. 1s延时子程序程序:void delay1s(void){unsigned char h,i,j,k;for(h=5;h>0;h--)for(i=4;i>0;i--)for(j=116;j>0; j--)for(k=214;k>0; k--);}关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

单片机C51延时时间怎样计算

单片机C51延时时间怎样计算

单片机C51延时时间怎样计算
1. 延时函数:C51中提供了一个延时函数`delay(`,可以用来实现简单的延时操作。

该函数的参数为延时的时间,单位是毫秒(ms)。

2.单片机时钟频率:C51的时钟频率一般为12MHz,即每秒钟钟脉冲个数为12,000,000次。

3.定时/计数器模块:C51中的定时/计数器模块可以用来精确控制延时时间。

其中,TMOD寄存器用来设置定时器的工作模式,THx和TLx寄存器用来设置定时器的初值。

4.定时器计数:C51的定时器工作时,会不断地进行计数。

当计数值达到设定的初值时,会触发中断或者产生一个标志位,可以利用这个特性来实现精确的延时操作。

5.延时时间计算公式:延时时间(单位:毫秒)=计数器初值*定时器计数时间/定时器时钟频率
延时时间计算的具体步骤如下:
1.确定延时所需的毫秒数。

2.确定定时器的工作模式。

3.根据定时器的工作模式,设置THx和TLx寄存器的初值。

4.根据定时器的时钟频率和计数器初值,计算延时时间。

延时函数的缺点是,它是通过循环执行一段无用指令来实现延时的,因此在延时期间无法执行其他操作,延时的精度也不够高。

如果需要精确的延时时间,可以利用定时/计数器模块来实现。

51单片机延时函数

51单片机延时函数

51单片机延时函数
51单片机延时函数是51单片机在实际应用中必不可少的一种函数,它的作用是延迟指令的执行,可以让程序运行的更加精确,因此十分重要。

51单片机延时函数可以用来控制时间、分析数据、检测信号、按指定时间触发特定事件等等。

以实际应用为例,如果使用51单片机实现一个报警装置,延时函数可以用来实现报警时间的控制,以及报警过程间隔时间的控制,从而控制不同报警信号的发出。

51单片机延时函数的实现有很多种,比如空循环实现、定时器实现等。

空循环实现的51单片机延时函数,是通过一个无限循环来实现的,这样就可以让程序在循环中计算循环次数,从而实现对时间的控制。

但是,空循环有其局限性,在51单片机运行的环境越来越复杂的今天,空循环实现的51单片机延时函数的灵敏度越来越低,达不到精确控制时间的需要。

另外,定时器实现的51单片机延时函数,是通过51单片机自带的定时器来实现的,定时器实现的51单片机延时函数能够精确控制时间,而且还可以实现多种复杂的功能,比如定时检测信号、定时触发特定事件等。

51单片机延时函数在实际应用中十分重要,有空循环实现和定时器实现两种实现方法,空循环实现的51单片机延时函数简单易实现,但在复杂环境下灵敏度较低;而定时器实现的51单片机延时函数能够精确控制时间,实现复杂功能,但程序复杂度较高。

所以,在51单片机实际应用中,应根据实际情况选择最佳的实现方法。

at 89c51单片机延迟代码

at 89c51单片机延迟代码

at 89c51单片机延迟代码
在89C51单片机上延迟一定时间可以使用定时器功能来实现。

以下是一种常见的延迟代码实现方式:
```C
#include <reg51.h>
void delay(unsigned int ms)
{
unsigned int i, j;
for (i = 0; i < ms; i++)
{
for (j = 0; j < 120; j++) // 假设晶振频率为12MHz,每循环120次大约延迟1ms
{
// 空循环
}
}
}
void main()
{
while (1)
{
// 执行需要延迟的操作
delay(100); // 延迟100ms
// 执行其他操作
}
}
```
这段代码中,通过空循环的方式延迟一定的时间。

具体延迟时间
可以通过调整`delay`函数中内部循环的次数来实现。

请注意,该方法是一个简单的延迟方法,延时的精确度可能会受到晶振频率、编译器优化等因素的影响。

如果需要更精确的延时,可以使用定时器功能来实现,或者使用更高级的延时函数库。

51单片机延时函数

51单片机延时函数
51 单片机延时函数
函数简介:以下六个函数为 51 单片机延时函数,全部都下载到 单片机里测试通过,特别是秒、毫秒延时函数,精确度很高,完全可 以替代定时器。 /* 文件名 DELAY.H 功能 延时(12M 24M) 误差 Ms S 5% 10Us 8%-80% */ //24M 晶振 延时 n 毫秒 void DelayMs_24M(unsigned int n) {
} //24M 晶振 延时 10*n 微秒 void Delay10Us_24M(unsigned int n) {
unsigned int i=0; char j=0; for(i=0;i<n;i++)
for(j=0;j<2;j++); }
//12M 晶振 延时 n 毫秒 void DelayMs_12M(unsigned int n) {
unsigned int i=0,j=0; for(i=0;i<n;i++)
for(j=0;j<357;j++); } //24M 晶振 延时 n 秒 void DelayS_24M(unsigned int n) {
unsigned int i=0,j=0; for(i=0;i<n;i++)
for(j=0;j<54053;j++);
} //12M 晶振 延时 10*n 微秒 void Delay10Us_12M(unsigned int n) {
while(n--); }
建议把以上文件封装成头文件,便于以后随时调用。 2012.09.18.whut
unsigned int i=0,j=0; for(i=0;i<n;i++)
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C程序中可使用不同类型的变量来进行延时设计。

经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char 作为延时变量。

以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。

一. 500ms延时子程序
程序:
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}

计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值1us = 3us
循环外: 5us 子程序调用2us + 子程序返回2us + R7赋值1us = 5us
延时总时间= 三层循环+ 循环外= 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
二. 200ms延时子程序
程序:
(
void delay200ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=132;j>0;j--)
for(k=150;k>0;k--); }
三. 10ms延时子程序程序:
void delay10ms(void)
$
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--); }
四. 1s延时子程序
程序:
void delay1s(void)
{
/
unsigned char h,i,j,k;
for(h=5;h>0;h--)
for(i=4;i>0;i--)
for(j=116;j>0;j--)
for(k=214;k>0;k--);
}
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。

(
共有三条延时函数说明如下:
函数调用分两级:一级是小于10US的延时,二级是大于10US的延时
//====================小于10US的【用
1US级延时】====================
//----------微秒级延时---------
for(i=X;i>X;i--) 延时时间=(3+5*X)/12 提示(单位us, X不能大于255)
//================大于10US<小于的可用【10US级延时函数】===========
void Delay10us(uchar Ms)
{

uchar data i;
for(;Ms>0;Ms--)
for(i=26;i>0;i--);
}
i=[(延时值*12/Ms-15]/4
如想延时60US则i=[*12/6-15]/4=≈26; 修
改i的值=26,再调用上面的【10US级延时函数】Delay10us(6); 则就精确延时60US;
如果想延时64US可以用这二种函数组合来用: Delay10us(6); for(i=9;i>X;i--) 共延时64US。

相关文档
最新文档