您当前的位置:五五电子网电子知识单片机-工控设备51单片机通过单片机软件实现精确延时 正文
通过单片机软件实现精确延时

通过单片机软件实现精确延时

点击数:7182 次   录入时间:03-04 11:56:25   整理:http://www.55dianzi.com   51单片机

  在很多情况下,定时器/计数器经常被用作其他用途或者无法实现时,只能用软件方法延时,比如,延时超过定时器定时范围的最大值。下面我们来分析一下通过软件实现的延时。
  
  1.较短时间的精确延时
  
  在汇编语言里,我们可以用NOP(空操作指令)来实现,一条NOP指令占用一个机器周期,比如我们用12MHz晶振,执行一条NOP指令,它就可以延时lμs,精确度可以达到1μ。使用也比较方便,我们可以在需要延时的程序中直接加上NOP指令即可实现延时。
  
  同样,我们可以在C51中通过使用带一NOP-()语句的函数实现,_NOP-()就相当于汇编中的NOP指令,我们可以定义一系列不同的延时函数,比如Delayl0μs

  DelaylOμs()函数中共用了6个一NOP-()语句,每个语句执行时间为lμs。主函数调用DelaylOμs()时,先执行一个LCALL指令(2μs),然后执行6个一NOP-()语句(6μs),最后执行了一个RET指令(2μS),所以执行上述函数时可以实现延时lOμs。
  
  2.较长时间的精确延时
  
  我们用汇编语言写单片机延时lOms的程序(12MHz晶振),可以编写下面的程序来实现:

  这个延时程序共有七条指令,现在就每一条指令执行的次数和所耗时间进行分析:
  
  第一条,MOVR5,#5在整个程序中只执行一次,且为单周期指令,所以耗时lμs;第二条,MOVR6,#4从⑥的指令可知,只要R5-1不为0,就会返回执行这条指令,共执行了R5次,共耗时5μs;第三条,MOVR7,#248同第二条类似,只要R6-1不为0,就会返回执行这条指令,同时受到外部循环R5的控制,共耗时R5×R6×1=20μs;第四条,DJNZR7,$只要R7-1不为0,就执行这条指令,同时受到外部循环的控制,由于该指令是双周期指令,共耗时为R7xR6×R5×2=9920μ8;第五条,DJNZR6,D2只要R6—1不为0,就反复执行此条指令(内循环R6次),又受外循环R7的控制,共耗时R6×R5×2=40μs;第六条,DJNZR5,Dl只要R5-1不为O,就反复执行此条指令,耗时为R5×2=10μs;第七条,RET此指令为双周期指令,耗时为2μs,我们也要考虑在调用子程序时用到LCALL指令,耗时2μs,最后可以得到总的延时为:
  
  1+5+20+9920+40+10+2+2=10000μs=lOms我们可以总结延时总时间的公式:
  
  延时总时间=[(2×一层循环次数+3)×二层循环次数+3]×三层循环次数+5(注意,此公式只适用于三层以内的循环)。
  
  用C51编写上面的延时程序,通常要用到循环,下面分别介绍用for,while,do--while语句实现的延时,程序代码如下:
  
  (1)用for语句实现的延时

  在keilμvision3中查看dISAssembly窗口汇编程序代码,我们会发现和上面是一样的,因此,我们可以用同样的方法得出,延时总时间是lOms。

  通过keilμvision3的disassembly窗口查看汇编程序代码,我们会发现和前边的两个是一样的,可知延时总时间是lOms。
  
  通过上面的例子我们可以得出这样的结论,运用C51实现延时可以运用循环嵌套的方法,方法虽然可以不同,但是效果是一样的。在具体的开发过程中,我们可以根据自己的需要,灵活运用C51中的三种循环结构来实现精确延时。
  
  此外,在实际的单片机开发过程中,我们很多时候是用硬件和软件相结合的方法实现精确延时的,这就需要我们在具体的情况下灵活运用各种方法,来满足开发的需要。




本文关键字:单片机  软件  51单片机单片机-工控设备 - 51单片机