*************************
CONVTEMP: MOV A,TEMPH ;判温度是否零下 ANL A,#08H
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
MOV TEMPHC,#0BH MOV TEMPFC,#0BH
;负温度标志
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;正温度标志
MOV TEMPFC,#0AH
TEMPC11: 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
31
MOV TEMPL,A
MOV A,TEMPH ;取出低四位 ANL A,#0FH SWAP A
ORL A,TEMPL ;重新组合 MOV TEMP_ZH,A LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A
ORL A,TEMPHC ;TEMPHC LOW = MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH
SWAP A ;TEMPLC HI = ORL A,TEMPLC MOV TEMPLC,A MOV A,R4 JZ TEMPC12 ANL A,#0FH SWAP A MOV R4,A
MOV A,TEMPHC ;TEMPHC HI = ANL A,#0FH ORL A,R4 MOV TEMPHC,A TEMPC12: RET
;************************
二
*****************************
十位数 BCD 个位数 BCD 百位数 BCD -十
进
制
转
换
子
32
程
序
HEX2BCD1: MOV B,#064H DIV AB MOV R4,A MOV A,#0AH XCH A,B
DIV AB SWAP A ORL A,B RET
TEMPDOTTAB: DB 00H,00H,01H,01H,02H,03H,03H,04H ; 小数部分码表 DB 05H,05H,06H,06H,07H,08H,08H,09H ;********************** DS18B20************************** READ: MOV R4,#4 读出
MOV R1,#TEMPL ;存入25H、26H、27H、28H单元 RE00: MOV R2,#8 RE01: CLR CY SETB DQ NOP NOP
CLR DQ NOP NOP NOP
SETB DQ
;开始读总线释放
;读前总线保持为低
;将温度低位、高位、TH、TL从DS18B20中
数据读取操作子程序
MOV R3,#09 ;延时18微妙 DJNZ R3,$ MOV C,DQ
;从DS18B20总线读得一位
33
MOV R3,#3CH
DJNZ R3,$ ;等待100微妙 RRC A ;把读得的位值环移给A DJNZ R2,RE01 ;读下一位 MOV @R1,A INC R1 DJNZ R4,RE00 RET
;*************************** 第
二
行
显
示
数
************************* SHOW_DIG2:ADD A,#30H
MOV B,LCD_X LCALL LCDP2 RET
;*************************** 第
二
行
显
示
数
************************* LCDP2: PUSH ACC MOV A,B ;设置显示地址
ADD A,#0C0H
;设置LCD的第二行地址 LCALL WCOM ;写入命令 POP ACC
;由堆栈取出A
LCALL WDATA ;写入数据 RET
;******************************** 显示正确信*************************** MENU_OK: MOV DPTR,#M_OK1
;指针指到显示消息
MOV A,#1 ;显示在第一行 LCALL LCD_PRINT MOV DPTR,#M_OK2
;指针指到显示消息
34
字
子
字
子
息子程
序程
序程序
MOV A,#2 ;显示在第一行 LCALL LCD_PRINT RET M_OK1: DB \M_OK2: DB \
;******************************** 显示出错信息子程序 ***************************
MENU_ERROR:MOV DPTR,#M_ERROR1 ;指针指到显示消息 MOV A,#1 ;显示在第一行 LCALL LCD_PRINT
MOV DPTR,#M_ERROR2 ;指针指到显示消息1 MOV A,#2 ;显示在第一行 LCALL LCD_PRINT RET
M_ERROR1: DB \
M_ERROR2: DB \;************************* LCD**********************
LCD_PRINT:CJNE A,#1,LINE2 ;判断是否为第一行 LINE1: MOV A,#80H ;设置 LCD 的第一行地址 LCALL WCOM ;写入命令 LCALL CLR_LINE ;清除该行字符数据 MOV A,#80H ;设置 LCD 的第一行地址 LCALL WCOM ;写入命令 JMP FILL
LINE2: MOV A,#0C0H ;设置 LCD 的第二行地址 LCALL WCOM ;写入命令 LCALL CLR_LINE ;清除该行字符数据
35
的第一行或第二行显示字符