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。 (麻烦附上详细计算过程以及详细说明,等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)