电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

51单片机准确延时结束办法

2017-04-17 20:27分类:PLC基础知识 阅读:

 

51单片机的几种准确延时结束延时通常有两种办法:一种是硬件延时,要用到守时器/计数器,这种办法可早年进CPU的工作功率,也能做到准确延时;另一种是软件延时,这种办法首要选用循环体进行。

  1 运用守时器/计数器结束准确延时

  单片机系一同般常选用11.059 2 MHz、12 MHz或6 MHz晶振。第一种更简略发作各种标准的波特率,后两种的一个机器周期别离为1 μs和2 μs,便于准确延时。本程序中假定运用频率为12 MHz的晶振。最长的延不时刻可达216=65 536 μs。若守时器工作在办法2,则可结束极短时刻的准确延时;如运用别的守时办法,则要思考重装守时初值的时刻(重装守时器初值占用2个机器周期)。

  在实习运用中,守常常选用接连办法,如进行恰当的循环可结束几秒乃至更长期的延时。运用守时器/计数器延时从程序的施行功率和安稳性两方面思考都是最佳的计划。但应当留神,C51编写的接连效劳程序编译后会主动加上PUSH ACC、PUSH PSW、POP PSW和POP ACC句子,施行时占用了4个机器周期;如程序中还有计数值加1句子,则又会占用1个机器周期。这些句子所耗费的时刻在核算守时初值时要思考进入,从初值中减去以抵达最小过错的意图。

  2 软件延时与时刻核算

  在许多状况下,守时器/计数器常常被用作别的用处,这时分就只能用软件办法延时。下面介绍几种软件延时的办法。

  2.1 时刻短延时

  能够在C文件中经过运用带_NOP_( )句子的函数结束,界说一系列纷歧样的延时函数,如Delay10us( )、Delay25us( )、Delay40us( )等寄存在一个自界说的C文件中,需求时在主程序中直接调用。如延时10 μs的延时函数可编写如下:

  void Delay10us( ) {

  _NOP_( );

  _NOP_( );

  _NOP_( );

  _NOP_( );

  _NOP_( );

  _NOP_( );

  }

  Delay10us( )函数中共用了6个_NOP_( )句子,每个句子施行时刻为1 μs。主函数调用Delay10us( )时,先施行一个LCALL指令(2 μs),然后施行6个_NOP_( )句子(6 μs),究竟施行了一个RET指令(2 μs),所以施行上述函数时共需求10 μs。 能够把这一函数当作根柢延时函数,在别的函数中调用,即嵌套调用\[4\],以结束较长期的延时;但需求留神,如在Delay40us( )中直接调用4次Delay10us( )函数,得到的延不时刻将是42 μs,而不是40 μs。这是因为施行Delay40us( )时,先施行了一次LCALL指令(2 μs),然后初步施行第一个Delay10us( ),施行完究竟一个Delay10us( )时,直接回来到主程序。依此类比,假定是两层嵌套调用,如在Delay80us( )中两次调用Delay40us( ),则也要先施行一次LCALL指令(2 μs),然后施行两次Delay40us( )函数(84 μs),所以,实习延不时刻为86 μs。简言之,只需最内层的函数施行RET指令。该指令直接回来到上级函数或主函数。如在Delay80μs( )中直接调用8次Delay10us( ),此刻的延不时刻为82 μs。经过批改根柢延时函数和恰当的组合调用,上述办法能够结束纷歧同间的延时。

  2.2 在C51中嵌套汇编程序段结束延时

  在C51中经过预处理指令#pragma asm和#pragma endasm能够嵌套汇编言句子子。用户编写的汇编言语紧跟在#pragma asm往后,在#pragma endasm之前结束。

  如:#pragma asm

  …

  汇编言语程序段

  …

  #pragma endasm

  延时函数可设置进口参数,可将参数界说为unsigned char、int或long型。依据参数与回来值的传递规矩,这时参数和函数回来值坐落R7、R7R6、R7R6R5中。在运用时应留神以下几点:

  ◆ #pragma asm、#pragma endasm不容许嵌套运用;

  ◆ 在程序的初步应加上预处理指令#pragma asm,在该指令之前只能有注释或别的预处理指令;

  ◆ 当运用asm句子时,编译体系并不输出方针模块,而只输出汇编源文件;

  ◆ asm只能用小写字母,假定把asm写成大写,编译体系就把它作为通常变量;

  ◆ #pragma asm、#pragma endasm和 asm只能在函数内运用。

  将汇编言语与C51联络起来,充沛表现各自的优势,无疑是单片机开发人员的最佳挑选。

  2.3 运用示波器断定延不时刻

  运用示波器来测定延时程序施行时刻。办法如下:编写一个结束延时的函数,在该函数的初步置某个I/O口线如P1.0为高电平,在函数的究竟清P1.0为低电平。在主程序中循环调用该延时函数,经过示波器丈量P1.0引脚上的高电往常刻即可断定延时函数的施行时刻。办法如下:

  sbit T_point = P1^0;

  void Dly1ms(void) {

  unsigned int i,j;

  while (1) {

  T_point = 1;

  for(i=0;i《2;i++){

  for(j=0;j《124;j++){;}

  }

  T_point = 0;

  for(i=0;i《1;i++){

  for(j=0;j《124;j++){;}

  }

  }

  }

  void main (void) {

  Dly1ms();

  }

  把P1.0接入示波器,工作上面的程序,能够看到P1.0输出的波形为周期是3 ms的方波。其间,高电平为2 ms,低电平为1 ms,即for循环构造“for(j=0;j《124;j++) {;}”的施行时刻为1 ms。经过改动循环次数,可得到纷歧同间的延时。当然,也能够不必for循环而用别的句子结束延时。这儿谈论的仅仅断定延时的办法。

  2.4 运用反汇编东西核算延不时刻

  用Keil C51中的反汇编东西核算延不时刻,在反汇编窗口中可用源程序和汇编程序的混合代码或汇编代码闪现方针运用程序。为了阐明这种办法,还运用“for (i=0;i

  C:0x000FE4CLRA//1T

  C:0x0010FEMOVR6,A//1T

  C:0x0011EEMOVA,R6//1T

  C:0x0012C3CLRC//1T

  C:0x00139FSUBBA,DlyT //1T

  C:0x00145003JNCC:0019//2T

  C:0x00160E INCR6//1T

  C:0x001780F8SJMPC:0011//2T

  能够看出,0x000F~0x0017一共8条句子,剖析句子能够发现并不是每条句子都施行DlyT次。基地循环只需0x0011~0x0017共6条句子,一共8个机器周期,第1次循环先施行“CLR A”和“MOV R6,A”两条句子,需求2个机器周期,每循环1次需求8个机器周期,但究竟1次循环需求5个机器周期。DlyT次基地循环句子耗费(2+DlyT&TImes;8+5)个机器周期,当体系选用12 MHz时,精度为7 μs。

  中选用while (DlyT--)循环体时,DlyT的值寄存在R7中。相对应的汇编代码如下:

  C:0x000FAE07MOVR6, R7//1T

  C:0x00111F DECR7//1T

  C:0x0012EE MOVA,R6//1T

  C:0x001370FAJNZC:000F//2T

  循环句子施行的时刻为(DlyT+1)&TImes;5个机器周期,即这种循环构造的延时精度为5 μs。

  经过实验发现,如将while (DlyT--)改为while (--DlyT),经过反汇编后得到如下代码:

  C:0x0014DFFE DJNZR7,C:0014//2T

  能够看出,这时代码只需1句,共占用2个机器周期,精度抵达2 μs,循环体耗时DlyT&TImes;2个机器周期;但这时应当留神,DlyT初始值不能为0。

  留神:核算时刻时还应加上函数调用和函数回来各2个机器周期时刻。

上一篇:单片机汇编程序编码标准

下一篇:单片机键盘接口技术

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部