位置:51电子网 » 技术资料 » 单 片 机

PIC单片机16F84的内部硬件资源(五)

发布时间:2008/5/27 0:00:00 访问次数:707

http://www.hificat.com

 延时和定时

  在设计单片机应用系统时,经常会遇到需要使某一过程(如加温、加压等)持续一段时间的情况,如连续加压1分钟,通电2分钟等。单片机如何正确确定这段时间呢?这里可通过两种方式,即延时和定时来实现。试看下例。
  在应用系统中要求pic16f84单片机的rao端控制一个发光二极管按一定频率闪亮,可通过右图的电路来实现。同时还必须为16f84单片机编制一个程序。由电路图可知,要使发光二极管led按一定的频率闪亮,只要使rao端输出一个变化的高→低→高……电平即可。由此设计出如下的源程序(清单1):

   list p=16f84,f=inhx8m
  ;……
     org   0
     movlw 0 ;主程序开始
     tris  5   ;置ra口为输出
     bcf   5,0   ;ra口0位清零
   loop:call  delay;闪动延时
     comf 5   ;ra口求反,亮—灭交替
     goto loop   ;循环
  ;……
   delay      ;以下为延时子程序
      movlw  d′50
      movwf   8
   loop1:movwf   9
   loop2:decfsz   9,f
      goto   loop2
      decfsz   8,f
      goto    loop1
   retlw       0

  由清单1可知,当主程序开始时,首先将工作寄存器w清零,然后将w寄存器的内容送trisa寄存器,使其清零,以设置ra口为输出。接着又将ra口的第5位清零,使led开始时处于熄灭状态。随之持续一段时间,即执行延时子程序,再将ra口取反,变为高电平输出,led发光,再延时,又使ra口取反,led熄灭……。这样,led就一暗一亮,持续交替进行。

  在这里,使led亮、暗持续一段时间是通过单片机执行延时子程序delay来实现的。此延时程序的核心就是让单片机的cpu反复执行使寄存器内容减1的指令decfsz。即将十进制数50分别装入通用寄存器f8、f9,以进行50×50=2500次的减1操作。如果执行一次decfsz指令需1个指令周期(跳转时需2个周期),若设振荡频率为100khz,即指令周期为40μs,则延时时间为2500×40=100000μs=100ms,即01秒。实际上还略为大些。此延时时间已超过人眼的视觉保留时间。因而能看清led的明、暗交替变化。

  如果我们需要更长的延时时间,可仿照上例,装入更大的数或引入多重循环。因此,在原则上,延时时间可根据需要任意延长。

  不过,采用延时程序来持续某一过程的方式有缺陷。延时就是使cpu在某几条指令上“转圈”,延时越长,“转圈”数越多,这时,cpu不能再去执行其它操作,如监视温度、湿度等。这在某些实时控制系统中,不允许这样做。为此,在单片机16f84单片机中,专门设置了一个“闹钟”——定时器tmr0。需要某过程延续多长时间,可将其“拨入”tmr0,到时它会发生“中断”,告诉cpu定时时间到。要cpu暂停其它工作,转过来执行“中断子程序”,完成输出开、关信号之类的任务后,再回去执行其中断的工作。这样,就使cpu的工作效率提高。因而,延时的使用有局限性,采用定时器tmr0则可用于各种场合中。



http://www.hificat.com

 延时和定时

  在设计单片机应用系统时,经常会遇到需要使某一过程(如加温、加压等)持续一段时间的情况,如连续加压1分钟,通电2分钟等。单片机如何正确确定这段时间呢?这里可通过两种方式,即延时和定时来实现。试看下例。
  在应用系统中要求pic16f84单片机的rao端控制一个发光二极管按一定频率闪亮,可通过右图的电路来实现。同时还必须为16f84单片机编制一个程序。由电路图可知,要使发光二极管led按一定的频率闪亮,只要使rao端输出一个变化的高→低→高……电平即可。由此设计出如下的源程序(清单1):

   list p=16f84,f=inhx8m
  ;……
     org   0
     movlw 0 ;主程序开始
     tris  5   ;置ra口为输出
     bcf   5,0   ;ra口0位清零
   loop:call  delay;闪动延时
     comf 5   ;ra口求反,亮—灭交替
     goto loop   ;循环
  ;……
   delay      ;以下为延时子程序
      movlw  d′50
      movwf   8
   loop1:movwf   9
   loop2:decfsz   9,f
      goto   loop2
      decfsz   8,f
      goto    loop1
   retlw       0

  由清单1可知,当主程序开始时,首先将工作寄存器w清零,然后将w寄存器的内容送trisa寄存器,使其清零,以设置ra口为输出。接着又将ra口的第5位清零,使led开始时处于熄灭状态。随之持续一段时间,即执行延时子程序,再将ra口取反,变为高电平输出,led发光,再延时,又使ra口取反,led熄灭……。这样,led就一暗一亮,持续交替进行。

  在这里,使led亮、暗持续一段时间是通过单片机执行延时子程序delay来实现的。此延时程序的核心就是让单片机的cpu反复执行使寄存器内容减1的指令decfsz。即将十进制数50分别装入通用寄存器f8、f9,以进行50×50=2500次的减1操作。如果执行一次decfsz指令需1个指令周期(跳转时需2个周期),若设振荡频率为100khz,即指令周期为40μs,则延时时间为2500×40=100000μs=100ms,即01秒。实际上还略为大些。此延时时间已超过人眼的视觉保留时间。因而能看清led的明、暗交替变化。

  如果我们需要更长的延时时间,可仿照上例,装入更大的数或引入多重循环。因此,在原则上,延时时间可根据需要任意延长。

  不过,采用延时程序来持续某一过程的方式有缺陷。延时就是使cpu在某几条指令上“转圈”,延时越长,“转圈”数越多,这时,cpu不能再去执行其它操作,如监视温度、湿度等。这在某些实时控制系统中,不允许这样做。为此,在单片机16f84单片机中,专门设置了一个“闹钟”——定时器tmr0。需要某过程延续多长时间,可将其“拨入”tmr0,到时它会发生“中断”,告诉cpu定时时间到。要cpu暂停其它工作,转过来执行“中断子程序”,完成输出开、关信号之类的任务后,再回去执行其中断的工作。这样,就使cpu的工作效率提高。因而,延时的使用有局限性,采用定时器tmr0则可用于各种场合中。



相关IC型号

热门点击

 

推荐技术资料

硬盘式MP3播放器终级改
    一次偶然的机会我结识了NE0 2511,那是一个远方的... [详细]
版权所有:51dzw.COM
深圳服务热线:13692101218  13751165337
粤ICP备09112631号-6(miitbeian.gov.cn)
公网安备44030402000607
深圳市碧威特网络技术有限公司
付款方式


 复制成功!