汇编语言-单片机延时

这个程序哪里出问题了?为什么灯一直亮着不灭?
ORG 02H
START: CLR P1.0
CALL DELAY
SETB P1.0
CALL DELAY
JMP START
DELAY: MOV R7, #200
DV1: MOV R6, #250
DV2: DJNZ R6, DV2
DV3: DJNZ R7, DV1
DJNZ R7, DV3
RET
END

补充:老师给的是亮灭各0.1S的程序,我只是把第10和11行做了点改动,想把延时再拉长点,下面是老师给的程序:

ORG 02H
START: CLR P1.0
CALL DELAY
SETB P1.0
CALL DELAY
JMP START
DELAY: MOV R7, #200
DV1: MOV R6, #250
DV2: DJNZ R6, DV2
DJNZ R7, DV1
RET
END

DJNZ R7, DV1
DJNZ R7, DV3 构成了一个死循环,delay函数无法退出,当然会出现这种情况追问

谢谢,请问如何把老师给的0.1S延时变为1S的延时?

追答

那就在原来的基础上增加一层循环就可以了,delay:
MOV R5,#10
DV1:
MOV R7, #200
DV2:
MOV R6, #250
DJNZ R6, $
DJNZ R7, DV2
DJNZ R5,DV1
RET

温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-21
ORG 02H
START: CLR P1.0
CALL DELAY
SETB P1.0
CALL DELAY
JMP START
DELAY: MOV R7, #200
DV1: MOV R6, #250
DV2: DJNZ R6, DV2
DJNZ R7, DV1
RET
EN追问

你这个是0.1秒的延时程序,和老师给的一样,我要的是延时1s的,

追答

ORG 02H
START: CLR P1.0
CALL DELAY
SETB P1.0
CALL DELAY
JMP START
DELAY: MOV R5,#10
DV1:MOV R7, #200
DV2: MOV R6, #250
DV3: DJNZ R6, DV3
DJNZ R7, DV2
DJNZ R5,DV1
RET
EN

本回答被网友采纳
第2个回答  2012-10-21
ORG 02H
START:CPL P1.0
MOV R5,#10
S0: CALL DELAY
DJNZ R5,S0
JMP START
DELAY: MOV R7, #200
DV1: MOV R6, #250
DV2: DJNZ R6, DV2
DJNZ R7, DV1
RET
END

单片机汇编语言怎么计算延时程序的?
延时的计算和实现如下:1. 将R2的值设为10,这是外层循环的次数。2. 将R3的值设为200,这是次层循环的次数。每次外层循环执行时,次层循环将会被执行200次。3. 将R4的值设为250,这是内层循环的次数。每次次层循环执行时,内层循环将会被执行250次。4. 每次内层循环执行完毕后,使用DJNZ指令检...

单片机 汇编语言有关延时函数时间的计算
1、DJNZ R7,$ :单句执行时间2us,100次就是2*100us,这个循环完成的时长是:200us 2、DJNZ R6,DELAY2 :此层每循环1次,实际时长为200us+2us,所以这一层执行完成的时间是100*(2 + 200)us = 20200us;这个循环判断的执行时长2*100us,与最内层是加的关系,不是乘!3、DJNZ R...

单片机的程序怎么延时1s?
单片机常用的编程语言有汇编语言、C语言等。以下是使用汇编语言实现延时1s的程序:以上程序中,使用了一个8位计数器来实现延时功能。由于单片机晶振频率为12MHz,每个指令需要执行12\/4=3个机器周期(其中4代表指令周期),因此可以通过调整计数器初值来实现不同的延时时间。具体计算过程如下:每个指令需要执行...

单片机。用汇编语言编程。 设计一软件延时1s的子程序。设晶振频率为12M...
delay1000ms:(HT46R65的单片机)(注意不要开启计时中断允许位)mov a,10000111b (设置频率和记数方式)(上升记数还是下降记数)mov tmr0c,a (tmr0c 计数器的控制寄存器)mov a,low(65536-31250) (设置的频率就是1S上升31250)因此是DELAY1S mov TMR0L,a (计数器的赋予初始值的低...

单片机中,怎么用汇编语言编写程序实现延迟40ms
1.循环延时的方法 DELAY: ;误差 0us MOV R7,#25H DL1:MOV R6,#9AH DL0:MOV R5,#02H DJNZ R5,DJNZ R6,DL0 DJNZ R7,DL1 RET 不过这不实用。40MS时间单片机都 在这里循环,不作能它事。1.可以用定时中断的方法:ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP...

51单片机使用汇编语言循环延迟时间怎么算?
时间精确的延时程序要用汇编语言来编写。计算延迟时间要查询每一条程序的执行周期数,然后加起来就是了。在12m晶振的系统中,每个机器周期是1微秒借用一下:举例来说明吧:delay: mov r0,#10 ;1(周期)delay1: mov r1,#100 ;1 djnz r1,$ ;2 djnz r0,delay1 ;2 ret ;2周期数=1+((1+(2*100)+2)*10...

汇编语言-单片机延时
DJNZ R7, DV1 DJNZ R7, DV3 构成了一个死循环,delay函数无法退出,当然会出现这种情况

你好,请用汇编语言告诉我一下单片机延时31分钟怎么设置,C语言的不会
有两种方法:1.使用rtc,一直读取rtc直到过去31分钟。这种方法比较精确 2.简单循环,需要知道单片机工作频率和指令执行时间

汇编语言编写一段延时1000个指令周期的子程序
要求编写延时子程序,就不要使用定时器;也不要用C语言,因为C语言的执行时间,并不确定。用汇编语言,是最简单、准确的。51单片机的程序如下:DL1000:MOV R7,#248 DJNZ R7,MOV R7,#250 DJNZ R7,RET 正好1000个机器周期。R7,是8位寄存器,其最大数值是255,不能直接存入500。

单片机汇编语言中有没有将上一步所有状态保持一段时间的延时程序,而...
可以用定时器来实现延时比如:DELAY:MOV TL0,#LOW(65536-50000)MOV TH0,#HIGH(65536-50000) ;50毫米定时 SETB TR0 SETB ET0 CLR T0BIT JNB T0BIT,$ ;等待定时到 RET T0_ISR:CLR TR0 SETB T0BIT RETI

相似回答