這款簡單的單片機超聲波測距板,硬件電路的設計主要包括單片機系統及顯示電路、超聲波發射電路和超聲波接收電路三部分。單片機采用AT89C2051。采用12MHz高精度的晶振,以獲得較穩定時鐘頻率,減小測量誤差。單片機用P3.5端口輸出超聲波換能器所需的40kHz的方波信號,P3.7端口監測超聲波接收電路輸出的返回信號。顯示電路采用簡單實用的3位共陽LED數碼管,段碼輸出端口為單片機的P1口,位碼輸出端口分別為單片機的P3.2、P3.1、P3.0口,數碼管位驅運用PNP三極管S9012三極管驅動。測量范圍25-300厘米,精度1厘米。
焊好的實物圖
原理圖
; 基于AT89C2051單片機超聲波測距系統
; 測量范圍35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中斷入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START : MOV R0,#70H ;立即數70H送寄存器R0中
MOV R7,#0BH ;立即數0BH送寄存器R7中
MOV 20H,#00H ;立即數00H送20H單元中
CLEARDISP: MOV @R0,#00H ;立即數立即數00H送R0中的地址單元中
INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的數值減1非零時轉移
MOV TMOD,#01H ;置定時器T0工作方式樣3,對內部機器周期計數
CJZCX:MOV TL0,#00H ;裝入定時器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超聲波發射持續200us
Here:CPL P3.5 ;輸出40kHz方波
NOP ;
NOP ;
NOP ;
DJNZ 14H,Here ;
SETB TR0
SETB P3.2
MOV R6,#53H ;延時1.5ms
DL0: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL0
QBA:JNB P3.7,QBC
DJNZ R1,QBA
DJNZ R0,QBA
QBC:CLR P3.2
CLR TR0
MOV 70H,tl0
MOV 71H,tH0
MOV R2,71H
MOV R3,70H
MOV R6,#22H
MOV R7,#0H
LCALL MULD
MOV R6,#64H
MOV R7,#0H
LCALL DIVD
MOV 73H,R2
MOV 74H,R3
MOV R3,#0H
MOV R4,#0H
MOV R5,#0H
MOV R6,73H
MOV R7,74H
LCALL HB2
MOV A,R4 ;分離BCD
MOV B,#10H
DIV AB
MOV 78H,A
MOV 77H,B
MOV A,R5
MOV B,#10H
DIV AB
MOV 76H,A
MOV 75H,B
MOV 7AH,#0EFH
XXX:LCALL DISPLAY
DJNZ 7AH,XXX
AJMP CJZCX
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 乘34程序(乘聲速) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MULD: MOV A,R3 ;計算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暫存部分積
MOV R5,A
MOV A,R3 ;計算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;計算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分積
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;計算R2乘R6
MOV B,R6
MUL AB
ADD A,R3 ;累加部分積
MOV R3,A
MOV A,R2
ADDC A,B
MOV R2,A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 除100程序(除法) ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DIVD: CLR C ;比較被除數和除數
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙字節商
DVD2: CLR C ;部分商和余數同時左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;計算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;結果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數
MOV A,R1
MOV R3,A
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;計算完十六位商(R4R5)
MOV A,R4 ;將商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;設立成功標志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD轉換 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉換雙字節十六進制整數
HB3: MOV A,R7 ;從高端移出待轉換數的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當于乘2
ADDC A,R5
DA A ;十進制調整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節十六進制數的萬位數不超過6,不用調整
DJNZ R2,HB3 ;處理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 顯示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#76H ;立即數76H送寄存器中
MOV R5,#0FEH ;立即數FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的數值送累加器A中
MOV P3,A ;累加器A中的數值送P3口
MOV A,@R1 ;以寄存器R1中的數為地址單元的數值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址為基地變址尋址單元中的數送累加器
MOV P1,A ;累加器A中的數值送P1口
MOV R6,#14H ;立即數據14送寄存器R6中
DL1:MOV R7,#19H ;立即數據19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的數據減1,不為零時則轉移
DJNZ R6,DL1 ;寄存器中的數據減1,不為零時則轉移
INC R1 ;寄存器R1中的數值加1
MOV A,R5 ;寄存器R5中的數值送累加器A中
JNB ACC.2,ENDOUT ;地址位為0則轉到ENDOUT
RL A ;累加器循環右移
MOV R5,A ;累加器A中的數值送寄存器R5中
AJMP PLAY ;絕對短轉移
ENDOUT: SETB P3.5 ;置P3.5口
MOV P1,#0FFH ;立即數0FEH送P1口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
END ;結束