单片机汇编简单问题 很着急

来源:百度知道 编辑:UC知道 时间:2024/04/29 16:54:46
程序如下:
ORG 0000H
AJMP START
ORG OOOBH (问题1)
AJMP TIME0
ORG 30H
START: MOV P1,#OFFH
MOV TMOD,#00000001B
MOV TH0,#15H
MOV TL0,#0A0H
SETB EA
SETB ET0
SETB TR0
LOOP: AJMP LOOP
TIME0:
PUSH ACC
PUSH PSW
INC 30H
MOV A,30H
CJNE A,#20H,TIME1
CPL P1.0
MOV 30H,#0
TIME1: MOV TH0,#15H
MOV TL0,#9FH
POP PSW
POP ACC
RET1
END
请问 问题1 ORG 000BH, 这行为什么要放到这里,能移动位置吗?
问题2 为什么 会有20次定时中断取反P1.0,不知道这个程序怎么回事, 一定要详细解释一下~!
问题3 RET1 以后是不是程序回到了 ORG 30H 这个程序啊

ORG 0000H 程序开始地址0000H
AJMP START 跳转到START
ORG OOOBH (问题1) 设置定时器0入口地址
AJMP TIME0 跳转到定时器0中断服务子程序
ORG 30H 程序从30H开始
START: MOV P1,#OFFH P1口全置1(作用是恢复默认)
MOV TMOD,#00000001B 设置定时器0
MOV TH0,#15H 设置定时器初使值是15A0H
MOV TL0,#0A0H
SETB EA 允许所有中断触发(中断总开关)
SETB ET0 允许定时器中断触发(定时器中断开关)
SETB TR0 启动定时器0
(这时定时器0开始走,当TH0和TL0等于00H时,触发定时器0中断,指令就会跳ORG OOOBH来执行, 当遇到 指令RETI时,就会跳转回原来的指令,继续原来的工作)
LOOP: AJMP LOOP 死循环(为了等待定时器0中断触发)
TIME0: 进入中断服务子程序
PUSH ACC 保存累加器ACC进堆栈INC 30H
INC 30H 地址30H里的数据+1;再送到地址30H中
MOV A,30H 把地址30H里的数据给A
CJNE A,#20H,TIME1 如果A和20H不相等,就跳转到TIME1(如果相等就继续向下)
CPL P1.0 P1.0取反
MOV 30H,#0 地址30H清0
TIME1: MOV TH0,#15H 重新设置定时器初值
MOV TL0,#9FH
POP PSW 恢复PSW和AC