📄 超声波.asm
字号:
VOUT EQU P1.0 ;脉冲输出端口
ORG 0000H
LJMP START
ORG 0003H
LJMP PINT0
ORG 000BH
LJMP INTT0
ORG 0013H
RETI
ORG 001BH
LJMP INTT1
ORG 0023H
RETI
ORG 0050H
;主程序
START: MOV SP,#4FH
MOV R0,#40H
MOV R7,#0BH
CLEARDISP:MOV @R0,#00H
INC R0
DJNZ R7,CLEARDISP
MOV 20H,#00H
MOV TMOD,#21H
MOV TH0,#00H ;65秒初值
MOV TL0,#00H
MOV TH1,#0F2H ;40KHz
MOV TL1,#0F2H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R4,#04H ;脉冲个数控制(为赋值的一半)
SETB PX0
SETB ET0
SETB EA
SETB TR0 ;开启测距定时器
START1: LCALL DISPLAY
JNB 00H,START1 ;收到发射信号时标志位为1
CLR EA
LCALL WORK ;计算距离子程序
SETB EA
CLR 00H
SETB TR0 ;重新开启测距定时器
MOV R2,#64H ;测量间隔控制(约4*100=400ms)
LOOP: LCALL DISPLAY
DJNZ R2,LOOP
SJMP START1
;中断程序 65s中断一次
INTT0: CLR EA
CLR TR0
MOV TH0,#00H
MOV TL0,#00H
SETB ET1
SETB EA
SETB TR0 ;启动计数器T0,计算超声来回时间
SETB TR1
OUT: RETI
;T1中断,发超声波用
INTT1: CPL VOUT
DJNZ R4,RETIOUT
CLR TR1
CLR ET1
MOV R4,#04H
SETB EX0
RETIOUT: RETI
;外中断0,收到回波时进入
PINT0: CLR TR0 ;关计数器
CLR TR1
CLR ET1
CLR EA
CLR EX0
MOV 44H,TL0 ;将计数值移植入处理单元
MOV 45H,TH0
SETB 00H ;接收成功标志
RETI
;显示程序
DISPLAY:MOV R1,#40H
MOV R5,#0F7H
PLAY: MOV A,R5
MOV P0,#0FFH
MOV P2,A
MOV A,@R1
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DL1MS
INC R1
MOV A,R5
JNB ACC.0,ENDOUT
RR A
MOV R5,A
AJMP PLAY
ENDOUT: MOV P2,#0FFH
MOV P0,#0FFH
RET
TAB: DB 0AH,0BBH,26H,0A2H,93H,0C2H,42H,0ABH,02H,82H
;字型码 "0-9","不亮","A","-"
;延时程序
DL1MS: MOV R6,#14H
DL1: MOV R7,#19H
DL2: DJNZ R7,DL2
DJNZ R6,DL1
RET
;距离计算程序(=计数值*17/1000cm)
WORK: PUSH ACC
PUSH PSW
PUSH B
MOV PSW,#18H
MOV R3,45H
MOV R2,44H
MOV R1,#00D
MOV R0,#17D
LCALL MUL2BY2
MOV R3,#03H
MOV R2,#0E8H
LCALL DIV4BY2
LCALL DIV4BY2
MOV 40H,R4
MOV A,40H
JNZ JJ0
MOV 40H,#0AH ;最高位为0,不点亮
JJ0: MOV A,R0
MOV R4,A
MOV A,R1
MOV R5,A
MOV R3,#00D
MOV R2,#100D
LCALL DIV4BY2
MOV 41H,R4
MOV A,41H
JNZ JJ1
MOV A,40H
SUBB A,#0AH
JNZ JJ1
MOV 41H,#0AH
JJ1: MOV A,R0
MOV R4,A
MOV A,R1
MOV R5,A
MOV R3,#00D
MOV R2,#10D
LCALL DIV4BY2
MOV 42H,R4
MOV A,42H
JNZ JJ2
MOV A,41H
SUBB A,#0AH
JNZ JJ2
MOV 42H,0AH
JJ2: MOV 43H,R0
POP B
POP PSW
POP ACC
RET
MUL2BY2:CLR A
MOV R7,A
MOV R6,A
MOV R5,A
MOV R4,A
MOV 46H,#10H
MULLOOP1:CLR C
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1,A
JNC MULLOOP2
MOV A,R4
ADD A,R2
MOV R4,A
MOV A,R5
ADDC A,R3
MOV R5,A
MOV A,R6
ADDC A,#00H
MOV R6,A
MOV A,R7
ADDC A,#00H
MOV R7,A
MULLOOP2:DJNZ 46H,MULLOOP1
RET
DIV4BY2:MOV 46H,#20H
MOV R0,#00H
MOV R1,#00H
DIVLOOP1:MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
MOV A,R0
RLC A
MOV R0,A
MOV A,R1
RLC A
MOV R1 ,A
CLR C
MOV A,R0
SUBB A,R2
MOV B,A
MOV A,R1
SUBB A,R3
JC DIVLOOP2
MOV R0,B
MOV R1,A
DIVLOOP2: CPL C
DJNZ 46H,DIVLOOP1
MOV A,R4
RLC A
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R7
RLC A
MOV R7,A
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -