惊讶:使用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

邮箱: momo@jepsun.com

产品经理: 李经理

QQ: 2215069954

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

微信二维码

更多资讯

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

  • 如何在高速电路中合理选择零延迟与低延迟时钟缓冲器 高速电路设计中时钟缓冲器的选型策略随着集成电路工作频率不断攀升,时钟信号的延迟与抖动问题日益突出。正确选择零延迟缓冲器或低延迟时钟缓冲器,是确保系统稳定运行的关键环节。一、影响选型的关键参数1. 延迟(Lat...
  • 零延迟缓冲器与低延迟时钟缓冲器的技术原理及应用解析 零延迟缓冲器与低延迟时钟缓冲器的核心技术对比在高速数字系统设计中,时钟信号的完整性与传输延迟直接影响系统的性能与稳定性。零延迟缓冲器(Zero Delay Buffer, ZDB)和低延迟时钟缓冲器(Low Latency Clock Buffer)是两类关键的...
  • 深入解析SCR控制器与计时延迟协同机制及RS-232接口的电磁兼容设计实践 SCR控制器与计时延迟的协同工作机制在电力电子控制系统中,计时延迟与SCR控制器并非独立存在,而是通过时序逻辑紧密配合,共同实现精准的功率调节。例如在交流调功系统中,通过设定触发延迟角(firing angle),控制SCR导通...
  • 可编程晶振技术解析:I²C接口如何实现精准频率调节 可编程晶振的核心优势与应用前景随着电子设备对时钟精度和灵活性要求的不断提升,可编程晶振(Programmable Crystal Oscillator, PCXO)正逐渐成为现代嵌入式系统中的关键元件。尤其在支持I²C通信协议的可编程晶振中,用户可通过软...
  • 深入理解I²C可编程晶振:从原理到实际部署指南 I²C可编程晶振的实际部署与优化策略尽管可编程晶振在理论上提供了极高的灵活性,但在实际工程应用中仍需注意诸多细节。本文将从硬件连接、软件配置、抗干扰设计等方面,提供一套完整的部署指南。1. 硬件连接要点正确连...
  • 计时延迟与SCR控制器应用详解 在工业自动化和电力电子领域,计时延迟和SCR(Silicon Controlled Rectifier,可控硅整流器)控制器是两个非常关键的技术概念。它们被广泛应用于各种设备和系统中,从家用电器到大型工业设备,都离不开这两项技术的支持。下面我...
  • 零延迟缓冲器工作原理及应用 零延迟缓冲器是一种在信号处理领域广泛应用的技术,它主要用于消除信号传输过程中的延迟问题。在数字信号处理、音频工程以及视频处理等领域中,延迟是一个常见问题,可能导致信号失真或同步问题。零延迟缓冲器通过先...
  • 如何正确使用与维护精密插件电阻以延长其寿命 精密插件电阻的正确使用与维护策略尽管精密插件电阻具有出色的性能表现,但若使用不当或缺乏维护,仍可能导致性能下降甚至失效。因此,掌握正确的操作方法和维护技巧至关重要。1. 安装过程注意事项避免过度加热:焊接...
  • ESD静电抑制管的寿命是多久?如何延长其使用寿命? ESD静电抑制管的寿命主要受到其工作环境和使用条件的影响,一般情况下其寿命可以达到数年。为了延长ESD静电抑制管的使用寿命,需要注意以下几点:保持ESD静电抑制管的工作环境清洁,避免其受到污染或损伤。避免ESD静电抑...
  • double sum = 0.0; for(int i = 0; i < n; i++) { if(resistors[i] > 0) { sum += 1.0 / resistors[i]; 在C语言中计算并联电阻的总电阻是一个常见的应用问题,它涉及到基本的物理知识与编程技巧的结合。并联电路中的总电阻可以通过所有并联电阻倒数的和的倒数来计算。首先,我们需要定义一个函数来处理这一计算过程。例如...
  • 103瓷片电容表示的是0.01μF的电容值而非K单位 103瓷片电容表示的电容量是0.01μF(微法),而不是K(千)单位。这里的数字和字母组合是一种简化标记方式,用于表示电容器的电容值。具体来说,“103”中的“10”代表的是电容值的有效数字部分,“3”则表示在有效数字后面...
  • 高精密贴片电阻阻值表标准阻值表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...
  • 深入解读积层压敏电阻JMV-E:从原理到实际应用的全面指南 积层压敏电阻JMV-E的工作原理积层压敏电阻基于非线性电阻特性,在正常电压下呈现高阻态,当电压超过阈值时迅速转入低阻态,从而将瞬时过电压泄放至地线,保护后级电路。关键性能参数解析 参数名称 典型值 说明 ...
  • ALPS编码器原理详解:从基础结构到实际应用 ALPS编码器原理详解:从基础结构到实际应用ALPS编码器是一种广泛应用于工业自动化、机器人控制和精密运动系统中的高精度位置检测装置。其核心原理基于光学或磁性信号的周期性变化,通过读取编码器输出的脉冲信号来确定旋...
  • 如何延长TVS管的使用寿命? 为了延长TVS管的使用寿命,有几点需要注意:首先,在使用TVS管之前,应确保其型号、规格和参数与电路中的要求相符;其次,应确保电路中的电压和电流不超过TVS管的额定值;最后,应确保电路中有足够的散热措施,以防止TVS...
  • 如何正确选型与使用SMD-1.6X0.8mm LED灯珠?实用指南 选型关键因素与注意事项在选择SMD-1.6X0.8mm圆顶LED灯珠时,需综合考虑多个技术指标,以确保产品性能稳定、寿命长久。1. 确定发光颜色与波长根据实际用途选择合适的颜色:红色用于电源状态指示;绿色常用于“待机”或“正常...
  • 如何选择适合的电阻?从精密与不精密的对比看实际选型策略 电阻选型关键因素:从精度到环境适应性在实际电子产品设计中,正确选择电阻类型是确保系统性能达标的关键步骤。本文将从多个维度深入分析精密电阻与非精密电阻的区别,并提供实用选型建议。1. 明确电路对精度的要求若...
  • 深入理解积层压敏电阻JMV-C:从原理到实际应用的全面指南 积层压敏电阻的工作原理积层压敏电阻(MLV, Multilayer Varistor)是通过将多个压敏陶瓷层与金属电极交替沉积并高温烧结而成的片式元件。其核心材料为氧化锌(ZnO)基复合陶瓷,具有显著的非线性伏安特性。非线性伏安特性详解...
  • 如何利用3mm RGB LED灯珠打造个性化灯光效果?实用教程分享 用3mm RGB LED灯珠打造炫彩灯光效果的实战指南随着智能家居和创意电子项目的兴起,3mm RGB LED灯珠因其小巧精致、色彩丰富而备受青睐。本文将以HELI2 Round-3mm (T1) RGB 3mm LED灯珠为例,详细介绍如何将其应用于个性化灯光系统中。1. ...
  • 计时延迟与SCR控制器在工业自动化中的应用及RS-232 EMC设计优化 计时延迟与SCR控制器在工业自动化中的核心作用在现代工业自动化系统中,计时延迟和可控硅(SCR)控制器是实现精确过程控制的关键组件。计时延迟用于调节信号响应时间,避免因瞬时干扰导致误触发;而SCR控制器则通过相位...