快速计算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一样的
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值