目录
前言
一、原理图及知识点介绍
二、代码分析
知识点四:delay(u16 i)这个函数为什么i=1时,大约延时10us?
前言
已经是第二个实验了,上一个实验是点亮第一个LED灯,这个实验是LED的闪烁。
一、原理图及知识点介绍
原理图与上一小节相同请参考上一小节:
51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验一 点亮第一个LED_ManGo CHEN的博客-CSDN博客
二、代码分析
先来介绍一下工程:

下面我们就直接上代码:
/**************************************************************************************
*		              LED闪烁实验												  *
实现现象:下载程序后D11指示灯闪烁
注意事项:无																				  
***************************************************************************************/
#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;
sbit led=P0^0;		 //将单片机的P0.0端口定义为led
/*******************************************************************************
* 函 数 名         : delay
* 函数功能		   : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
	while(i--);	
}
/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{
	while(1)
	{
		led=0;
		delay(50000); //大约延时450ms
		led=1;
		delay(50000); //大约延时450ms	
	}		
}前面的知识点一、二、三都在前一小节:51单片机(普中HC6800-EM3 V3.0)实验例程软件分析 实验一 点亮第一个LED_ManGo CHEN的博客-CSDN博客
知识点四:delay(u16 i)这个函数为什么i=1时,大约延时10us?
下面是从MCU手册中的原话:



从上面可以看出一句汇编指令(机器周期)=12个CPU工作时钟,要想知道delay这个函数中的while语句翻译成汇编有几条汇编指令组成:

我们使用的为12MHZ的晶振,也就是一个机器周期为1us
下面我我们仿真做实验:
1、先将程序运行到while语句开头,此时系统运行时间为394us

2、再将程序运行到while语句结尾处,此时系统运行时间为401us,消耗了7us的时间,刚好执行了7条汇编指令。

3、再将程序运行到while语句开头处,此时系统运行时间为403us,共消耗了9us的时间,大概10us的样子(不是太准确)

因为不是太准确,例程中
delay(50000); //大约延时450ms
确实是用的9us来计算的延时。
现在知道单片机中的延时是怎么得出来的了吧。














![[数据集][目标检测]遛狗不牵绳数据集VOC格式-1980张](https://i0.hdslb.com/bfs/archive/b218ed1884b250be57b2ee3ae09d26814eb427c8.jpg@100w_100h_1c.png@57w_57h_1c.png)




