📄 ds1820shangweijitongxun.asm
字号:
TEMP_ZH DATA 24H ; 实时温度存放单元
TEMPL DATA 25H ; 实时温度低8位存放单元
TEMPH DATA 26H ; 实时温度高8位存放单元
TEMP_TH DATA 27H ; 高温报警值存放单元
TEMP_TL DATA 28H ; 低温报警值存放单元
TEMPHC DATA 29H ; 温度转换后各位和十位值
TEMPLC DATA 2AH ;温度转换后小数值
LCD_RS EQU P2.5 ; LCD RS控制线
LCD_RW EQU P2.6 ; LCD RW控制线
LCD_EN EQU P2.7 ; LCD EN控制线
FLAG1 EQU 20H.0; DS18B20是否存在标记
KEY_UD EQU 20H.1; 设定KEY的UP 与DOWN标记
DATE_LINE EQU P2.0 ; DS18B20数据线
SJ EQU P0 ;LCD液晶屏数据端口
; *******************************************
; 主程序
;********************************************
ORG 0000H
JMP MAIN
ORG 0030H
MAIN:MOV SP,#60H
MOV A,#00H
MOV R0,#20H ;将20H~2FH单元清零
MOV R1,#10H
CLEAR:MOV @R0,A
INC R0
DJNZ R1,CLEAR
CALL RE_18B20
START:CALL RESET ; 复位子程序
JNB FLAG1,START1 ;DS18B20不存在
CALL MENU_OK
JMP START2
START1:CALL MENU_ERROR
CALL DISPLAY
SJMP $
START2:CALL RESET
JNB FLAG1,START1 ;DS18B20 不存在
MOV A,#0CCH ;跳过ROM匹配
CALL WRITE
MOV A,#44H ; 发出温度转换命令
CALL WRITE
CALL RESET
MOV A,#0CCH ; 跳过ROM匹配
CALL WRITE
MOV A,#0BEH ; 发出读温度命令
CALL WRITE
CALL READ
CALL CONVTEMP
CALL DISPLAY
CALL FASHONG
CALL YANSHI
AJMP START2
;******************************************************************
;DISPLAY显示程序,读内存40H~4FH显示第一行 ,读内存50H~5FH显示第二行
;*******************************************************************
DISPLAY: CALL DELAY ; 延时一段时间
MOV SJ,#38H
CALL ENABLE ; 写指令38H
MOV SJ,#38H
CALL ENABLE ; 写指令38H
MOV SJ,#38H
CALL ENABLE ; 写指令38H
MOV SJ,#38H
CALL ENABLE ; 写指令38H
MOV SJ,#08H
CALL ENABLE ; 写指令08H
MOV SJ,#01H
CALL ENABLE ; 写指令01H
MOV SJ,#06H
CALL ENABLE ; 写指令06H
MOV SJ,#0CH
CALL ENABLE ; 写指令0CH
MOV SJ,#80H ; 第一行显示第一个字符的位置
CALL ENABLE ; 调用写指令
MOV R1,#40H ; 第一行表头指令
CALL WRITEL_1 ; 调用第一行写子程序
MOV SJ,#0C0H ; 第二行位置
CALL ENABLE ; 调用写指令
MOV R1,#50H ; 第二行表头指令
CALL WRITEL_2 ; 调用第二行写子程序
RET ; 返回主程序
ENABLE: CLR LCD_RS ; 写命令时序
CLR LCD_RW
CLR LCD_EN
CALL DELAY
SETB LCD_EN
RET
WRITEL_1:NOP
AL_1:MOV A,@R1 ;把R1的值送到A
CALL WRITE2 ;调用写程序写入单个字节
INC R1 ; 将工作寄存器指针加一
CJNE R1,#4FH,AL_1 ;R1 的内容加到4FH后就返回到A1处
RET
WRITEL_2:NOP
AL_2:MOV A,@R1 ;把R1的值送到A
CALL WRITE2 ;调用写程序写入单个字节
INC R1 ; 将工作寄存器指针加一
CJNE R1,#5FH,AL_2 ;R1 的内容加到5FH后就返回到A1处
RET
WRITE2:MOV SJ,A ; 写单个字符,写数据到显示端口
SETB LCD_RS ;写数据时序
CLR LCD_RS
CLR LCD_RW
CLR LCD_EN
CALL DELAY
SETB LCD_EN
RET
DELAY:MOV R7,#5 ;延时5MS
D1:MOV R6,#100
D2:DJNZ R6,D2
DJNZ R7,D1
RET
;***********************************************
;DS18B20 正确时显示:DS18B20 OK TEMP: . oC
;*************************************************
MENU_OK:
MOV R2,#00H
MOV R1,#40H
MOV R3,#20H
MOV DPTR,#M_OK
DD2: MOV A,R2
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC R2
DJNZ R3,DD2
RET
M_OK:DB " DS18B20 OK "
DB " TEMP: .oC "
;********************************************************
; DS18B20错误时显示:DS18B20 ERROR TEMP: ----oC
;********************************************************
MENU_ERROR:
MOV R2,#00H
MOV R1,#40H
MOV R3,#20H
MOV DPTR,#ERR
DD1: MOV A,R2
MOVC A,@A+DPTR
MOV @R1,A
INC R1
INC R2
DJNZ R3,DD1
RET
ERR:
DB " DS18B20 ERROR "
DB " TEMP: ----oC "
;***************************************************
; 设置DS18B20工作方式, 12位精确
;***************************************************
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程序
;********************************************
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程序
;*******************************************
WRITE:
MOV R2,#8 ;一共8位数据
CLR C
WR1: CLR DATE_LINE ;开始写入DS18B20总线要处于复位(低)状态
MOV R3,#07
DJNZ R3,$ ;总线复位保持16微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C
MOV DATE_LINE,C ;写入一个BIT
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
SETB DATE_LINE ;重新释放总线
NOP
DJNZ R2,WR1 ;写入下一个BIT
SETB DATE_LINE
RET
;****************************************************
; 将温度低位、高位、TH、TL从DS18B20中读出
; 存入25H、26H、27H、28H
;******************************************************
READ:
MOV R4,#4 ; 将温度低位、高位、TH、TL从DS18B20中读出
MOV R1,#TEMPL ; 存入25H、26H、27H、28H
RE00:
MOV R2,#8
RE01:
CLR CY
SETB DATE_LINE
NOP
NOP
CLR DATE_LINE ;读前总线保持为低
NOP
NOP
NOP
SETB DATE_LINE ;开始读总线释放
MOV R3,#09 ;延时18微妙
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
RET
;*****************************************************
;把TEMPL和TEMPH中的内容转化成对应的温度值TEMPLC和TEMPHC
;*******************************************************
CONVTEMP:MOV A,TEMPH ;判温度是否零下
ANL A,#80H
JZ TEMPC1 ;温度零上转
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
SJMP TEMPC11
TEMPC1:MOV TEMPHC,#0AH
TEMPC11:MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPD0TTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小数部分 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
CALL HEX2BCD1 ;整数部分百位在R4,十位个位在A中
CALL XIANSHI
NOP
TEMPC12:RET
;*******************************************************
; 0~9查表程序
;*******************************************************
XIANSHI:MOV 30H,A
ANL A,#0FH
MOV A,30H
SWAP A
ANL A,#0FH
MOV 32H,A
MOV 33H,R4
MOV DPTR,#XIAN
MOV A,31H
MOVC A,@A+DPTR
MOV 58H,A
MOV A,32H
MOVC A,@A+DPTR
MOV 57H,A
MOV A,33H
MOVC A,@A+DPTR
MOV 56H,A
MOV A,TEMPLC
MOVC A,@A+DPTR
MOV 5AH,A
RET
XIAN: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H
;*************************************************
; 整数部分百位在R4,十位个位在A中
;*************************************************
HEX2BCD1:MOV B,#064H ;十六进制转化为BCD
DIV AB ; B=A%100
MOV R4,A ; R7=百位数
MOV A,#0AH
XCH A,B
DIV AB ; B=A%B
SWAP A
ORL A,B
RET
;*****************************************************
;小数部分码表
;******************************************************
TEMPD0TTAB:
DB 00H,00H,01H,01H,02H,03H,03H,04H
DB 05H,05H,06H,06H,07H,08H,08H,09H
;*****************************************************
;发送
;*****************************************************
FASHONG:
MOV R0,#50H
MOV 7FH,#10H
BTL:MOV SCON,#60H
MOV TMOD,#20H
MOV TH1,#0E8H
MOV TL1,#0E8H
SETB TR1
FA:MOV A,@R0
MOV SBUF,A
JNB TI,$
JBC TI,FA1
NOP
FA1:INC R0
DJNZ 7FH,FA
RET
;***********************************************
; 延时
;***********************************************
YANSHI:MOV R7,#5
D11:MOV R6,#255
D12:MOV R5,#255
D13:DJNZ R5,$
DJNZ R6,D12
DJNZ R7,D11
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -