打印
[经验分享]

延时汇编语言

[复制链接]
1341|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
sheflynn|  楼主 | 2024-8-26 11:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
一、延时函数
        在单片机实时控制系统中,常常会用到延时函数,因此,延时函数是编写单片机程序不可缺少的一部分。由于单片机读、写都需要消耗一定时间,因此延时程序通过执行空白指令来完成。单片机执行一条指令所需要的时间是一个指令周期,完成一个基本操作所用的时间是一个机器周期,如读操作、写等操作。当晶振频率为12MHz时,1个机器周期为1us。

        一个指令周期通常含有1~4个机器周期,其中常用的DJNZ指令周期为两个机器周期,即执行DJNZ指令需要2us; MOV指令周期为一个机器周期,即执行MOV指令需要1us。

二、延时函数计算实例
1.单重循环短暂延时
        短暂延时可以通过单重循环来实现,例如,下面为延时200μs子程序,DJNZ指令周期为两个机器周期,即执行DJNZ指令需要2us,每执行一次寄存器R7的值减一,不断重复,到R7值为0是跳转到RET指令结束,即执行DJNZ100次达到延时200μs的目的。

DELAY:       
MOV R7,#100      
DELAY1:
DJNZ R7,DELAY1   
RET
2.多重循环较长延时
如果需要较长的时间延时,则需通过多重循环来实现。例如,下面为延时1秒子程序。

DELAY:        MOV R5,#20
DELAY1: MOV R6,#100
DELAY2: MOV R7,#100
                DJNZ R7,$
                DJNZ R6,DELAY2
                DJNZ R5,DELAY1
                RET
此子程序采用了3重循环结构,先运行第5行代码操作,每次减1,减到0为止;再运行第6行代码对R6进行减操作,每次减1,减1后不为0,则转移到标号DLY2处运行,此时将R7赋值为100,并再对R7进行减法内循环。当R6减为0时,程序运行到第7行,开始外循环,R5减1不为0时转移到标号DLY1处运行。

为了计算上的简便,可以忽略赋值语句的时间,只计算“DJNZ R7,$"语句的执行时间,该指令执行一次需2μs,执行的次数为R5、R6和R7值的乘积,即:
总延时=2us×R7×R6×R5=2us×100×100×50 =1000000us=1s

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

1268

帖子

2

粉丝