我是靠谱客的博主 光亮眼神,最近开发中收集的这篇文章主要介绍快速计算delay函数中for循环延时程序占用的时间,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 首先根据板子上晶振知道时钟频率为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一样的

最后

以上就是光亮眼神为你收集整理的快速计算delay函数中for循环延时程序占用的时间的全部内容,希望文章能够帮你解决快速计算delay函数中for循环延时程序占用的时间所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部