—— —— —— 技术资料下载中心

>> PIC单片机原理 \

PIC单片机16F84的内部硬件资源（五）
7 延时和定时 在设计单片机应用系统时，经常会遇到需要使某一过程（如加温、加压等）持续一段时间的情况，如连续加压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则可用于各种场合中。

成都　卫东

知识竞赛试题：
22以本版上文电路为准，在A1口上接一LED，要使该LED闪亮的延时间隔约为04秒，请写出其源程序清单。

[ 返回 ]