這款簡單的單片機超聲波測距板,硬件電路的設(shè)計主要包括單片機系統(tǒng)及顯示電路、超聲波發(fā)射電路和超聲波接收電路三部分。單片機采用AT89C2051。采用12MHz高精度的晶振,以獲得較穩(wěn)定時鐘頻率,減小測量誤差。單片機用P3.5端口輸出超聲波換能器所需的40kHz的方波信號,P3.7端口監(jiān)測超聲波接收電路輸出的返回信號。顯示電路采用簡單實用的3位共陽LED數(shù)碼管,段碼輸出端口為單片機的P1口,位碼輸出端口分別為單片機的P3.2、P3.1、P3.0口,數(shù)碼管位驅(qū)運用PNP三極管S9012三極管驅(qū)動。測量范圍25-300厘米,精度1厘米。
焊好的實物圖
原理圖
; 基于AT89C2051單片機超聲波測距系統(tǒng)
; 測量范圍35-300厘米
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 中斷入口程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
AJMP START
ORG 000BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 主 程 序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
START : MOV R0,#70H ;立即數(shù)70H送寄存器R0中
MOV R7,#0BH ;立即數(shù)0BH送寄存器R7中
MOV 20H,#00H ;立即數(shù)00H送20H單元中
CLEARDISP: MOV @R0,#00H ;立即數(shù)立即數(shù)00H送R0中的地址單元中
INC R0 ;寄存器R0加1
DJNZ R7,CLEARDISP;寄存器中的數(shù)值減1非零時轉(zhuǎn)移
MOV TMOD,#01H ;置定時器T0工作方式樣3,對內(nèi)部機器周期計數(shù)
CJZCX:MOV TL0,#00H ;裝入定時器初值
MOV TH0,#00H
MOV R0,#0FH
MOV R1,#5bH
puzel:MOV 14H,#08H ;超聲波發(fā)射持續(xù)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 ;比較被除數(shù)和除數(shù)
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;計算雙字節(jié)商
DVD2: CLR C ;部分商和余數(shù)同時左移一位
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 ;結(jié)果判斷
JC DVD3
MOV R2,A ;夠減,存放新的余數(shù)
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 ;設(shè)立成功標(biāo)志
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; BCD轉(zhuǎn)換 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
HB2: CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進制整數(shù)
HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進位自身相加,相當(dāng)于乘2
ADDC A,R5
DA A ;十進制調(diào)整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節(jié)十六進制數(shù)的萬位數(shù)不超過6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; 顯示程序 ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY: MOV R1,#76H ;立即數(shù)76H送寄存器中
MOV R5,#0FEH ;立即數(shù)FEH送寄存器R5中
PLAY: MOV A,R5 ;寄存器R5中的數(shù)值送累加器A中
MOV P3,A ;累加器A中的數(shù)值送P3口
MOV A,@R1 ;以寄存器R1中的數(shù)為地址單元的數(shù)值送累加器中
MOV DPTR,#TAB ;16位地址送地址寄存器中
MOVC A,@A+DPTR ;以中的地址為基地變址尋址單元中的數(shù)送累加器
MOV P1,A ;累加器A中的數(shù)值送P1口
MOV R6,#14H ;立即數(shù)據(jù)14送寄存器R6中
DL1:MOV R7,#19H ;立即數(shù)據(jù)19送寄存器R7中
DL2:DJNZ R7,DL2 ;寄存器中的數(shù)據(jù)減1,不為零時則轉(zhuǎn)移
DJNZ R6,DL1 ;寄存器中的數(shù)據(jù)減1,不為零時則轉(zhuǎn)移
INC R1 ;寄存器R1中的數(shù)值加1
MOV A,R5 ;寄存器R5中的數(shù)值送累加器A中
JNB ACC.2,ENDOUT ;地址位為0則轉(zhuǎn)到ENDOUT
RL A ;累加器循環(huán)右移
MOV R5,A ;累加器A中的數(shù)值送寄存器R5中
AJMP PLAY ;絕對短轉(zhuǎn)移
ENDOUT: SETB P3.5 ;置P3.5口
MOV P1,#0FFH ;立即數(shù)0FEH送P1口
RET ;返回
TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
END ;結(jié)束