找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5396|回复: 8
收起左侧

汇编延时程序如何编写

[复制链接]
ID:223571 发表于 2017-8-16 11:35 | 显示全部楼层 |阅读模式
设计一个延时100毫秒的延时程序?汇编怎么写呀
回复

使用道具 举报

ID:111634 发表于 2017-8-16 20:26 | 显示全部楼层
本帖最后由 zl2168 于 2017-8-17 21:10 编辑

【例3-24】 延时程序是单片机应用系统常用的模块程序。试按下列要求编写延时子程序:
⑴ 延时1ms,fOSC=6MHz;
⑵ 延时10ms,fOSC=12MHz;
⑶ 延时0.5s,fOSC=12MHz。


解:⑴ 延时1msfOSC =6MHz,一个机器周期为2msDJNZ指令为2个机器周期。


DY1ms:     MOV      R7,#250          ;置循环次数(指令为1个机器周期)


LOP:       DJNZ      R7,LOP           ;250×2机周=500机周


RET       ;子程序返回(单独Keil调试时,需用END替代RET


上述子程序实际延时(500 +1)机周×2ms/机周=1002ms


延时10msfOSC =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.5sfOSC=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和汇编)语句条条有注解,便于阅读理解,便于自学。

回复

使用道具 举报

ID:123289 发表于 2017-8-16 20:50 | 显示全部楼层
看手册中,查指令执行所占用的时钟同期数,你就一目了然了。
回复

使用道具 举报

ID:227393 发表于 2017-8-16 21:02 | 显示全部楼层
DL1MS:  MOV            27H,#10                                 ;2MS(10*200)us
DL2:        MOV            28H,#200
        DJNZ           28H,$
                DJNZ           27H,DL2
                RET
你可以再改一下就可以了
回复

使用道具 举报

ID:7485 发表于 2017-8-16 21:52 | 显示全部楼层
DLY_L:
       MOV   R6,#200
D10:
       MOV   R7,#247
       DJNZ  R7,$
           nop
           nop
           nop
       DJNZ  R6,D10
       RET建议你100ms的延时,最好用定时器。循环延时,将会使mcu停在这里100ms,按键、显示都会受影响。
回复

使用道具 举报

ID:7485 发表于 2017-8-16 21:53 | 显示全部楼层
本帖最后由 ahshmj 于 2017-8-17 08:05 编辑

基于12m晶振。现在的误差约0.02ms,如果要求的精度高,可以用“NOP”指令配合小循环调整到理论上的零误差。如下:
DLY_L:
       MOV   R6,#200
D10:
       MOV   R7,#247
       DJNZ  R7,$
;      nop
       nop
       nop
       DJNZ  R6,D10
       mov  r6, #99
       djnz r6,$
       RET

回复

使用道具 举报

ID:7485 发表于 2017-8-16 21:54 | 显示全部楼层
“回复需要审核,请等待通过”真的挺麻烦的,没法编辑。
回复

使用道具 举报

ID:1 发表于 2017-8-16 22:31 | 显示全部楼层
ahshmj 发表于 2017-8-16 21:54
“回复需要审核,请等待通过”真的挺麻烦的,没法编辑。

这个问题,正在解决中,估计快了。主要是有非常多的机器人发广告.
回复

使用道具 举报

ID:770227 发表于 2020-7-15 11:44 来自手机 | 显示全部楼层
24MHZ频率,1ms延时怎么算,需要可以自定义时间的那种
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表