本帖最后由 zl2168 于 2017-8-17 21:10 编辑
【例3-24】 延时程序是单片机应用系统常用的模块程序。试按下列要求编写延时子程序:
⑴ 延时1ms,fOSC=6MHz;
⑵ 延时10ms,fOSC=12MHz;
⑶ 延时0.5s,fOSC=12MHz。
解:⑴ 延时1ms。fOSC =6MHz,一个机器周期为2ms,DJNZ指令为2个机器周期。
DY1ms: MOV R7,#250 ;置循环次数(指令为1个机器周期)
LOP: DJNZ R7,LOP ;250×2机周=500机周
RET ;子程序返回(单独Keil调试时,需用END替代RET)
上述子程序实际延时(500 +1)机周×2ms/机周=1002ms。
⑵ 延时10ms。fOSC =12MHz,一个机器周期为1ms。
DY10ms: MOV R6,#20 ;置外循环次数
DY1: MOV R7,#250 ;置内循环次数
DY2: DJNZ R7,DY2 ;250×2机周=500机周
DJNZ R6,DY1 ;500机周×20=10000机周
RET ;子程序返回(单独Keil调试时,需用END替代RET)
实际延时[(500+2+1)×20+1]机周×1ms /机周=10061ms。
⑶ 延时0.5s。fOSC=12MHz,一个机器周期为1ms。
DY05s: MOV R5,#5 ;置外循环次数
DY0: MOV R6,#200 ;置中循环次数
DY1: MOV R7,#250 ;置内循环次数
DY2: DJNZ R7,DY2 ;250×2机周=500机周
DJNZ R6,DY1 ;500机周×200 =100000机周
DJNZ R5,DY0 ;100000机周×5=500000机周
RET ;子程序返回(单独Keil调试时,需用END替代RET)
实际延时{[(2×250+2+1)×200+2+1]×5+1}机周×1ms/机周=503016ms。
说明: RET(返回)指令需与子程序调用指令成对出现,单独执行时会出错。因此,Keil调试时,需去除RET指令,用END替代RET,才能得到正确的延时时间。但实际调用时,仍需加上RET指令,延时时间增加2机周。 以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。
|