?? ultrasonicrangefinderimplementation.txt
字號:
;*********************************************
;*超聲波測距器 *
;*采用AT89C52 12MHz晶振 *
;*采用共陽LED顯示器 2008.10.3 *
;*********************************************
;測距范圍10cm-5.5m,堆棧在4FH以上,20H用于標(biāo)志
;顯示緩沖單元在40H~43H,使用內(nèi)存44H、45H、46H用于計(jì)算距離
;
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為顯示數(shù)據(jù)存放單元(40為最高位)
MOV R7,#0BH
CLEARDISP: MOV @R0, #00H
INC R0
DJNZ R7, CLEARDISP
MOV 20H, #00H
MOV TMOD, #21H ;T1為8位自動(dòng)重裝模式,T0為16位定時(shí)器
MOV TH0, #00H ;65ms初值
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 ;超聲波脈沖個(gè)數(shù)控制(為賦值的一半)
SETB PX0
SETB ET0
SETB EA
SETB TR0 ;開啟測距定時(shí)器
start1: LCALL DISPLAY
JNB 00H, START1 ;收到反射信號時(shí)標(biāo)志位為1
CLR EA
LCALL WORK ;計(jì)算距離子程序
SETB EA
CLR 00H
SETB TR0 ;重新開啟測距定時(shí)器
MOV R2, #64H ;測量間隔控制(約4*100=400ms)
LOOP: LCALL DISPLAY
DJNZ R2, LOOP
SJMP Start1
;
;*****************************************
;* 中斷程序 *
;*****************************************
;
;T0中斷,65ms中斷一次
INTT0: CLR EA
CLR TR0
MOV TH0, #00H
MOV TL0, #00H
SETB ET1
SETB EA
SETB TR0 ;啟動(dòng)計(jì)時(shí)器T0,用以計(jì)算超聲波來回時(shí)間
SETB TR1 ;開啟發(fā)超聲波用定時(shí)器T1
OUT: RETI
;T1中斷,發(fā)超聲波用
INTT1: CPL VOUT
DJNZ R4,RETIOUT
CLR TR1 ;超聲波發(fā)送完畢,關(guān)T1
CLR ET1
MOV R4,#04H
SETB EX0 ;開啟接收回波中斷
RETIOUT: RETI
;外中斷0,收到回波時(shí)進(jìn)入
PINT0: CLR TR0 ;關(guān)計(jì)數(shù)器
CLR TR1
CLR ET1
CLR EA
CLR EX0
MOV 44H, TL0 ;將計(jì)數(shù)值移入處理單元
MOV 45H, TH0
SETB 00H ;接收成功標(biāo)志
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,82H,0F8H,80H,90H,0FFH,88H,0BFH
;共陽數(shù)碼管 0, 1, 2,3,4,5,6,7,8,9,不亮,A, —
;
;**************************************************
;* 延時(shí)程序 *
;**************************************************
;
DL1MS: MOV R6, #14H
DL1: MOV R7, #19H
DL2: DJNZ R7, DL2
DJNZ R6, DL1
RET
;
;***************************************************
;* 距離計(jì)算程序(=計(jì)算值×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,不點(diǎn)亮
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 ;次高位為0,先看最高位是否為不亮
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 ;次次高位為0,先看次高位是否為不亮
SUBB A, #0AH
JNZ JJ2
MOV 42H, #0AH ;次高位不亮,次次高位也不亮
JJ2: MOV 43H, R0
POP B
POP PSW
POP ACC
RET
;
;****************************************
;* 兩字節(jié)無符號數(shù)乘法程序 *
;****************************************
;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
ADDC A, #00H
MOV R7, A
MULLOOP2: DJNZ 46H, MULLOOP1
RET
;
;*******************************************
;* 四字節(jié)/兩字節(jié)無符號數(shù)除法程序 *
;*******************************************
;R7R6R5R4/R3R2=R7R6R5R4(商)...R1R0(余數(shù))
;
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -