;***P1.0 口发射,P1.2 口接收,P0.0~P0.3 与 P0.4~P0.7 分别接 SN74LS47N 解码器的 A、B、C、
D 脚,再接到两位七段数码管
;***************产生超声波发射所需的发射脉冲信号********************
0RG 00H
START:
MOV A,#0FFH
MOV P1,A
先写入“1”
MOV TMOD,#02H
TIMER0_LOAD:
MOV TH0,#0F4H
MOV TL0,#0F4H
RESEND_PULSE:
MOV R2,#40
所以设为 40
SEND_PAUSE:
SETB TR0
TIMER0_CHECK:
JNB TF0,TIMER0_CHECK
CLR TR0
CLR TF0
CPL P1.0
DJNZ R2,SEND_PULSE
;ACC=0FFH
;P1.2 将作为输出口,需要
;设置 Timer0 工作在模式 2 下
;往 TH0 中载入计数初始值
;往 TL0 中载入计数初始值
;一个方波对应 2 个 Timer 延时,
;启动 Timer0
;检测 Timer 溢出标志,当 TF0=1,跳出
;关闭 Timer0
;将 TF0 清零
;将 TF0 取反
;如果 R2 不为 0,跳到 SEND_PULSE 继续
;***************等待回波信号时的计时功能********************
WAITECHO:
;等待回波信号
MOV TMOD,#12H
TIMER1_LOAD:
MOV TL1,#00H
得最大计时
MOV TH1,#00H
SETB TR1
ECHO_CHECK:
JB P1.2,RECORD
到达
JNB TF1,ECHO_CHECK
CLR TR1
Timer1
CLR TF1
JMP RESEND_PULSE
RECORD:
CLR TR1
Timer1
CLR TF1
;Timer1 模式 1,Timer0 模式 2
;载入最小的计数初始值,以获
;启动 Timer1
;检测回波信号,如果 P1.2=1,回波
;如果回波还没有到达,Timer1 继续计时
;Timer1 计 时 完 成 , 关 闭
;清 TF1
;跳回 SEND_PULSE 重新发射超声波
; 已 接 收 到 回 波 , 停 止
;清 TF1
MOV 30H,TL1
MOV 31H,TH1
MOV R0,#00H
MOV R1,#00H
MOV SP,#50H
CLR C
0
METER:
行比较
PUSH 30H
压入堆栈
MOV A,30H
SUBB A,#0FAH
位 FAH 相减
MOV 30H,A
MOV A,31H
SUBB A,#16H
差高位 16H 相减
JC DECIMETER
;30H 存储计时的低位字节
;31H 存储计时的高位字节
;R0 记录的是 1 米的倍数,清 0
;R1 记录的是 1/10 米的倍数,清
;定义堆栈初始地址为 50H
;进位 CY 清 0
;与一米的时间差 16FAH 进
;先将 30H 上的时间差低位
;时间差低位载入 ACC
;时间差低位与 1 米对应的时间差低
;结果存回 30H
;时间差高位载入 ACC
;时间差高位与 1 米对应的时间
;如果有借位,说明相减结果已经小
于 1 米,则跳到 DECIMETER 与 1/10 米的时间差进行比较
INC R0
MOV 31H,A
JMP METER
比较
DECIMETER:
比较
POP 30H
位弹出到 30H
DECIMETER_1:
MOV A,30H
SUBB A,#4CH
间差低位 4C 相减
MOV 30H,A
MOV A,31H
SUBB A,#02H
高位 02H 相减
JC DISPLAY
经小于 1/10 米,则时间差比较计算完成,跳到显示程序段
;如果没有借位,米数增加 1
;高位相减结果存回 31H
;继续与 1 米的时间差进行
;与 1/10 米的时间差 024CH 进行
;将堆栈中存储的时间差低
;时间差低位载入 ACC 中
;时间差低位与 1/10 米对应的时
;结果存回 30H
;时间差高位载入 ACC
;时间差高位与 1/10 米的时间差
;如果有借位,说明相减结果已
;如果没有借位,1/10 米数
INC R1
增加 1
MOV 31H,A
JMP DECIMETER_1
DISPLAY:
MOV A,R0
;高位相减结果存回 31H
;继续与 1/10 米的时间差进行比较
;1 米的倍数载入 ACC
SWAP A
ADD A,R1
MOV P0,A
JMP START
END
;ACC 中高、低位互换
;ACC 与 R1 相加,得到显示数据
;显示数据从 P0 口输出
;循环