大家好!
我現在在做超聲波測距,用的是非門 + CX20106A方案。發射部分用非門驅動,如下:
我手上沒有74ALS04或74LS04,所以用74HC04和HCF4069UBE代替。
超聲波接收采用CX20106A,如下:
我用的CX20106A是拆機件。
用萬用板搭好電路之后,在網上找到了一些參考匯編程序,我修改后可以通過串口發到PC顯示超聲波往返的時間:
;///////////////////////////////////////////////////////
; USE BY :超聲波測距器
; IC :STC89C52
; OSCCAL :XT (12M)
;///////////////////////////////////////////////////////
;
T2CON EQU 0C8H
T2MOD EQU 0C9H
RCAP2L EQU 0CAH
RCAP2H EQU 0CBH
TH2 EQU 0CDH
TL2 EQU 0CCH
VOUT EQU P3.7 ;超聲波輸出端口
;********************************************
;* 中斷入口程序 *
;********************************************
;
ORG 0000H ;復位
LJMP START
ORG 0003H ;外部中斷0
LJMP PINT0
ORG 000BH ;T0溢出中斷
RETI
ORG 0013H ;外部中斷1
RETI
ORG 001BH ;T1溢出中斷
LJMP INTT1
ORG 0023H ;串口中斷
RETI
ORG 002BH ;T2EN端負跳變(52系列)
RETI
;
;********************************************
;* 主 程 序 *
;********************************************
;
START: MOV SP,#4FH
MOV SCON,#50H ;串口方式1工作,8位數據位,1位停止位,無奇偶校驗,允許接收
MOV T2MOD,#00H ;DCEN = 0,向上計數
MOV RCAP2H,#0FEH ;定時器T2置重裝數,波特率:1200. (12MHz)
MOV RCAP2L,#0C8H
MOV TH2,#0FEH ;定時器T2置初值
MOV TL2,#0C8H
MOV T2CON,#34H ;T2工作方式:波特率發生器,同時啟動Time2定時器
CLR TI
CLR 30H
MOV TMOD,#11H ;T1、T0為16位定時器
MOV TH0,#00H ;65毫秒初值
MOV TL0,#00H
MOV TH1,#00H
MOV TL1,#00H
MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV R4,#04H ;超聲波脈沖個數控制(為賦值的一半,即2個超聲波)
SETB PX0
CLR IE0 ;外部中斷0中斷請求標志位。當主機響應中斷轉向該中斷服務程序執行時,由內部硬件自動將IE0位清0
SETB IT0 ;當IT0 = 1時,則外部中斷0(INT0 )端口由“1 ”→“0 ”下降沿跳變,激活中斷請求標志位IE0,向主機請求中斷處理
SETB ET1 ;允許T1中斷
SETB EA
SETB TR1 ;開啟測距定時器
;main主循環開始
start1:
JNB 30H,$ ;收到反射信號時標志位為1
CLR EA ;不讓T1中斷
MOV R2,#64H ;測量間隔控制(約5*100=500MS). 64H = 100
LOOP: LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
LCALL DL1MS
DJNZ R2,LOOP
CLR 30H ;清除反射信號標志位
CLR ET0 ;關閉T0中斷
MOV TH0,00H
MOV TL0,00H
SETB TR1 ;重新開啟測距定時器
SETB EA
SJMP start1
;main主循環結束
;****************************************************
;* 中斷程序 *
;****************************************************
;T1中斷,發超聲波用 ;T1中斷,65毫秒中斷一次
INTT1: CLR EA
CLR TR0
CLR EX0
MOV TH0,#00H
MOV TL0,#00H
MOV TH1,#00H
MOV TL1,#00H
SETB ET0 ;外部中斷0中斷請求標志位。當主機響應中斷轉向該中斷服務程序執行時,由內部硬件自動將IE0位清0
SETB EA
SETB TR0 ;啟動計數器T0,用以計算超聲波傳播時間
intt11:
CPL VOUT ;發射40KHZ超聲波. 晶振:12MHz,1us
nop
nop
nop
nop
nop
nop
nop
nop
nop
DJNZ R4,intt11 ;2us
;超聲波發送完畢
CLR IE0
MOV R4,#04H
LCALL DL1MS ;延時2ms,避開發射的直達聲波信號,消除余震
LCALL DL1MS
SETB EX0 ;開啟接收回波中斷
RETIOUT: RETI
;外中斷0,收到回波時進入
PINT0: nop
jb P3.2,pint0_exit
CLR TR0 ;關閉T0
CLR EA
CLR EX0
MOV SBUF,TH0
JNB TI,$
CLR TI
MOV SBUF,TL0
JNB TI,$
CLR TI
MOV TH0,#00H
MOV TL0,#00H
JNB p3.2,$
SETB 30H ;接收成功標志
pint0_exit:
RETI
;
;****************************************************
;* 延時程序 *
;****************************************************
;
DL1MS:
push 06H
push 07H
MOV R6,#14H ;14H = 20
DL1: MOV R7,#19H ;19H = 25
DL2: DJNZ R7,DL2 ;2us * 25 = 50
DJNZ R6,DL1 ;50us * 20 = 1000us
pop 07H
pop 06H
RET
;
;
DL100US:
push 06H
MOV R6,#32H ;32H = 50
DL3: DJNZ R7,DL3 ;2us * 50 = 100us
pop 07H
pop 06H
RET
;
END