📄 ds18b20-lcd1602-温度控制.asm
字号:
MOV R1,#0
MOV R0,#2 ;写两个标记字符
BBJJ3: MOV A,R1
MOVC A,@A+DPTR ;读出要写的标记字符
CALL WDATA ;写入标记字符
INC R1
DJNZ R0,BBJJ3 ;没有写完,继续
RET
BJ3:
DB ">H" ;超温标记
BJ4:
DB "<L" ;欠温标记
BJ5:
DB "!!" ;加热标记
;==================================================
;显示温度标记 ℃ 子程序
;将预先写入LCD1602 CGRAM 的数读出,并送显示
;==================================================
TEMP_BJ:
MOV A,#0CBH ;指定写入地址
CALL WCOM
MOV DPTR,#BJ1 ;指针指到显示消息区
MOV R1,#0
MOV R0,#2 ;写两个标记字符
BBJJ1: MOV A,R1
MOVC A,@A+DPTR
CALL WDATA
INC R1
DJNZ R0,BBJJ1 ;没有写完,继续
RET
BJ1:
DB 00H,"C" ;字符 “℃”
;=================================================
MENU_OK:
MOV DPTR,#M_OK1 ;指针指到显示信息区
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_OK2 ;指针指到显示信息区
MOV A,#2 ;显示在第二行
CALL LCD_PRINT
RET
M_OK1:
DB " DS18B20 OK ",0
M_OK2:
DB " TEMP: ",0
;-----------------------------------------------
MENU_ERROR:
MOV DPTR,#M_ERROR1 ;指针指到显示信息区
MOV A,#1 ;显示在第一行
CALL LCD_PRINT
MOV DPTR,#M_ERROR2 ;指针指到显示信息区
MOV A,#2 ;显示在第二行
CALL LCD_PRINT
RET
;----------------------------------------------------
M_ERROR1:
DB " DS18B20 ERROR ",0
M_ERROR2:
DB " PLEASE CHECK ",0
;====================================================
;DS18B20 复位与检测子程序
;DS18B20 正常 FLAG1 置 1,不正常 FLAG1 置 0。
;====================================================
RESET:
SETB DATE_LINE ;
NOP
CLR DATE_LINE
MOV R0,#6BH ;主机发出延时复位低脉冲
MOV R1,#04H
TSR1: DJNZ R0,$ ;延时
MOV R0,#6BH
DJNZ R1,TSR1
SETB DATE_LINE ;然后拉高数据线
NOP
NOP
NOP
MOV R0,#32H
TSR2: JNB DATE_LINE,TSR3 ;等待DS18B20回应
DJNZ R0,TSR2
JMP TSR4 ; 延时
TSR3: SETB FLAG1 ; 置标志位,表示DS1820存在
JMP TSR5
TSR4: CLR FLAG1 ; 清标志位,表示DS1820不存在
JMP TSR7
TSR5: MOV R0,#06BH
TSR6: DJNZ R0,$ ; 时序要求延时一段时间
TSR7: SETB DATE_LINE
RET
;==========================================================
;重新对 DS18B20 初始化
;将设定的温度报警值写入 DS18B20
;==========================================================
RE_18B20:
JB FLAG1,RE_18B20A
RET
RE_18B20A:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#4EH ;写暂存寄存器
LCALL WRITE
MOV A,TEMP_TH ;TH(报警上限)
LCALL WRITE
MOV A,TEMP_TL ;TL(报警下限)
LCALL WRITE
MOV A,#7FH ;12位精确度
LCALL WRITE
RET
;------------------------------------------------------------
;把 DS18B20 暂存器里的温度报警值拷贝到EEROM
;------------------------------------------------------------
WRITE_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#48H ;把暂存器里的温度报警值拷贝到EEROM
LCALL WRITE
RET
;--------------------------------------------------------------
;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器
;-------------------------------------------------------------
READ_E2:
CALL RESET
MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE
MOV A,#0B8H ;把EEROM里的温度报警值拷贝回暂存器
CALL WRITE
RET
;--------------------------------------------------------------
;将自定义字符“℃”写入 LCD1602 的 CGRAM 中
;--------------------------------------------------------------
STORE_DATA:
MOV A,#40H ;指定地址
CALL WCOM
MOV R2,#08H ;共取 8 个数
MOV DPTR,#D_DATA
MOV R3,#00H
S_DATA:
MOV A,R3
MOVC A,@A+DPTR ;查表取数
CALL WDATA ;写入数据
INC R3
DJNZ R2,S_DATA ;没有取完,继续
RET
D_DATA:
DB 0CH,12H,12H,0CH,00H,00H,00H,00H ;字符 “°”
;------------------------------------------------------------------
;DS18B20 写命令、数据子程序
;根据命令的内容,进行写操作
;------------------------------------------------------------------
WRITE:
MOV R2,#8 ;8位数据长度
CLR C
WR1:
CLR DATE_LINE ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#08
DJNZ R3,$ ;总线复位保持16微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DATE_LINE,C ;写入一个BIT
MOV R3,#3CH
DJNZ R3,$ ;等待120微妙
SETB DATE_LINE ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DATE_LINE
RET
;--------------------------------------------------------------------
;DS18B20 读温度子程序
; 将温度低位、高位、TH、TL从DS18B20中读出
; 分别存入 25H、26H、27H、28H 单元中
;--------------------------------------------------------------------
READ_TEMP:
CLR TR0
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#44H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE ;先写入命令
MOV R4,#4 ;存入4个单元中
MOV R1,#TEMPL ;存入单元的首地址送入 R1
RE00:
MOV R2,#8 ;8位数据长度
RE01:
CLR CY
SETB DATE_LINE
NOP
NOP
CLR DATE_LINE ;读前总线保持为低
NOP
NOP
NOP
SETB DATE_LINE ;开始读总线释放
MOV R3,#07 ;延时15微妙
DJNZ R3,$
MOV C,DATE_LINE ;从DS18B20总线读得一个BIT
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
RRC A ;把读得的位值环移给A
DJNZ R2,RE01 ;读下一个BIT
MOV @R1,A
INC R1
DJNZ R4,RE00 ;没有读完,继续
SETB TR0
RET
;*****************************************************
;处理温度 BCD 码子程序
;整数部分:取出 TEMPL 高四位和 TEMPH 低四位进行重新组合
;小数部分:取出 TEMPL 低四位,查小数码表
;****************************************************
CONVTEMP:
MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转
SETB FLAG3 ;温度为负值
CLR C
MOV A,TEMPL ;二进制数求补(双字节)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH
CPL A
ADDC A,#00H
MOV TEMPH,A
JMP TEMPC2
TEMPC1:
CLR FLAG3 ;温度为正值
TEMPC2:
MOV A,TEMPL
ANL A,#0FH ;取出小数部分
MOV B,#10 ;将TEMP_L的低四位X10/16得小数后一位数.
MUL AB
MOV B,#16
DIV AB
MOV 70H,A ;小数部分 BCD
MOV A,TEMPL ;整数部分
ANL A,#0F0H ;取出高四位
SWAP A
MOV TEMPL,A
MOV A,TEMPH ;取出低四位
ANL A,#0FH
SWAP A
ORL A,TEMPL ;重新组合温度数据
MOV TEMP_ZH,A ;重新组合的温度数据存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A ;(A)=十位数和个位数
ANL A,#0F0H
SWAP A
MOV 72H,A ;十位数 BCD
MOV A,TEMPL
ANL A,#0FH
MOV 71H,A ;个位数 BCD
MOV A,R4 ;(R4)= 百位数
MOV 73H,A
TEMPC3:
RET
;====================================================
;单字节十六进制转BCD
;入口:(A)=单字节十六进制的温度值
;出口:(R4)= 百位数,(A)=十位数和个位数
;====================================================
HEX2BCD1:
MOV B,#064H
DIV AB
MOV R4,A ;(R4)=百位数
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B ;(A)=十位数和个位数
RET
;=====================================================
;显示 TH 和 TL 值的子程序
;=====================================================
LOOK_ALARM:
MOV DPTR,#M_ALAX2 ;指针指到显示信息区
MOV A,#2 ;显示在第二行
CALL LCD_PRINT ;
MOV A,#0C6H ;指定地址
CALL TEMP_BJ1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -