单片机汇编 只有1s延时子程序 怎么延时2s..不能改变子程序。

单片机汇编 只有1s延时子程序 怎么延时2s..不能改变子程序。,第1张

DELAY1S: MOV R0,#10H

LOOP0:LCALL DELAY

DJNZ R0,LOOP0

RET

DELAY:MOV R6,#0C8H; 外循环 200 次

LOOP1:MOV R7,#0F8H; 内循环 248 次

NOP

LOOP2:DJNZ R7,LOOP2; 延时2 μs×248=496 μs

DJNZ R6,LOOP1; 延时 500 μs×200=100 ms

RET

将上面函数调用两次就可以啦

极为普通的软件延时子程序

250是循环次数,可在0~255中选择。

DELAY: MOV R7,#250

X1: MOV R6,#250 ;R6 = 250

X2: DJNZ R6,X2 ;R6-1=249, 非0则转移到X2,就是本指令的地址;

;那么这条指令要反复执行250遍。

;直到R6=0。

;这条指令在这就是用来浪费时间的。

DJNZ R7,X1 ;同上条,目的是浪费时间。

RET

子程序结束时,共循环了625000遍。

所消耗的时间,就是给人观察LED的时间。

如果单纯延时,可以用实验的办法,在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);

}

}

以上就是关于单片机汇编 只有1s延时子程序 怎么延时2s..不能改变子程序。全部的内容,包括:单片机汇编 只有1s延时子程序 怎么延时2s..不能改变子程序。、单片机汇编程序延时问题 非常急、51单片机用汇编语言设计1S延时子程序,晶振为12MHz。 (麻烦附上详细计算过程以及详细说明,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存