如下:
(原文件名:超声波发射电路原理图.gif)
我手上没有74ALS04或74LS04,所以用74HC04和HCF4069UBE代替。
超声波接收采用CX20106A,如下:
(原文件名:接收电路 .jpg)
我用的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