汇编程序编写,分享给各位
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- 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)
|