📄 修改.asm
字号:
RS EQU P2.5
RW EQU P2.6
E EQU P2.7
lcd equ p1
TEMPER_L EQU 29H;用于保存读出温度的低8位
TEMPER_H EQU 28H;用于保存读出温度的高8位
FLAG1 EQU 38H;是否检测到DS18B20标志位
a_bit equ 20h ;数码管个位数存放内存位置
b_bit equ 21h ;数码管十位数存放内存位置
ORG 0000H
START: SETB F0
LCALL GET_TEMPER ;调用读温度子程序
; MOV 28H,#00H
;MOV 29H,#80H
ANL 28H,#0FH ;将结果进行转换
ANL 29H,#0F0H
MOV A,28H
ORL A,29H
SWAP A
MOV 29H,A ;转换结果的八位数值放在29H中
MOV B,#10 ;将所读出的 数值转换位两位十进制数值
DIV AB
ANL A,#0FH
ORL A,#30H
MOV B_BIT,A ;数码管十位数存放内存位置
MOV A,B
ANL A,#0FH
ORL A,#30H
MOV A_BIT,A ;数码管个位数存放内存位置
MOV LCD,#01H ;LCD初始化
ACALL ENABLE
MOV LCD,#38H
ACALL ENABLE
MOV LCD,#0FH
ACALL ENABLE
MOV LCD,#06H
ACALL ENABLE
MOV LCD,#80H ;1602显示 第一行显示
ACALL ENABLE
MOV A,#31H ;显示1
ACALL WRITE
ACALL BUSY
MOV LCD,#81H
ACALL ENABLE
MOV A,#3AH ;显示 :
ACALL WRITE
ACALL BUSY
MOV LCD,#82H
ACALL ENABLE
MOV A,B_BIT ;显示高位
ACALL WRITE
ACALL BUSY
MOV LCD,#83H
ACALL ENABLE
MOV A,A_BIT ;显示低位
ACALL WRITE
ACALL BUSY
MOV LCD,#84H
ACALL ENABLE
MOV A,#0DFH ;显示℃
ACALL WRITE
ACALL BUSY
MOV LCD,#85H
ACALL ENABLE
MOV A,#43H
ACALL WRITE
ACALL BUSY
;这里还却一个判断!通过判断来改变F0值------判断我没写,想让你练练以熟悉程序!
;下面这里我给你加入一个标志位F0,来决定是不是因为超过温度显示 >!!℃
;你在程序的某个地方做一个判断小程序,来比较当前温度值与设定值的大小
;方法:如果现在温度超过所定温度就将F0清零
;因为我在开始已经把测量得到的数值放在29H中,你可以将设定温度与29H比较
;这个温度的数值你自己定!提示:30℃ --#1EH 5℃--#05H
;当29H=#1EH时候 LCD显示30°C
JB F0,BAN_START ;判断是否超过温度 标志位F0
MOV LCD,#89H ;如果超过就会显示你要求的 那部分东西
ACALL ENABLE
MOV A,#29H
ACALL WRITE
ACALL BUSY
MOV LCD,#8AH
ACALL ENABLE
MOV A,#33H
ACALL WRITE
ACALL BUSY
MOV LCD,#8BH
ACALL ENABLE
MOV A,#30H
ACALL WRITE
ACALL BUSY
MOV LCD,#8CH
ACALL ENABLE
MOV A,#0DFH ;显示℃
ACALL WRITE
ACALL BUSY
MOV LCD,#8DH
ACALL ENABLE
MOV A,#43H
ACALL WRITE
ACALL BUSY
BAN_START: AJMP START
; 读出转换后的温度值
GET_TEMPER:
SETB P3.0
LCALL INIT_1820;先复位DS18B20
JB FLAG1,TSS2
CLR P3.7
RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2: setb p3.7;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!指示灯亮
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#44H ; 发出温度转换命令
LCALL WRITE_1820
;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
; LCALL DISPLAY
MOV R7,#250
DE1: NOP
NOP
DJNZ R7,DE1
LCALL INIT_1820;准备读温度前先复位
MOV A,#0CCH ; 跳过ROM匹配
LCALL WRITE_1820
MOV A,#0BEH ; 发出读温度命令
LCALL WRITE_1820
LCALL READ_18200; 将读出的温度数据保存到35H/36H
CLR P3.7 ;指示灯灭
RET
;===================================================
; 这是DS18B20复位初始化子程序
INIT_1820:
SETB P3.0
NOP
CLR P3.0
;主机发出延时537微秒的复位低脉冲
MOV R1,#3
TSR1: MOV R0,#107
DJNZ R0,$
DJNZ R1,TSR1
SETB P3.0;然后拉高数据线
NOP
NOP
NOP
MOV R0,#25H
TSR2: JNB P3.0,TSR3;等待DS18B20回应
DJNZ R0,TSR2
LJMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
setb P3.7;检查到DS18B20就点亮P1.7LED
LJMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
CLR P3.7
LJMP TSR7
TSR5: MOV R0,#117
TSR6: DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7: SETB P3.0
RET
;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
MOV R2,#8;一共8位数据
CLR C
WR1: CLR P3.0
MOV R3,#6
DJNZ R3,$
RRC A
MOV P3.0,C
MOV R3,#23
DJNZ R3,$
SETB P3.0
NOP
DJNZ R2,WR1
SETB P3.0
RET
;=======================================================
; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00: MOV R2,#8;数据一共有8位
RE01: CLR C
SETB P3.0
NOP
NOP
CLR P3.0
NOP
NOP
NOP
SETB P3.0
MOV R3,#9
RE10: DJNZ R3,RE10
MOV C,P3.0
MOV R3,#23
RE20: DJNZ R3,RE20
RRC A
DJNZ R2,RE01
MOV @R1,A
DEC R1
DJNZ R4,RE00
RET
;这下面就是1602的子程序,你复制就可以!
WRITE: ACALL BUSY ;写程序
CLR E
SETB RS
CLR RW
SETB E
MOV LCD,A
CLR E
RET
ENABLE: CLR RS
CLR RW
CLR E
ACALL BUSY
SETB E
RET
BUSY: MOV LCD,#0FFH ;读忙程序
CLR RS
SETB RW
CLR E
NOP
SETB E
JB P1.7,BUSY
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -