汇编程序提问

来源:百度知道 编辑:UC知道 时间:2024/06/24 16:04:09
ORG 0000H

AJMP START

ORG 000BH ;定时器0的中断向量地址

AJMP TIME0 ;跳转到真正的定时器程序处

ORG 30H

START:

MOV P1,#0FFH ;关所 灯

MOV 30H,#00H ;软件计数器预清0

MOV TMOD,#00000001B ;定时/计数器0工作于方式1

MOV TH0,#3CH

MOV TL0,#0B0H ;即数15536

SETB EA ;开总中断允许

SETB ET0 ;开定时/计数器0允许

SETB TR0 ;定时/计数器0开始运行

LOOP: AJMP LOOP ;真正工作时,这里可写任意程序

TIME0: ;定时器0的中断处理程序

PUSH ACC

PUSH PSW ;将PSW和ACC推入堆栈保护

INC 30H

MOV A,30H

CJNE A,#20,T_RET ;30H单元中的值到了20了吗?

T_L1: CPL P1.0 ;到了,取反P10

MOV 30H,#0 ;清软件计数器

T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数

POP PSW

POP ACC

RETI

END
上面一段程序是以12M晶振做的一个计时器led灯闪烁,请问为什么
“T_RET:

MOV TH0,#15H

MOV TL0,#9FH ;重置定时常数”
这个常数为什么要定成159F#呢?5535。
请各位大虾解答一下!
初值不是应该是5636那么溢出次数才是

初值5535 则计时器溢出次数为65535-5535=60000 在12M晶振的情况下 一次溢出就是60毫秒 方便计时而已

这个就不知道了 可能是程序本身没有写好

因为程序不完整,不知主程序写什么 ,所以不好下定论.
如果象你所说,这个中断部分当然是错的.通常一进入中断就要置初值,减少误差.
你的计算推理都正确,你试试改成正确的吧!

把这两句放在中断开头:
MOV TH0,#3CH
MOV TL0,#0B0H ;即数15536

把T_RET:后的两句删了

;========================
最好看清程序再确定.