单片机编写一个能延时1秒的子程序
单片机为AT89S52晶振12M,在以下程序上修改ORG0000HMOVSP,#60HMOVA,#00HLoop:MOVP1,AACALLDELAY100msCPLASJ...
单片机为AT89S52 晶振12M,在以下程序上修改
ORG 0000H
MOV SP, #60H
MOV A,#00H
Loop: MOV P1, A
ACALL DELAY100ms
CPL A
SJMP Loop
DELAY100ms: MOV R6, #199 ; 1×1=1us
Dly1: MOV R7, #250 ; 1×1×199=199us
DJNZ R7, $ ; 2×1×250×199=99.5ms
DJNZ R6, Dly1 ; 2×1×199=398us
RET ; 2×1=2us
END 展开
ORG 0000H
MOV SP, #60H
MOV A,#00H
Loop: MOV P1, A
ACALL DELAY100ms
CPL A
SJMP Loop
DELAY100ms: MOV R6, #199 ; 1×1=1us
Dly1: MOV R7, #250 ; 1×1×199=199us
DJNZ R7, $ ; 2×1×250×199=99.5ms
DJNZ R6, Dly1 ; 2×1×199=398us
RET ; 2×1=2us
END 展开
3个回答
展开全部
通用办法,可以类推:
DELAY1s:
MOV R5,#08H ; ∵ 1s=1000000us
MOV R6,#0A2H ; ∴ 1000000/2=500000
MOV R7,#20H ; 500000用16进制表示为: 07A120
; 所以 R5=07H+1=08H
; R6=0A1H+1=0A2H
; R7=20H
loop: DJNZ R7,$ ; 延时时间≈2×[(R5-1)×256+R6-1]×256+R7
DJNZ R6,loop ; 当R5、R6等于0,相当于256参与运算
DJNZ R5,loop ; 当R5、R6等于0,相当于256参与运算
RET
展开全部
一些写代码的唯美主义者看不起以下答案,其实现实主义者大都这么干。很实用,最重要的是可靠性好,开发速度快。
ORG 0000H
MOV SP, #60H
MOV A,#00H
Loop: MOV P1, A
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
CPL A
SJMP Loop
DELAY100ms: MOV R6, #199 ; 1×1=1us
Dly1: MOV R7, #250 ; 1×1×199=199us
DJNZ R7, $ ; 2×1×250×199=99.5ms
DJNZ R6, Dly1 ; 2×1×199=398us
RET ; 2×1=2us
END
ORG 0000H
MOV SP, #60H
MOV A,#00H
Loop: MOV P1, A
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
ACALL DELAY100ms
CPL A
SJMP Loop
DELAY100ms: MOV R6, #199 ; 1×1=1us
Dly1: MOV R7, #250 ; 1×1×199=199us
DJNZ R7, $ ; 2×1×250×199=99.5ms
DJNZ R6, Dly1 ; 2×1×199=398us
RET ; 2×1=2us
END
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
DELAY1MS: ;
MOV R7,#01H
DL1:
MOV R6,#8EH
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
MOV R7,#01H
DL1:
MOV R6,#8EH
DL0:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL0
DJNZ R7,DL1
RET
void delay1ms(void)
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询