标题:
单片机汇编语言超声波测距报警程序和Proteus仿真
[打印本页]
作者:
李花生51
时间:
2025-6-23 21:32
标题:
单片机汇编语言超声波测距报警程序和Proteus仿真
汇编程序编写,分享给各位
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei图片_20250623213624.png
(201.45 KB, 下载次数: 0)
下载附件
2025-6-23 21:32 上传
单片机源程序如下:
RS BIT P1.0 ;LCD1602引脚定义
RW BIT P1.1
EN BIT P1.2
ECHO BIT P3.6 ;回波信号端
NUM EQU 40H ;定时器用
H EQU 41H ;距离高8位
L EQU 42H ;距离低8位
ORG 0000H
LJMP MAIN
ORG 000BH ;定时器0入口
LJMP TIME0
ORG 0030H
MAIN:
MOV SP,#60H
MOV R0,#40H
MOV A,#0
MOV NUM,#0
MOV H,#0
MOV L,#0
MOV H,#1
MOV L,#0
LCALL LCD1602_INIT ;1602初始化
LCALL DELAY2
MOV A,#80H
LCALL WRITE_1602COM
MOV DPTR,#CODE_PRINT
LCALL PRINT
MOV TMOD,#11H ;初始化定时器
MOV TH0,#0;
MOV TL0,#0;
SETB EA
SETB ET0
;主循环
LOOP:
SETB TR1
LOOP1:
JB ECHO,LOOP2
SJMP LOOP1
LOOP2:
SETB TR0
LOOP3:
JNB ECHO,LOOP4
SJMP LOOP3
LOOP4:
CLR TR0
LCALL COUNT
LCALL DISPLAY ;显示距离
SJMP LOOP6
LOOP5:
CLR TR0
MOV TH0,#0;
MOV TL0,#0;
LOOP6:
SJMP LOOP
COUNT: ;计算距离 cm=us/58
MOV R1,TH0
MOV R0,TL0
MOV L,#0
MOV H,#0
MOV TH0,#0
MOV TL0,#0
DIS1:
CLR C ;循环被除数减去除数的次数就是这个商
MOV A, R0
SUBB A, #3AH
MOV R0, A
MOV A, R1
SUBB A, #0
MOV R1, A
JC DIS2
INC L
MOV A,L
CJNE A,#0,DIS1
INC H
SJMP DIS1
DIS2:
RET
DISPLAY: ;显示距离
MOV R6,H
MOV R7,L
LCALL HB2 ;2字节16进制数转换为3字节压缩BCD码
MOV A,#089H
MOV B,R4
LCALL DIS_1BIT
MOV A,R5
LCALL DIS_2BIT
CJNE R4,#3,DIS0
CLR P3.7
RET
DIS0:
SETB P3.7
RET
;LCD1602初始化函数
LCD1602_INIT:
MOV A,#38H
LCALL WRITE_1602COM
MOV A,#0CH
LCALL WRITE_1602COM
MOV A,#06H
LCALL WRITE_1602COM
MOV A,#01H
LCALL WRITE_1602COM
RET
WRITE_1602COM: ;写命令
CLR RS
CLR RW
MOV P0,A
LCALL DELAY1
SETB EN
LCALL DELAY1
CLR EN
RET
WRITE_1602DAT: ;写数据
SETB RS
CLR RW
MOV P0,A
LCALL DELAY1
SETB EN
LCALL DELAY1
CLR EN
RET
;1602显示字符串函数
PRINT:
MOV R0,#0
PRINT1:
MOV A,R0
MOVC A,@A+DPTR
CJNE A,#0,PRINT0
RET
PRINT0:
LCALL WRITE_1602DAT
INC R0
SJMP PRINT1
;1602显示2位整数
DIS_2BIT:
MOV B,#16
DIV AB
ADD A,#30H
LCALL WRITE_1602DAT
MOV A,B
ADD A,#30H
LCALL WRITE_1602DAT
RET
;1602显示1位整数
DIS_1BIT: ;A是地址 B放数据
LCALL WRITE_1602COM
MOV A,B
ADD A,#30H
LCALL WRITE_1602DAT
RET
DELAY1: ;延时1
MOV 30H,#20
DJNZ 30H,$
RET
DELAY2: ;延时2
MOV 30H,#50
DELAY20:
MOV 31H,#50
DJNZ 31H,$
DJNZ 30H,DELAY20
RET
;定时器0中断函数
TIME0:
RETI
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
CODE_PRINT:
DB "DISTANCE cm",0
END
复制代码
仿真程序下载:
01.7z
(52.24 KB, 下载次数: 0)
2025-6-23 21:59 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1