急,在线等!关于80868088汇编语言的延迟子程序

急,在线等!关于80868088汇编语言的延迟子程序,第1张

延时时间和你设的频率有关,这里把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延时等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存