精华内容
下载资源
问答
  • 参考了51单片机 Keil C 延时程序的简单研究,自己也亲身测试和计算了一些已有的延时函数
  • // 描述: 延时函数。 // 参数: ms,要延时的ms数, 这里只支持1~255ms. 自动适应主时钟. // 返回: none. // 版本: VER1.0 // 日期: 2013-4-1 // 备注: //==========================================================...
  • 本文主要简单介绍了51单片机延时函数
  • 51单片机延时函数

    千次阅读 多人点赞 2019-11-13 10:48:54
    指令周期 :几个机器周期能完成一项基本操作,但一条...机器周期:8051系列单片机的机器周期=12*时钟周期,之所以这样分是因为单个时钟周期根本干不了一件完整的事情(如取指令、写寄存器、读寄存器等),而12个时钟...

    指令周期 :几个机器周期能完成一项基本操作,但一条指令常常是需要多项基本操作结合才能完成,完成一条指令所需的时间就是指令周期,当然不同的指令,其指令周期就不一样。通常含一个机器周期的指令称为单周期指令,包含两个机器周期的指令称为双周期指令。
    机器周期:8051系列单片机的机器周期=12*时钟周期,之所以这样分是因为单个时钟周期根本干不了一件完整的事情(如取指令、写寄存器、读寄存器等),而12个时钟周期就能基本完成一项基本操作了。
    时钟周期:时钟周期=振荡周期,名称不同而已,都是等于单片机晶振频率的倒数,如常见的外接12M晶振,那它的时钟周期=1/12M。
    机器周期=12个时钟周期。
    下面是三者关系图
    在这里插入图片描述
    一、软件延时
    1.1 普通软件延时函数是这样的,在晶振频率在11.0592Mhz的时候,内层 i=114.为什么是114呢?因为程序经过在keil中运行,计算出一次自减时间约为8.7us。
    所以在1ms自减运算的次数为: 1000/8.7=114
    在这里插入图片描述
    1.2自动 适应主时钟 的延时函数。

    在这里插入图片描述
    时钟频率:1秒钟CPU震动的次数;STC89C52是11.0592MHZ 也就是 11059200HZ;在1秒内有11059200个时钟周期。
    //96T per loop :每一条自减语句需要96个时钟周期,需要96个脉冲
    在这里插入图片描述
    所以 i=MAIN_Fosc/9600;

    展开全文
  • 单片机延时函数

    千次阅读 2016-04-26 17:13:12
    精确的单片机常用延时函数:(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 ...



    精确的单片机常用延时函数:(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
    }
    展开全文
  • 一个非常好的51单片机辅助工具,可以生成各T的延时函数代码,还有串口波特率等基本功能(已破解)
  • 单片机延时函数实现

    千次阅读 2017-06-13 17:08:31
    在编写单片机程序时,我们经常要用到延时函数,记得我们在学51单片机时,第一个延时是通过软件延时来实现的,代码如下: void delay(volatile uint32_t cnt){ volatile uint32_t i = 0; volatile uint32_t j = 0;...

    在编写单片机程序时,我们经常要用到延时函数,记得我们在学51单片机时,第一个延时是通过软件延时来实现的,代码如下:

     

    void delay(volatile uint32_t cnt){ volatile uint32_t i = 0; volatile uint32_t j = 0; for(i = 0;i<cnt;i++) for(j = 0;j<1000;j++); }
    软件延时的优点是方便,然而却不能提供很精确的延时,而且占用CPU资源,下面的以STM32L1为例,采用定时器方式实现,可以提供很精确的延时。代码如下:

     

     

     

     

    /* CPU主频:32MHz Timer2_clk = 32MHz */ void Delay_Init(void) { /* TIM2 clock enable */ RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM2, ENABLE ); } void Delay_ms(uint16_t ms) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = ms - 1; TIM_TimeBaseStructure.TIM_Prescaler = 32000 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /*每当初始化计数器会使计数器更新,TIM_FLAG_Update被置位*/ TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure ); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_Cmd( TIM2, ENABLE ); while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == RESET); TIM_Cmd( TIM2, DISABLE ); } void Delay_us(uint16_t us) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = us - 1; TIM_TimeBaseStructure.TIM_Prescaler = 32 - 1; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit( TIM2, &TIM_TimeBaseStructure ); TIM_ClearFlag(TIM2, TIM_FLAG_Update); TIM_Cmd( TIM2, ENABLE ); while(TIM_GetFlagStatus(TIM2,TIM_FLAG_Update) == RESET); TIM_Cmd( TIM2, DISABLE ); }

     

    调用延时函数时,我们每次对定时器的溢出时间进行设置,我们以更新标志置位作为延时结束。注意上面函数的参数不能为1,如果为1会使函数跑死。当然这个延时函数也是阻塞式的。

     

     

    展开全文
  • 单片机延时函数微调

    千次阅读 2018-06-01 20:46:34
    计算延时时间 设置断点 执行到单行 晶振公式 进入调试模式 获得数据 调整晶振 晶振公式 试验一 试验二 试验三 程序代码 现在我用LED闪烁的代码进行讲解说明 /***************************************...

    程序代码

    现在我用LED闪烁的代码进行讲解说明

    /********************************************************************
    *                     LED闪烁的简单试验                                
    *
    ********************************************************************/
    #include <reg51.h>     //此文件中定义了51的一些特殊功能寄存器
    
    void delay(unsigned int i);  //声明延时函数
    
    void main()
    { 
        while(1)
        {
            P2  = 0x00; //置P0口为低电平
            delay(6000); //调用延时程序
            P2  = 0xff; //置P0口为高电平
            delay(6000); // 调用延时程序
        }
    }
    /*******延时函数*************/
    void delay(unsigned int i)
    {
        unsigned char j,k;
        for(i; i > 0; i--)   
            for(j = 255; j > 0; j--);
                for(k = 255; k > 0; k--);
    }

    好的,可以看到我上面的延时函数主要是用了三层循环。那么其中 j 和 k 的值是不是可以取任意值?最大可以取多大呢?下面我通过不断试验去测试一下这两个值。

    计算延时时间

    设置断点

    为了计算延时时间,我们要在以下两个地方设置断点。分别是13行和15行,为什么设置这两行就可以计算延时时间呢?因为中间间隔着一个延时函数嘛,所以我们只要将执行到这两行的时间做一个差,便可以得到延时时间。
    这里写图片描述

    执行到单行

    这里写图片描述

    晶振公式

    在此之前,我先要介绍一个公式。但是用这个公式需要用到一些数据,为了得到这些数据我们还需要做以下两个步骤:

    进入调试模式

    我们点击下面这个按钮,进入调试模式
    这里写图片描述

    获得数据

    然后,我们就可以在左边的列表看到这两个数据。其中,states是指令数,sec是从程序开始运行到执行本行所花的时间,基于不同的晶振。
    这里写图片描述

    调整晶振

    这个公式和晶振相关,那么去哪里调整晶振呢?通过下面的两个步骤,我们可以调整晶振。
    这里写图片描述

    晶振公式

    试验一

    我们现在看看最初j=255和k=255这种情况下,这两个值是多少。
    这里写图片描述
    这里写图片描述这里写图片描述

    试验二

    这次,我把j调整成之前的两倍,看看这两个数据会是什么样的结果。
    这里写图片描述
    这里写图片描述这里写图片描述

    试验三

    这里写图片描述
    这里写图片描述这里写图片描述

    展开全文
  • C语言循环语句实现单片机延时函数.pdf
  • 为了方便51单片机在不同晶振频率下,延时函数能正常使用而打包的延时函数。改变频率后只需改变一下宏定义即可。 delay.h #ifndef _DELAY_H #define _DELAY_H //注意时钟频率设置正确 //-------------------...
  • c语言的单片机delay延时函数详解

    万次阅读 多人点赞 2021-04-07 11:32:15
    c语言及单片机delay延时函数延时函数1、是什么2、为什么3、用在哪里?4、怎么做1、循环延时 延时函数 延时函数,作为一种常用函数,在不同的领域有不同的用处。而在嵌入式以及C语言的编写中,我们常常遇到需要自己来...
  • 单片机延时函数的理解

    千次阅读 2020-07-15 09:59:17
    在实现单片机功能的时候,经常会用到延时函数,那么延时函数的原理也是非常有必要了解的。一般我们写延时函数的时候,默认的晶振频率fosc=12MHZ,而机器周期T=12/fosc=1us。 这里我们来写一个10ms的延时函数: void ...
  • 51单片机C语言延时函数怎么定义和使用

    万次阅读 多人点赞 2019-01-06 17:38:04
    C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为...
  • 单片机延时助手

    2013-06-24 15:43:31
    适合新手学习51单片机延时助手 能自动生成代码
  • 单片机C语言精确延时计算器,延时精度误差。可设置不同单片机和晶振频率。
  • 51单片机C语言us级延时函数

    千次阅读 2020-05-30 10:53:53
    Shawsun2014-04-26 23:34:21 C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned ... 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。 一. 500ms延时子程序 程序: void de...
  • 单片机-延时函数

    2020-02-06 20:38:03
    延时函数 #define uint unsigned int void delayms(uint xms){ uint i, j; for(i=xms;i>0;i--) //延时xms毫秒(ms) for(j=110;j>0;j--); }
  • 单片机中的延时函数

    千次阅读 2017-06-12 21:50:43
    单片机的设计中延时函数最是常见,比如流水灯的时间控制等都需对时间进行控制,因此博主贴出一个简单的延时函数供参考./************************************************************/ // 通过延时函数实现数码管...
  • 单片机自定义延时函数Delay取值详解

    万次阅读 2019-08-31 11:16:20
    我们想实现一个定时延时函数,在单片机里并没有什么sleep,需要我们自己实现。 延时函数跟 晶振频率 有很大的关系,因为晶振频率影响程序执行速度。 1、打开Keil 4 - Target Options - Target - Xtal(MHz) -里填写...
  • 本文给大家分享了51单片机精确延时函数集锦。
  • 【51单片机延时函数计算问题以及如何准确延时

    万次阅读 多人点赞 2016-01-15 23:52:09
    单片机提供时钟脉冲信号的振荡源的周期 T=1/f 状态 振荡周期经二分频后得到的 2T 机器 在一个机器周期内,CPU可以完成一个独立的操作 12T 指令 指CPU完成一条操作所需的全部时间 12-12nT 指令: 1、MUL、...
  • CC2530单片机延时函数实际测试

    千次阅读 2017-06-23 15:52:25
    因为要检测不同的波形,所以对时间要求很高,但是发现Zstack本身提供的微秒级的延时其实有误差。  因此特地写了测试函数,然后用示波器观察了时间。详细如下:  先说CC2530与普通8051单片机时钟的不同,CC2530的...
  • 1)一个是最多只能生成循环变量为3的延时函数,延时长达多秒时显然三个循环变量已经不足,给出的是错误的延时函数。 2)检查发现当初始化循环变量为0时,Keil C51 编译器会编译为: CLR A MOV Rx,A 而非...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,259
精华内容 7,303
关键字:

单片机延时函数