单片机延时函数微调

2019-04-15 12:17发布

程序代码

现在我用LED闪烁的代码进行讲解说明 /******************************************************************** * LED闪烁的简单试验 * ********************************************************************/ #include //此文件中定义了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调整成之前的两倍,看看这两个数据会是什么样的结果。
这里写图片描述
这里写图片描述这里写图片描述

试验三

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