程序清单
以下是用汇编语言编写的超声波测距控制源程序: 采用AT89S51 12MHz晶振
显示缓冲单元在40H~43H,使用内存44H、45H、46H用于计算距离 20H用于标志
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 002BH RETI
*主程序*
START: MOV SP, #4FH
MOV R0, #40H ;40~43H为显示数据存放单元(40为最高位) MOV R7,#0BH
CLEARDISP:MOV @R0, #00H INC R0
DJNZ R7, CLEARDISP MOV 20H, #00H
MOV TMOD, #21H ;T1为8位自动重装模式,T0为16位定时器
MOV TH0, #00H ;65ms初值
MOV TL0, #00H ;40KHz初值 MOV TH1, #0F2H MOV TL1, #0F2H MOV P0, #0FFH
MOV P1, #0FFH
MOV P2, #0FFH MOV P3, #0FFH
MOV R4, #04H ;超声波脉冲个数控制(为赋值的一半) SETB PX0 SETB ET0 STEB EA CLR 00H
SETB TR0 ;开启测距定时器
START1: LCALL DISPLAY
JNB 00H, START1 ;收到反射信号时标志位为1 CLR EA
LCALL WORK SETB EA CLR 00H
SETB TR0 MOV R2, #64H
LOOP: LCALL DISPLAY DJNZ R2, LOOP SJMP START 1
;T0中断,65ms中断一次 INTT0: CLR EA CLR TR0
MOV TH0, #00H MOV TL0, #00H SETB ET1 SETB EA
SETB TR0 来回时间
SETB TR1 OUT: RETI
;T1中断,发超声波用
INTT1: CPL VOUT
DJNZ R4,RETIOUT
CLR TR1 CLR ET1 MOV R4,#04H
SETB EX0 RETIOUT: RETI
;外中断0,收到回波时进入
;计算距离子程序 ;重新开启测距定时器
; 测量间隔控制(约4*100=400ms) *中断程序*
;启动计时器T0,用以计算超声波 ;开启发超声波用定时器T1 ;超声波发送完毕,关T1 ;开启接收回波中断 PINT0: CLR TR0 ;关计数器 CLR TR1 CLR ET1 CLR EA CLR EX0
MOV 44H, TL0 ;将计数值移入处理单元 MOV 45H, TH0
SETB 00H ;接收成功标志 RETI
*延时程序*
DL1MS: MOV R6, #14H DL1: MOV R7, #19H DL2: DJNZ R6, DL2 DJNZ R6, DL1 RET
*显示程序*
;40H为最高位,43H为最低位,先扫描高位 DISPLAY: MOV R1, #40H;G MOV R5,#0F7H;G PLAY: MOV A, R5 MOV P0, #0FFH MOV P2, A MOV A, @R1 MOV DPTR, #TAB
MOVC A, @A+DPTR MOV P0, A LCALL DLIMS INC R1 MOV A, R5 JNB ACC.0, ENDOUT;G RR A MOV R5, A AJMP PLAY
ENDOUT; MOV P2, #0FFH MOV P0, #0FFH RET
TAB; DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,88H,0BFH ;共阳数码管 0 ,1, 2,3,4,5,6,7,8,9,不亮,A, —
*距离计算程序(=计算值×17/1000cm) 近似
WORK: PUSH ACC PUSH PSW PUSH B JJ0: JJ1: 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 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 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
;最高位为0,不点亮 0,先看最高位是否为不亮; 最高位不亮,次高位也不亮 ;此高位为 JJ2:
MUL2BY2:
MULLOOP1:
JNZ JJ2
MOV A, 41H ;次高位为0,先看次高位是否为不亮 SUBB A, #0AH JNZ JJ2
MOV 42H, #0AH ;次高位不亮,次高位也不亮 MOV 43H, R0 POP B POP PSW POP ACC RET
*两字节无符号数乘法程序
CLR A MOV R7, A MOV R6, A MOV R5, A MOV R4, A
MOV 46H, #10H 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