附录B:倒车防撞报警系统源程序
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ;堆栈在4FH以上,20H用于标志
;显示缓冲单元在40H—43H,内存44H—46H用于计算距离
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 ;40H-43H为显示数据存放单元(40H为最
高位)
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
MOV TH1,#0F3H ;40Hz初值
MOV TL1,#0F3H MOV MOV MOV MOV MOV SETB SETB SETB SETB START1: LCALL JNB CLR LCALL SETB CLR SETB MOV LOOP: LCALL DJNZ MOV CJNE MOV CJNE CLR P0,#0FFH P1,#0FFH P2,#0FFH P3,#0FFH
R4,#04H ;超声波脉冲个数控制(为赋值的一半) PX0 ET0 EA
TR0 ;开启测距定时器
DISPLAY
00H,START1 ;收到反射信号时标志位为1 EA
WORK ;计算距离子程序 EA 00H TR0
R2,#H ;测量间隔控制(约4ms×100=400ms)
DISPLAY
R2,LOOP A,40H A,#0AH,SAFE A,41H A,#0AH,SAFE P2.6
CLR P2.7 SJMP DL SJMP LOOP1
SAFE: CLR P2.5 LOOP1: SJMP START1
* * * * * * * * * * * 延时程序* * * * * * * * * * * * * * * * * DL: MOV R4,#6
DJNZ R4,DEL
RET
DEL: MOV R5,#100 DEL0: MOV R6,#200 DEL1: MOV R7,#248 DEL2: DJNZ R7,DEL2 DEL3: DJNZ R6,DEL1 DEL4: DJNZ R5,DEL0
* * * * * * * * * * * 中断程序* * * * * * * * * * * * * * * * * ;T0中断,65ms中断一次 INTT0: CLR EA CLR TR0 MOV TH0,#00H MOV TL0,#00H SETB ET1 SETB EA
SETB TR0 ;启动计数器T0,用以计算超声波来回时间
SETB TR1 ;开启发超声波用定时器1 OUT: RETI ;T1中断,发超声波用 INTT1: CPL VOUT DJNZ R4,RETIOUT
CLR TR1 ;超声波发送完毕,关T1 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
* * * * * * * * * * * * * * * 显示程序* * * * * * * * * * * * * * * * * ;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 DL1MS 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, ;共阳段码表 “0”,“1”,“2”,“3”,“4”,“5”
TAB: DB 82H, 0F8H, 80H, 90H,0FFH, 88H, 0BFH ;共阳段码表 “6”“7”“8”“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 MOV MOV MOV LCALL MOV MOV JNZ MOV SUBB JNZ MOV JJ1: MOV MOV MOV MOV MOV MOV LCALL MOV MOV JNZ MOV A,R1 R5,A R3,#00D R2,#100D DIV4BY2 41H,R4 A,41H JJ1
A,40H A,#0AH JJ1
41H,#0AH A,R0 R4,A A,R1 R5,A R3,#00D R2,#10D DIV4BY2 42H,R4 A,42H JJ2
A,41H ;次高位为0,先看最高位是否为不亮 ;次次高位为0,先看次高位是否为不
;最高位不亮,次高位也不亮 亮
SUBB A,#0AH JNZ JJ2
MOV 42H,#0AH ;次高位不亮,次次高位也不亮 JJ2: MOV 43H,R0 POP B POP PSW POP ACC RET
* * * * * * * * * * * * 2字节无符号数乘法程序* * * * * * * * * * * * * ;R7R6R5R4≤R3R2×R1R0 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 ADD A,#00H MOV R7,A
MULLOOP2: DJNZ 46H,MULLOOP1 RET
* * * * * * * * * * 4字节/2字节无符号数除法程序* * * * * * * * * * * * R7R6R5R4/R3R2=R7R6R5R4(商)…R1R0(余数) 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 MOV MOV RLC MOV MOV RLC MOV CLR MOV SUBB MOV MOV SUBB JC MOV MOV DIVLOOP2: CPL DJNZ MOV RLC MOV MOV RLC A R7,A A,R0 A R0,A A,R1 A R1,A C A,R0 A,R2 B,A A,R1 A,R3 DIVLOOP2 R0,B R1,A C
46H,DIVLOOP1 A,R4 A R4,A A,R5 A
MOV R5,A MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A RET
END
;程序结束