;********************************** FLAG1 BIT F0 ;DS18B20存在标志位 DQ BIT P1.7 TEMPER_L EQU 29H TEMPER_H EQU 28H A_BIT EQU 35H B_BIT EQU 36H ;************程序起始******************** ORG 0000H AJMP MAIN ORG 0100H ;**************主程序开始************ MAIN: LCALL INIT_18B20 ;LCALL RE_CONFIG LCALL GET_TEMPER AJMP CHANGE ;**********DS18B20复位程序***************** INIT_18B20: SETB DQ NOP CLR DQ MOV R0,#0FBH TSR1: DJNZ R0,TSR1 ;延时 SETB DQ MOV R0,#25H TSR2: JNB DQ ,TSR3 DJNZ R0,TSR2 TSR3: SETB FLAG1 ;置标志位,表明DS18B20存在 CLR P2.0 ;二极管指示 AJMP TSR5 TSR4: CLR FLAG1 LJMP TSR7 TSR5: MOV R0,#06BH TSR6: DJNZ R0,TSR6 TSR7:SETB DQ ;表明不存在 RET ;********************设定DS18B20暂存器设定值************** ;RE_CONFIG: ;JB FLAG1,RE_CONFIG1 ;RET ;RE_CONFIG1: MOV A,#0CCH ;放跳过ROM命令 ;LCALL WRITE_18B20 ;MOV A,#4EH ;LCALL WRITE_18B20 ;写暂存器命令 ;MOV A,#00H ;报警上限中写入00H ;LCALL WRITE_18B20 ;MOV A,#00H ;报警下限中写入00H ; LCALL WRITE_18B20 ;MOV A,#1FH ;选择九位温度分辨率 ; LCALL WRITE_18B20 ; RET ;*****************读转换后的温度值**************** GET_TEMPER: SETB DQ LCALL INIT_18B20 JB FLAG1,TSS2 RET ;若不存在则返回 TSS2: MOV A,#0CCH ;跳过ROM LCALL WRITE_18B20 MOV A,#44H ;发出温度转换命令 LCALL WRITE_18B20 LCALL DISPLAY ;延时 LCALL INIT_18B20 MOV A,#0CCH ;跳过ROM LCALL WRITE_18B20 MOV A,#0BEH ;发出读温度换命令 LCALL WRITE_18B20 LCALL READ2_18B20 ;读两个字节的温度 RET ;***************写DS18B20程序************ WRITE_18B20: MOV R2,#8 CLR C WR1: CLR DQ MOV R3,#6 DJNZ R3,$ RRC A MOV DQ,C MOV R3,#23 DJNZ R3,$ SETB DQ NOP DJNZ R2,WR1 SETB DQ RET ;***********读18B20程序,读出两个字节的温度********* READ2_18B20: MOV R4,#2 ;低位存在29 H,高位存在28H
MOV R1,#29H RE00: MOV R2,#8 RE01: CLR C SETB C NOP NOP CLR DQ NOP NOP NOP SETB DQ MOV R3,#7 DJNZ R3,$ MOV C,DQ MOV R3,#23 DJNZ R3,$ RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET ;************读出的温度进行数据转换************** CHANGE: MOV A,29H MOV C,28H.0 ;将28H中的最低位移入C RRC A MOV C,28H.1 RRC A MOV C,28H.2 RRC A MOV C,28H.3 RRC A MOV 29H,A ;setb p2.0 LCALL DISPLAY ;调用数码管显示子程序 ; setb P2.0 LJMP MAIN ;*******************DISPLAY****** DISPLAY: mov a,29H;将29H中的十六进制数转换成10进制 mov b,#10 ;10进制/10=10进制 div ab mov b_bit,a ;十位在a mov a_bit,b ;个位在b mov dptr,#TAB ;指定查表启始地址 mov r0,#4 dpl1: mov r1,#250 ;显示1000次 dplop: mov a,a_bit ;取个位数 MOVC A,@A+DPTR ;查个位数的7段代码 mov p0,a ;送出个位的7段代码 clr p2.5;开个位显示 acall d1ms ;显示1ms setb p2.5 mov a,b_bit ;取十位数 MOVC A,@A+DPTR ;查十位数的7段代码 mov p0,a ;送出十位的7段代码 clr p2.4;开十位显示 acall d1ms ;显示1ms setb p2.4 djnz r1,dplop ;100次没完循环 djnz r0,dpl1 ;4个100次没完循环 ret ;*********************************** D1MS: MOV R7,#80 ;1MS延时(按12MHZ算) DJNZ R7,$ RET ;************************* TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
|