惊讶:使用Keil C编写51个单片机延迟程序实际上是如此精致

当使用单片机时,我们经常遇到需要短时间延迟的情况。所需的延迟时间非常短,通常为数十到数百微秒(us)。
有时需要高精度。例如,当使用单片机驱动DS18B20时,允许的误差范围在十几码之内,否则很容易出错。
在这种情况下,使用计时器通常很麻烦。在极端情况下,计时器甚至被用于其他目的。
这时,我们需要考虑其他方式。以前使用汇编语言编写MCU程序时,此问题相对容易解决。
例如,使用12MHz的晶体振荡器51,打算延迟20us,只要以下代码可以满足一般需要:51单片机的指令周期是晶体振荡器频率的1/12,即, 1us的周期。 mov r0,#09h需要2个极限周期,而djnz也需要2个极限周期。
那么,存储在r0中的数字为(20-2)/ 2。使用这种方法,可以非常方便地实现小于256us的延迟。
如果需要更长的时间,则可以使用两个级别的嵌套。而且精度可以达到2us,一般来说,这就足够了。
现在,毫无疑问,Keil的C编译器得到了更广泛的使用。与汇编相比,C当然具有许多优点,例如程序易于维护,易于理解,适用于大型项目。
但是缺点(我认为这是C的唯一缺点)是无法保证实时性能,并且无法预测代码执行的指令周期。因此,在实时性要求较高的场合,还需要组合件和C的联合应用。
但是是否需要使用汇编程序来实现这样的延迟程序?为了找到这个答案,我做了一个实验。要使用C语言实现延迟程序,首先想到的是C中常用的loop语句。
以下代码是我在Internet上经常看到的代码:该代码的准确性如何?为了直接衡量此代码的效果,我发现了Keil C基于此代码生成的汇编代码:我真的不知道~~~我可以看到这个延迟程序有多不准确~~~在这四个主要语句中,需要6个机器周期。换句话说,它的准确度最高为6us,其中不包括lcall和ret。
如果我们列出调用函数时分配的i值的根延迟长度,则为:因为函数调用需要2个时钟周期的lcall,所以延迟时间比从函数代码的执行时间长2倍。顺便说一句,有些朋友写了这段代码:有些人可能认为它将生成更长的汇编代码,但事实证明生成的代码是相同的。
但这确实不是一个好习惯。因为实际上没有必要在此处引入额外的变量。
我们继续讨论这个话题。一些朋友甚至使用此代码来获得更长的延迟:此代码生成的汇编代码是什么?实际上,您不必考虑它就知道$#^%&%$有多可怕。
....让我们看看:呵呵,这确实可以延迟很长时间~~~但是根本没有精度。那么,使用C可以实现准确的延迟吗?我对代码进行了一些更改:因为根据经验,更简洁的C代码通常可以导致更简洁的机器代码。
这是什么结果?取出它生成的汇编代码并对其进行查看。希望我按了“构建目标”按钮,结果是沉重的打击:尽管生成的代码与使用for语句不同,但是我可以毫无疑问地说这两种方法的效率是相同的。
。似乎到此结束,因为我真的想不出任何简化源程序的空间。
看来我即将得出这个结论:“如果您需要我们级别的延迟精度,请在需要时使用汇编语言。”但这是真的吗?我仍然不甘心。
因为我不相信著名的Keil C编译器甚至不能使用djnz? ? ?因为实际上在程序主体中仅需要一个句子循环:djnz r7,循环。几乎是绝望的(在这种情况下人们通常会爆发,哦哈哈哈~~~),我只是更改了它:不在意地编译,请看源代码:天堂~~~出现了奇迹。
.....我认为该程序应该已经能够满足一般需求。如果创建表:计算延迟时间时,已计算调用函数的lcall语句的2个时钟周期。
最后,结果很明显。只要合理使用,C仍然可以达到意想不到的结果。
许多朋友抱怨C的效率比汇编的要差得多。实际上,如果您对Keil C的编译原理有更深入的了解,则可以通过适当的语法用法来优化生成的C代码。
前夕

公司: 深圳市捷比信实业有限公司

电话: 0755-29796190

邮箱: tao@jepsun.com

产品经理: 陆经理

QQ: 2065372476

地址: 深圳市宝安区翻身路富源大厦1栋7楼

微信二维码

更多资讯

获取最新公司新闻和行业资料。

  • 零延迟缓冲器工作原理及应用 零延迟缓冲器是一种在信号处理领域广泛应用的技术,它主要用于消除信号传输过程中的延迟问题。在数字信号处理、音频工程以及视频处理等领域中,延迟是一个常见问题,可能导致信号失真或同步问题。零延迟缓冲器通过先...
  • 计时延迟与SCR控制器应用详解 在工业自动化和电力电子领域,计时延迟和SCR(Silicon Controlled Rectifier,可控硅整流器)控制器是两个非常关键的技术概念。它们被广泛应用于各种设备和系统中,从家用电器到大型工业设备,都离不开这两项技术的支持。下面我...
  • double sum = 0.0; for(int i = 0; i < n; i++) { if(resistors[i] > 0) { sum += 1.0 / resistors[i]; 在C语言中计算并联电阻的总电阻是一个常见的应用问题,它涉及到基本的物理知识与编程技巧的结合。并联电路中的总电阻可以通过所有并联电阻倒数的和的倒数来计算。首先,我们需要定义一个函数来处理这一计算过程。例如...
  • ESD静电抑制管的寿命是多久?如何延长其使用寿命? ESD静电抑制管的寿命主要受到其工作环境和使用条件的影响,一般情况下其寿命可以达到数年。为了延长ESD静电抑制管的使用寿命,需要注意以下几点:保持ESD静电抑制管的工作环境清洁,避免其受到污染或损伤。避免ESD静电抑...
  • 高精密贴片电阻阻值表标准阻值表E-96 0603F(+1%) Standard Resistance Table 标准阻值表1 E-96 阻值 代码 阻值 代码 阻值 代码 阻值 代码 阻值 代码 阻值 代码 10 01X 100 01A 1.00K 01B 10.0K 01C 100K 01D 1M 01E 10.2 02X 102 02A 1.02K 02B 10.2K 02C 102K 02D 10.5 03X 105 03A 1.05K 03B 10.5K 03C 105K 03D 10.7 04X 107 04A 1.07K 04B 10.7K 04C 107K 04D 11 05...
  • 103瓷片电容表示的是0.01μF的电容值而非K单位 103瓷片电容表示的电容量是0.01μF(微法),而不是K(千)单位。这里的数字和字母组合是一种简化标记方式,用于表示电容器的电容值。具体来说,“103”中的“10”代表的是电容值的有效数字部分,“3”则表示在有效数字后面...
  • 如何延长TVS管的使用寿命? 为了延长TVS管的使用寿命,有几点需要注意:首先,在使用TVS管之前,应确保其型号、规格和参数与电路中的要求相符;其次,应确保电路中的电压和电流不超过TVS管的额定值;最后,应确保电路中有足够的散热措施,以防止TVS...
  • 瓷片电容103的实际容量为0.01μF 瓷片电容103是一种常见的电子元件,其容量标识为103,按照电容标识的常规方法,这种标记方式意味着它的容量是10×10^3pf,即10,000皮法(picofarads)。在电子工程中,皮法是电容的基本单位之一。将皮法转换为更常用的微法(micr...
  • 电阻精密度1%能代0.1%吗? 不能!其实,对于不是搞计量的不需要分的那么清楚,可以大体上认为高精密、高准确、低误差等是一个意思。但是,对于“精度”一词,可以分解成分解成三个要素:&nbsp;1 、温度系数:温度变化是电阻的大敌,温度系数一...
  • 贴片电阻的精密度有0.1%的吗 其实,对于不是搞计量的不需要分的那么清楚,可以大体上认为高精密、高准确、低误差等是一个意思。但是,对于“精度”一词,可以分解成分解成三个要素:&nbsp;1 、温度系数:温度变化是电阻的大敌,温度系数一般用ppm...
  • 精密电阻_精密贴片电阻的制作流程图 精密电阻是贴片电阻的一种,具有很高的ppm值,可以达到1ppm,精密电阻的特点是:防潮、耐高温、可靠性高、外观尺寸均匀、精度高、温度系数和电阻公差小。精密电阻器通常是金属膜电阻器,它是在绝缘基板上通过蒸发和溅射...
  • 可编程晶振的工作原理和应用领域 可编程晶振是一种电子元件,其核心功能是生成精确的时钟信号,用于同步数字电路中的各种操作。与传统晶振相比,可编程晶振的最大特点在于其频率可以通过软件进行调整,这使得它在需要频繁改变系统工作频率的应用中表...
  • 单层芯片电容是什么 单层芯片电容器具有体积小、应用频率高、损耗低的特点,广泛应用于移动通信、雷达、航空航天等各种射频模块电路设计中,起到隔离、旁路、滤波、耦合等作用,是微波电路中必不可少的电子元件。单层芯片电容器属于无源...
  • TVS管是如何实现稳压功能的? TVS管是通过改变其结构和工作原理来实现稳压功能的。TVS管的基本工作原理是利用二极管的单向导电特性,将电路中的电压分成两个部分。其中,一个电压通过二极管,进入到TVS管的阴极,然后从阳极流出;另一个电压则被限制...
  • ALPS编码器在现代工程应用中的优势与特点 ALPS编码器作为一种高精度、高性能的旋转编码器,在现代工程领域中扮演着重要的角色。其优势和特点主要体现在以下几个方面:1. 高精度与可靠性:ALPS编码器以其卓越的精度和可靠性著称,能够在各种恶劣的工作环境下保持稳...
  • 片式薄膜电阻制作工序 薄膜技术薄膜片式电阻器的示意图将电阻层溅射(真空沉积)到陶瓷基底上。这产生了约0.1微米厚的均匀金属膜。通常使用镍和铬的合金(镍铬合金)。它们以不同的层厚度生产,以适应一系列电阻值。该层致密且均匀,这使得...
  • 元利富气缸行程开关AL-10R, CS1-J, C系列:可靠性能与广泛应用 元利富生产的气缸行程开关AL-10R, CS1-J, C系列是工业自动化领域中的重要组成部分。这些型号的行程开关广泛应用于各种机械和设备中,用于检测气缸的位置变化,从而实现自动化控制的目的。AL-10R型行程开关以其紧凑的设计和可...
  • 可编程晶体振荡器(XO)的工作原理和应用领域 可编程晶体振荡器(XO)是一种时钟发生器,它通过将晶体与外部电路结合,产生精确的输出频率。这种设备的核心是石英晶体,它具有压电效应,即在晶体上施加机械应力时会产生电压,反之亦然。当晶体受到交流电激励时,...
  • ALPS编码器在现代工程应用中的重要性与优势 ALPS编码器作为一种高性能的旋转编码器,在现代工程领域中扮演着极其重要的角色。它以其卓越的精度、稳定性和可靠性而著称,广泛应用于各种自动化设备和精密控制系统中。ALPS编码器能够提供精确的角度位置反馈,这对于需...
  • 铝电解电容器寿命如何延长? 铝质电容器通常用于当紧凑型设计,不过这种电容器是众所周知的大损耗电容器,然而它的工作寿命对应用可以是至关重要的,只是要在规格表中找出它的具体寿命,倒是要花上一些工夫滴。采购长工作寿命铝电解电容器并非易...