飞道的博客

快速计算delay函数中for循环延时程序占用的时间

318人阅读  评论(0)
  • 首先根据板子上晶振知道时钟频率为12MHz(=0.08us=0.1us),板子上长方形金属外壳上有标(或者看原理图)

  • 根据ISP软件延时计算器得到循环代码

  • 运行_nop_()需要包含库 #include <INTRINS.H>

void Delay500ms()		//@12.000MHz
{
   
	unsigned char i, j, k;

	_nop_();
	_nop_();
	i = 23;
	j = 205;
	k = 120;
	do
	{
   
		do
		{
   
			while (--k);
		} while (--j);
	} while (--i);
}
  • 计算循环计算次数 23 × 205 × 120 = 565,800
  • ➗12MHz = 0.04715s 和500ms不符合
  • 根据百度知道,一条for语句占用10T
  • ×10计算得0.4715s大致符合500ms=0.5s 突然发现原版是do while格式
  • 根据这篇文章 【51单片机】延时函数计算问题以及如何准确延时https://blog.csdn.net/wait_for_taht_day5/article/details/50526490,取得12T只能计算个大概数值
  • 只有一层for循环时,用跑马灯显示效果挺慢的
void delay()
{
   
    unsigned int i;
    for(i = 0; i < 50000; i++);
}
  • 书上例子双层for循环代入上述公式为0.1s
void delay()
{
   
    unsigned int i, j;
    for(i = 0; i < 1000; i++)
        for(j = 0; j < 110; j++);
}
  • 改写do while格式输入如下所示,先生产1ms代码,参考B站视频 51单片机入门教程-2020版 程序全程纯手打 从零开始入门

51单片机入门教程-2020版 程序全程纯手打 从零开始入门

void Delay1ms()		//@12.000MHz
{
   
	unsigned char i, j;

	i = 12;
	j = 169;
	do
	{
   
		while (--j);
	} while (--i);
}
  • 对1ms程序进行叠加得xms,改写成
void Delay1ms(unsigned int xms)		//@12.000MHz
{
   
	unsigned char i, j;
	while(xms)
	{
   
		i = 12;
		j = 169;
		do
		{
   
			while (--j);
		} while (--i);
		xms--;
	}
}
  • 看程序代码应该do while效率更高,但是计算时间应该是和for一样的

转载:https://blog.csdn.net/xiong_xin/article/details/117393050
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场