1、DS18b20 51汇编源程序DS18b20 51 汇编源程序*FLAG1 BIT F0 ;DS18B20 存在标志位DQ BIT P1.7TEMPER_L EQU 29HTEMPER_H EQU 28HA_BIT EQU 35HB_BIT EQU 36H;*程序起始*ORG 0000HAJMP MAINORG 0100H;*主程序开始*MAIN:LCALL INIT_18B20;LCALL RE_CONFIGLCALL GET_TEMPERAJMP CHANGE;*DS18B20 复位程序*INIT_18B20: SETB DQNOPCLR DQMOV R0,#0FBHTSR1: DJNZ
2、R0,TSR1 ;延时SETB DQMOV R0,#25HTSR2: JNB DQ ,TSR3DJNZ R0,TSR2TSR3: SETB FLAG1 ;置标志位,表明 DS18B20 存在CLR P2.0 ;二极管指示AJMP TSR5TSR4: CLR FLAG1LJMP TSR7TSR5: MOV R0,#06BHTSR6: DJNZ R0,TSR6TSR7:SETB DQ ;表明不存在RET;*设定 DS18B20 暂存器设定值*;RE_CONFIG:;JB FLAG1,RE_CONFIG1;RET;RE_CONFIG1: MOV A,#0CCH ;放跳过 ROM 命令;LCALL W
3、RITE_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 DQLCALL INIT_18B20JB FLAG1,TSS2RET ;若不存在则返回TSS2: MOV A,#0CCH ;跳过 ROMLCALL WRITE_18B20MOV A,#44H
4、 ;发出温度转换命令LCALL WRITE_18B20LCALL DISPLAY ;延时LCALL INIT_18B20MOV A,#0CCH ;跳过 ROMLCALL WRITE_18B20MOV A,#0BEH ;发出读温度换命令LCALL WRITE_18B20LCALL READ2_18B20 ;读两个字节的温度RET;*写 DS18B20 程序*WRITE_18B20:MOV R2,#8CLR CWR1:CLR DQMOV R3,#6DJNZ R3,$RRC AMOV DQ,CMOV R3,#23DJNZ R3,$SETB DQNOPDJNZ R2,WR1SETB DQRET;*读
5、18B20 程序,读出两个字节的温度*READ2_18B20:MOV R4,#2 ;低位存在 29 H,高位存在 28HMOV R1,#29HRE00: MOV R2,#8RE01: CLR CSETB CNOPNOPCLR DQNOPNOPNOPSETB DQMOV R3,#7DJNZ R3,$MOV C,DQMOV R3,#23DJNZ R3,$RRC ADJNZ R2,RE01MOV R1,ADEC R1DJNZ R4,RE00RET;*读出的温度进行数据转换*CHANGE: MOV A,29HMOV C,28H.0 ;将 28H 中的最低位移入 CRRC AMOV C,28H.1RRC
6、 AMOV C,28H.2RRC AMOV C,28H.3RRC AMOV 29H,A;setb p2.0LCALL DISPLAY ;调用数码管显示子程序; setb P2.0LJMP MAIN;*DISPLAY*DISPLAY: mov a,29H;将 29H 中的十六进制数转换成 10 进制mov b,#10 ;10 进制/10=10 进制div abmov b_bit,a ;十位在 amov a_bit,b ;个位在 bmov dptr,#TAB ;指定查表启始地址mov r0,#4dpl1: mov r1,#250 ;显示 1000 次dplop: mov a,a_bit ;取个位数
7、MOVC A,A+DPTR ;查个位数的 7 段代码mov p0,a ;送出个位的 7 段代码clr p2.5;开个位显示acall d1ms ;显示 1mssetb p2.5mov a,b_bit ;取十位数MOVC A,A+DPTR ;查十位数的 7 段代码mov p0,a ;送出十位的 7 段代码clr p2.4;开十位显示acall d1ms ;显示 1mssetb p2.4djnz 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