单片机延时函数微调

程序代码

现在我用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调整成之前的两倍,看看这两个数据会是什么样的结果。
这里写图片描述
这里写图片描述这里写图片描述

试验三

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

猜你喜欢

转载自blog.csdn.net/qq_15299517/article/details/80542703