延时时间和你设的频率有关,这里把PUSH AX POP AX循环100次,在乘以循环周期就是延时时间,至于用AX,BX无关紧要,只要最后恢复现场就好。
当然没问题,++——一样可以,NoP也没问题,LOOP也算时间
默认的时间中断是每秒产生182次,如果要求不精确,就用18次时钟中断来延时一秒。
地址0:46c存放的就是这个计数器,可以读取这个,然后加上18,比较就可以实现。代码如下:
mov ax,0
mov ds,ax
mov si,46ch
lodsw
add ax,18
mov cx,ax
loc_1:
mov si,46ch
lodsw
cmp ax,cx
jnb loc_2
jmp loc_1
loc_2:
如果要求非常精确,那就要直接对定时器进行编程,通过端口 *** 作来实现。
这是调用一个延时10毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了
DELAY10MS:
MOV R2,#20
DELAY10MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY10MS1
RET
这是调用一个延时20毫秒的延时子程序 当然,子程序的名字可以自己定 DELY1MS: 这个名字一定要与调用中出现的名字一样,否则的话,调用的就不是这个子程序了
DELAY20MS:
MOV R2,#40
DELAY20MS1:
MOV R3,#250
DJNZ R3,$
DJNZ R3,DELAY20MS1
RET
RETRET的作用是子程序返回。调用一个子程序,当单片机执行到RET语句的时候,单片机就会返回到调用的地方并继续向下执行。
下面给你一个例程:
闪烁灯
ORG 00H
AJMP START
ORG 30H
START:
MOV P0,#00H
LCALL DELY;调用延时子程序
MOV P0,#0FFH
LCALL DELY;调用延时子程序
AJMP START
DELY:
MOV R7,#250
DL1:MOV R6,#250
DJNZ R6,$
DJNZ R7,DL1
RET
8086汇编语言利用时钟中断精确些的延时的精度只能达到1/182秒。比这个还要高的要求只能利用指令执行的时钟周期数来设计了,这样编制的延时程序和cpu的频率紧密相关,要编制通用些的,只能在程序中先进行检测,依据检测结果自动调整延时程序中的参数。
嘿嘿 俺来帮你解答
1 参考程序:
YS500VS: MOV R7,#125
LLL1: NOP
NOP
DJNZ R7,LL1
RET
延时时间: (2+2)×125=500微秒=05毫秒
使用12MHZ 的晶振 一个机器周期=1微秒 NOP指令执行时间为1微秒
DJNZ R7,LLL1指令执行时间为2微秒 每次循环时间为4微秒
呵呵 满意就给加分哦
如果单纯延时,可以用实验的办法,在keilc51里面仿真
void Delay1S(char n)
{
char i,j;
n=n4;
for(;n;n--)
{
for(i=6;i;i++)
{
for(j=7;j;j++) // 一个循环约为1mS
;
}
}
}
看编译后的汇编:
C:0x0805 7D01 MOV R5,#0x06;j=1,1时钟
C:0x0807 0D INC R5;j++,1时钟
C:0x0808 ED MOV A,R5;A=R5,1时钟
C:0x0809 70FC JNZ C:0807;A=0,2时钟
循环共249次,一个循环共需4个时钟周期,加上第一个赋值语句1周期。
共997uS,加上外层循环,一次约1mS,
如果要精确的延时建议采用中断:
#include "reg51h"
//timer init
void initTimer(void)
{
TMOD=0x2;
TH0=0x6;
TL0=0x6;
}
int T250uS;
char T_mark;
//timer0/counter0 interrupt
void timer0(void) interrupt 1
{
//add your code here
T250uS++;
T_mark=0;
}
void Delay1S(char n)
{
for(;n;n--)
for(T250uS=0;T250uS<4000;)
{
T_mark=1;
while(T_mark);
}
}
//the main fun
void main(void)
{
initTimer();
TR0=1;
ET0=1;
EA=1;
while(1)
{
Delay1S(1);
}
}
以上就是关于急,在线等!关于8086/8088汇编语言的延迟子程序全部的内容,包括:急,在线等!关于8086/8088汇编语言的延迟子程序、跪求8086/8088系统的汇编程序延迟一秒子程序、如何利用单片机汇编指令编程实现延时10ms利用汇编指令设计多重循环编程实现20ms延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)