汇编语言的延时程序是如何计算延时时间

汇编语言的延时程序是如何计算延时时间,第1张

一条条指令的时间数出来的,看循环一次的指令要多久,乘以循环次数,这种原地延时的程序,延时时间也都是个大概,循环执行中间,来中断的话,延时程序的时间就会加长,一般用在时间要求不用太准的地方。

汇编语言中,延迟有几种方式: 1、通过一些专门的语句,比如 NOP ;执行一个空 *** 作 2、通过空循环,比如: setb p10 ;IO口置1 mov r2,#200 ;R2赋值200 djnz r2,$ ;循环200次,延时约400微妙 clr p10 ;IO口清0 3、通过调用延时程序

采纳答案,数字,算错了吧?

应该是 500 多毫秒。

51 单片机的指令,执行时间,是一个机器周期或二个机器周期。

只有乘除指令,是四个机器周期。

机器周期,称为T。

正确计算如下:

MOV R2, #10 ;1T

L1: MOV R3, #100 ;1T

L2: MOV R4, #250 ;1T

L3: DJNZ R4, L3 ;2T 2 250 = 500T

DJNZ R3, L2 ;2T (1+500+2) 100 = 50300T

DJNZ R2, L1 ;2T (1+50300+2) 10 = 503030T

RET ;2T (1+503030+2) = 503033T

总共执行时间是:503033T。

当晶振是 12MHz,T 就是 1us。

那么,延时时间就是 503033us,约等于 500 毫秒。

延时1s计算方法是将所有指令执行时间相加得出的。比如:

dly1s:

mov

r2,#10

;1

dly1:

mov

r3,#200

;110

dly2:

mov

r4,#248

;120010

djnz

r4,$

;224820010

djnz

r3,dly2

;220010

djnz

r2,dly1

;210

ret

;2

total=1+10+2000+992000+4000+20+2=998033

如果使用12m晶振,那么延时时间为0998秒。

DELAY:MOV R7,#200 ;1us

DELAY1:DJNC R7,DELAY1 ;2us

RET ;2us

T=1+2002+2=4003us,如果200改为199会更接近些,调整循环次数就能调整延时精度。

DEL:MOV R7,#10;1us

DEL1:MOV R6,#104 ;1us

DEL2:DJNC R6,DEL2 ;2us

DJNC R7,DEL1 ;2us

RET ;2us

T=1+101+101042+102+2=2113us,如果104改为99会更接近些。

(1)你的两个延时程序都对。

(2)延时不超过513us的延时程序这应该是最简单的方法了。

(3)其中#200,#10,#104不是随便设的,不能大过255,同时也要尽可能满足精度要求。

你的时间算法是对的。

还想请问一下2113和2200是否允许要看你的系统精度来定,一般不说,你这里将近10%的误差是比较大的。

(1)、C51语言中调用汇编语言程序;

C51语言调用汇编语言程序要注意以下几点:

1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。

2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51SLIB)加入工程中。

3:在C51语言中必须声明需要调用的函数为外部函数。extern void DELAY(void);

4:在汇编语言程序中必须声明被调用子程序为公共子程序,在被调用的文件中还需要声明此文件是可从新定位的。

PUBLIC DELAY,DEL

DELAYY SEGMENT CODE

RSEG DELAYY

实例如下:

C51语言文件:

#include "reg51h"

extern void DELAY(void);

extern void DEL(void);

void main(void)

{

P1=0x00;

DELAY();

DEL();

P1=0xff;

}

汇编语言文件:

PUBLIC DELAY,DEL

DELAYY SEGMENT CODE

RSEG DELAYY

DELAY: MOV R2,#3H

DJNZ R2,$

RET

DEL: MOV R3,#03H

DJNZ R3,$

RET

END

(2)、C51语言中嵌入汇编程序;

在C51语言中嵌套使用汇编语言编写程序要注意以下的几个问题:

1:在文件栏选中File Group和C51程序原文件,在配置文件选项中激活“产生汇编(SRC)文件,“编译(SRC)文件”和“创建工程(目标)时包含”三个选项。

2:根据选择的编译模式,把相应的库文件(如SMALL模式,库文件为KEIL\C51\LIB\C51SLIB)加入工程中。

3:用#pragma asm,和#pragma endasm语句包含嵌入的汇编语言程序。

实例如下:

#include "reg51h"

void delay(void);

void main(void)

{

void delay(void);

P1=0x00;

#pragma asm

MOV R3,#08H

DJNZ R3,$

#pragma endasm

P1=0xff;

}

void delay(void)

{

#pragma asm

MOV R4,#08H

DJNZ R4,$

#pragma endasm

}

单片机编程时延时程序其实就是一些循环指令组成的集合。比如:

DELAY:

    MOV R2,#248    ;本条指令1T执行1次

    DJNZ R2,$      ;本条指令2T执行248次

    NOP            ;本条指令1T执行1次

    RET            ;本条指令2T执行1次

    

所以延时时间为:1+2482+1+2=500T,如果晶振是12M的话,延时500us

以上就是关于汇编语言的延时程序是如何计算延时时间全部的内容,包括:汇编语言的延时程序是如何计算延时时间、汇编语言延时程序0.4s、求问这段汇编语言的延时程序怎么计算延时时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9390551.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存