INC R7 CJNE R7,#32H,T0IT1 MOV R7,#00H SETB TIME1SOK ;1s定时到标志 T0IT1: POP PSW RETI
;============================= 主程序============================= MAIN: LCALL DISP1 ;调用显示子程序 JNB TIME1SOK,MAIN CLR TIME1SOK ;测温每1s一次 JNB TEMPONEOK,MAIN2 ;上电时先温度转换一次 LCALL READTEMP1 ;读出温度值子程序 LCALL CONVTEMP ;温度BCD码计算处理子程序 LCALL DISPBCD ;显示区BCD码温度值刷新子程序 LCALL DISP1 ;消闪烁,显示一次 MAIN2: LCALL READTEMP ;温度转换开始 SETB TEMPONEOK LJMP MAIN
;============================= 子程序区=========================== ;RESET DS18B20
;================================================================
INITDS1820:SETB TEMPDIN NOP NOP CLR TEMPDIN MOV R6,#0A0H ;DELAY 480us DJNZ R6,$ MOV R6,#0A0H DJNZ R6,$ SETB TEMPDIN MOV R6,#32H ;DELAY 70us DJNZ R6,$ MOV R6,#3CH
LOOP1820: MOV C,TEMPDIN JC INITDS1820OUT DJNZ R6,LOOP1820 MOV R6,#064H DJNZ R6,$ SJMP INITDS1820 RET
INITDS1820OUT: SETB TEMPDIN
RET
;====== 读DS18B20的程序,从DS18B20中读出一个字节的数据=============
READDS1820: MOV R7,#08H SETB TEMPDIN NOP NOP
READDS1820LOOP: CLR TEMPDIN NOP NOP NOP SETB TEMPDIN MOV R6,#07H ;DELAY 15us DJNZ R6,$ MOV C,TEMPDIN MOV R6,#3CH ;DELAY 120us DJNZ R6,$ RRC A SETB TEMPDIN DJNZ R7,READDS1820LOOP MOV R6,#3CH ;DELAY 120 us DJNZ R6,$ RET
;======== 写DS18B20的程序,从DS18B20中写一个字节的数据=============
WRITEDS1820: MOV R7,#08H SETB TEMPDIN NOP NOP
WRITEDS1820LOP: CLR TEMPDIN MOV R6,#07H ;DELAY 15us DJNZ R6,$ RRC A MOV TEMPDIN,C MOV R6,#34H ;DELAY 104us DJNZ R6,$ SETB TEMPDIN DJNZ R7,WRITEDS1820LOP RET
;========================= READ TEMP =========================== READTEMP: LCALL INITDS1820 MOV A,#0CCH LCALL WRITEDS1820 ;SKIP ROM
MOV R6,#34H ;DELAY 104us DJNZ R6,$ MOV A,#44H LCALL WRITEDS1820 ;START CONVERSION MOV R6,#34H ;DELAY 104 DJNZ R6,$ RET
READTEMP1: LCALL INITDS1820 MOV A,#0CCH LCALL WRITEDS1820 ;SKIP ROM MOV R6,#34H ;DELAY 104us DJNZ R6,$ MOV A,#0BEH LCALL WRITEDS1820 ;SCRATCHPAD MOV R6,#34H ;DELAY 104us DJNZ R6,$ MOV R5,#09H MOV R0,#TEMPHEAD MOV B,#00H
READTEMP2: LCALL READDS1820 MOV @R0,A INC R0 READTEMP21: LCALL CRC8CAL DJNZ R5,READTEMP2 MOV A,B JNZ READTEMPOUT MOV A,TEMPHEAD+0 MOV TEMPL,A MOV A,TEMPHEAD+1 MOV TEMPH,A READTEMPOUT: RET ;================== 处理温度BCD码========================== CONVTEMP: MOV A,TEMPH ANL A,#80H JZ TEMPC1 CLR C MOV A,TEMPL CPL A ADD A,#01H MOV TEMPL,A MOV A,TEMPH ;- CPL A ADDC A,#00H
子程序
MOV TEMPH,A ;TEMPHC HI=符号位 MOV TEMPHC,#0BH 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,#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 LCALL HEX2BCD1 MOV TEMPL,A ANL A,#0F0H SWAP A ORL A,TEMPHC ;TEMPHC LOW=十位数BCD MOV TEMPHC,A MOV A,TEMPL ANL A,#0FH SWAP A ;TEMPLC HI=个位数BCD ORL A,TEMPLC MOV TEMPLC,A MOV A,R7 JZ TEMPC12 ANL A,#0FH SWAP A MOV R7,A MOV A,TEMPHC ;TEMPLC HI=百位数BCD ANL A,#0FH ORL A,R7 MOV TEMPHC,A TEMPC12: RET
;========================= 小数部分码表=========================== TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
相关推荐: