[STC系列单片机/51单片机]软件延时计算方法详解

选取12M晶振时,时钟周期为(1 / 12) us,且假如单片机工作在12T模式下,则一个机器周期为12 * (1 / 12) = 1 us。
为表述方便,下文均用T_M表示机器周期,观察KEIL仿真运行时间具体如下:
[STC系列单片机/51单片机]软件延时计算方法详解_第1张图片
[STC系列单片机/51单片机]软件延时计算方法详解_第2张图片
进入Delay函数前运行时间为T_1 = 0.000601s
[STC系列单片机/51单片机]软件延时计算方法详解_第3张图片
子程序调用过程T= 0.000002us = 2 * T_M
[STC系列单片机/51单片机]软件延时计算方法详解_第4张图片
立即数1000送字节S操作T= 0.000002s = 2 * T_M
[STC系列单片机/51单片机]软件延时计算方法详解_第5张图片
[STC系列单片机/51单片机]软件延时计算方法详解_第6张图片
可见while(S–)一步耗时0.000009s = 9 * T_M
[STC系列单片机/51单片机]软件延时计算方法详解_第7张图片
[STC系列单片机/51单片机]软件延时计算方法详解_第8张图片
While(s–)->}一步耗时0.00001s = 10 * T_M
[STC系列单片机/51单片机]软件延时计算方法详解_第9张图片
子程序返回0.000002s = 2 * T_M
所以do while实现软件延时流程图为:
[STC系列单片机/51单片机]软件延时计算方法详解_第10张图片

[STC系列单片机/51单片机]软件延时计算方法详解_第11张图片

由于S只能取整数,遂做改进如下:
[STC系列单片机/51单片机]软件延时计算方法详解_第12张图片
其中可加任意数量的_nop_()函数,以实现精准延时,读者可自行添加验证。

KEIL验证源码如下:

void Delay_ms()		
{
	unsigned int s = ???????;
	do
	{
	}
	while(s--);
}

void main()
{
	//add your functions here!
	Delay_ms();
	//add your functions here!
}

你可能感兴趣的:(单片机及硬件相关,单片机,嵌入式)