深圳市瑞申电子有限公司

深圳市瑞申电子有限公司是一家10年专业大功率电感生产加工厂商,主要以大功率,大电流、扁平线圈电感、平面变压器设计、生产、销售工厂。设计、绕线、组装、检测、包装、出货等全制程的工艺流程!拥有完整、科学的质量管理体系。专业技术团队10人,我们的诚信、实力和产品质量获得业界的认可。欢迎各界朋友莅临参观、指导和业务洽谈。 ...

使用Keil C进行51单片机延时程序编写的几点心得

时间:2017-02-19 10:53:00 点击:

  应用单片机的时候,经常会遇到需要短时间延时的情况。需要的延时时间很短,一般都是几十到几百微妙(us)。有时候还需要很高的精度,比如用单片机驱动 DS18B20的时候,误差容许的范围在十几us以内,不然很容易出错。这种情况下,用计时器往往有点小题大做。而在极端的情况下,计时器甚至已经全部派上了别的用途。这时就需要我们另想别的办法了。

  以前用汇编语言写单片机程序的时候,这个问题还是相对容易解决的。比如用的是12MHz晶振的51,打算延时20us,只要用下面的代码,就可以满足一般的需要:

  mov   r0, #09h

  loop:  djnz  r0, loop

  51 单片机的指令周期是晶振频率的1/12,也就是1us一个周期。mov r0, #09h需要2个极其周期,djnz也需要2个极其周期。那么存在r0里的数就是(20-2)/2。用这种方法,可以非常方便的实现256us以下时间的延时。如果需要更长时间,可以使用两层嵌套。而且精度可以达到2us,一般来说,这已经足够了。

  现在,应用更广泛的毫无疑问是Keil的C编译器。相对汇编来说,C固然有很多优点,比如程序易维护,便于理解,适合大的项目。但缺点(我觉得这是C的唯一一个缺点了)就是实时性没有保证,无法预测代码执行的指令周期。因而在实时性要求高的场合,还需要汇编和C的联合应用。但是是不是这样一个延时程序,也需要用汇编来实现呢?为了找到这个答案,我做了一个实验。

  用C语言实现延时程序,首先想到的就是C常用的循环语句。下面这段代码是我经常在网上看到的:

  void delay2(unsigned char i)

  {

  for(; i != 0; i--);

  }

  到底这段代码能达到多高的精度呢?为了直接衡量这段代码的效果,我把 Keil C 根据这段代码产生的汇编代码找了出来: 大功率电感厂家 |大电流电感工厂

  • RCC电源剖析及改造
    前段时间受了一点刺激,一直做正激式电源,突然上次有人出面试题考我反激式电源,自己没有怎么深入的研究过,打击不小。这几天出差回来,正好放假,准备玩玩反激式电源里面最古老的
  • [DCDC]150MALED灯条恒流芯片NU510
    介绍下NU510芯片在LED模组软硬灯条中的应用(作者:诚信联古/S132-4982-7170) 1:引言 LED模组以高亮度、高光效、低成本、安装简便等特点广泛用于吸塑字、发 光字等广告光源。
  • 基于SPI方式DSP外部E2PROM接口设计
    0 引 言 近年来,随着DSP技术的普及、高性能DSP芯片的出现,DSP已越来越多地被广大的工程师所接受,并越来越广泛地被应用于各个领域,例如:语音处理、图像处理、模式识别及工业控制等,并且已日益显示
  • 大功率电感