辽宁科技大学本科生毕业设计 第42页
DB \ \
;==================================================== RESET1:
;18B20复位子程序,检测18B20是否存在
SETB DATE_LINE1
NOP
CLR DATE_LINE1
MOV R0,#6BH ;主机发出延时复位低脉冲 MOV R1,#04H TSR11: DJNZ R0,$ MOV R0,#6BH DJNZ R1,TSR11
SETB DATE_LINE1 ;然后拉高数据线 NOP NOP NOP
MOV R0,#32H
TSR21: JNB DATE_LINE1,TSR31 ;等待DS18B20回应 DJNZ R0,TSR21
JMP TSR41 ; 延时
TSR31: SETB FLAG1 ; 置标志位,表示DS1820存在 JMP TSR51
TSR41: CLR FLAG1 ; 清标志位,表示DS1820不存在 JMP TSR71 TSR51: MOV R0,#06BH
TSR61: DJNZ R0,$ ; 时序要求延时一段时间 TSR71: SETB DATE_LINE1 RET
;======================================================= RE_18B20_1:
;检测通道1的DS18B20是否存在,并设置12位精确度
JB FLAG1,RE_18B20A1 RET RE_18B20A1:
辽宁科技大学本科生毕业设计 第43页
CALL RESET1 ;检测DS18B20是否存在 MOV A,#0CCH ;跳过ROM匹配
LCALL WRITE1 ;调用传感器1写数据或命令子程序,下同 MOV A,#7FH ;12位精确度 LCALL WRITE1 RET
;-------------------------------------------------------------- ;将自定义字符写入LCD1602的CGRAM中 ;-------------------------------------------------------------- STORE_DATA:
MOV A,#40H CALL WCOM MOV R2,#08H 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
;============================================================== WRITE1:
;传感器1写数据或命令子程序
MOV R2,#8 ;一共8位数据
CLR C WR1:
CLR DATE_LINE1 ;开始写入DS18B20总线要处于复位(低)状态 MOV R3,#07
辽宁科技大学本科生毕业设计 第44页
DJNZ R3,$ ;总线复位保持16微妙以上
RRC A ;把一个字节DATA 分成8个BIT环移给C MOV DATE_LINE1,C ;写入一个BIT MOV R3,#3CH
DJNZ R3,$ ;等待100微妙 SETB DATE_LINE1 ;重新释放总线 NOP
DJNZ R2,WR1 ;写入下一个BIT SETB DATE_LINE1 RET
;============================================================== READ1:
;读取传感器1的温度子程序
MOV R4,#2 ; 将温度低位、高位从DS18B20中读出存入TEMPH、
TEMPL
MOV R1,#TEMPL RE00: MOV R2,#8 RE01: CLR CY
SETB DATE_LINE1 NOP NOP
CLR DATE_LINE1 ;读前总线保持为低 NOP NOP NOP
SETB DATE_LINE1 ;开始读总线释放 MOV R3,#09 ;延时18微妙 DJNZ R3,$
MOV C,DATE_LINE1 ;从DS18B20总线读得一个BIT MOV R3,#3CH
DJNZ R3,$ ;等待100微妙
RRC A ;把读得的位值环移给A
辽宁科技大学本科生毕业设计 第45页
DJNZ R2,RE01 ;读下一个BIT MOV @R1,A INC R1 DJNZ R4,RE00 RET
;******************按键检测程序****************************
KEY: JB K1,L1 ;判断K1是被否按下,否则转移L1
MOV R5,#1 LCALL DELAY JB K1,L1
;确认是否按下
JNB K1,$ ;等待键释放
SETB 20H.0 ;值增加置位 AJMP L2
L1: JB K2,L2 ; 判断K2是被否按下,否则转移L2
MOV R5,#1 LCALL DELAY JB K2,L2
;确认是否按下
JNB K2,$ ;等待键释放
SETB 20H.1 ;值减少置位
L2: JB K3,L3 ; 判断K2是被否按下,否则转移L3
MOV R5,#1 LCALL DELAY JB K3,L3
;确认是否按下
JNB K3,$ ;等待键释放
SETB 20H.2 ;值确定置位 L3:
RET
;***************************************************** ; 处理温度 BCD 码子程序
;**************************************************** CONVTEMP: MOV A,TEMPH ;判温度是否零下
辽宁科技大学本科生毕业设计 第46页
ANL A,#80H
JZ TEMPC1 ;温度零上转 CLR C
MOV A,TEMPL ;二进制数求补(双字节) CPL A ;取反加1 ADD A,#01H
TEMPC1: TEMPC11:
MOV TEMPL,A MOV A,TEMPH CPL A ADDC A,#00H MOV TEMPH,A SJMP TEMPC11 MOV TEMPHC,#0AH MOV A,TEMPHC SWAP A MOV TEMPHC,A MOV A,TEMPL
ANL A,#0FH ;乘0.0625 MOV DPTR,#TEMPDOTTAB 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
;实时温度存放单元