设单片机fosc=12MHz,利用T0方式1产生10ms定时,在P1.0引脚上输出周期为2ms的方波。

帮我看看这个能否实现上面的功能。谢谢!!
ORG 0000H
MOV TH0,#63H
MOV TL0,#18H
SETB TR0
SETB C
S0: MOV P1.0,C
ACALL DELAY1
CPL C
SJMP S0
DELAY1: MOV R1,#500
DJNZ R1,DELAY1
RET
S1: JBC TF0,S2
SJMP S1
S2: MOV TH0,#63H
MOV TL0,#18H
DJNZ R2,S1
RET
END

你的程序有点乱,没有理解透单片机定时器的作用。在这里既然用定时器又为什么要用软件延时呢,定时器方式1最大可以定时65.536ms,定10ms完全可以了,不用再用软件延时了。另外你计算的定时器定时初值不太正确,你再算一下。
可以这样写:
ORG 0000H
START:
MOV SP,#60H
MOV TMOD,#01H

MOV TH0,#0D8H
MOV TL0,#0F0H
SETB TR0

LOOP:
JNB TF0,$
CPL P1.0
CLR TF0
MOV TH0,#0D8H
MOV TL0,#0F0H
LJMP LOOP
END追问

JNB TF0,$;能说下$这符号是什么意思吗?

追答

相当于:
LOOP:JNB TF0,LOOP
就是说原地等待,直到TF0为1(定时时间到时TF0=1)

追问

那么10ms的定时呢
还有就是MOV SP,#60H 这句的SP指的是?

追答

10ms定时是由T0定时器实现的,定时时间到后CPL P1.0
MOV SP,#60H这句可以不要,SP是堆栈指针寄存器,用来实现堆栈保护用的,这里程序少,没用到子程序或者中断所以可以不用,用的话只是习惯用法。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-16
不能。
1.你没有初始化定时器。
2.R1存放的最大值为255,不可能是500.
3.既然要用定时器T0来实现,为什么还要搞那个S0延时函数?
4.。。。