89S51 用汇编编写的TIME0出不去?

来源:百度知道 编辑:UC知道 时间:2024/07/04 14:05:07
AT89S51
12M晶振
程序如下:
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME0
ORG 0030H
START:
MOV SP,#50H
TIME0:
MOV TL0,#0CH
MOV TH0,#0F0H
SETB TR0
LOOP: JBC TF0,PTF0
AJMP LOOP
PTF0: MOV TL0,#0CH
MOV TH0,#0F0H
CPL P0.1
AJMP LOOP
RETI

;----------------------------------------------------
MAINLOOP:

CLR P1.0
ACALL DELAY2S
SETB P1.0
ACALL DELAY2S
AJMP MAINLOOP
RET
DELAY2S: ;2S延时子程序
MOV R3,#8
LOOP1: MOV R4,#255
LOOP2: MOV R5,#255
LOOP3: DJNZ R5,LOOP3
DJNZ R4,LOOP2
DJNZ R3,LOOP1 ;2uS*8*255*255*2=2080800uS
RET
END

程序跑不到MAINLOOP处;请教高手!!
我想用定时/计数一方式使P0.1口输出方波,但

楼主,这程序是你写的吗?太糟糕了

首先程序上半部分是用定时器T0延时,使P0.1口产生方波,其实你根本就没有用到T0中断,你是用软件查询方式对TF0溢出时清零,况且你的上半部分是个死循环,程序是跑不到MAINLOOP以下的,另外上半部分和下半部分都是能产生方波,只是采用的延时方法不同和选用的IO口不同而已。

再次对程序中的软件延时,也就是以下程序段
DELAY2S: MOV R3,#8
LOOP1: MOV R4,#255
LOOP2: MOV R5,#255
LOOP3: DJNZ R5,LOOP3
DJNZ R4,LOOP2
DJNZ R3,LOOP1
RET
这里延时时间并不是2S,而是
[(255*2+3)*255+3]*8+1+2=1046547uS
楼主不信可以把这段程序输入到Keil中调试模拟运行,把断点设置到RET处,结果可以看到运行时间为1046545
那么楼主自己去验证吧!