一条条指令的时间数出来的,看循环一次的指令要多久,乘以循环次数,这种原地延时的程序,延时时间也都是个大概,循环执行中间,来中断的话,延时程序的时间就会加长,一般用在时间要求不用太准的地方。
汇编语言中,延迟有几种方式: 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、求问这段汇编语言的延时程序怎么计算延时时间等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)