数码管温度传感器DS18B20应用
数码管温度传感器DS18B20应用
单线数字温度传感器DS18B20可以把温度信号直接转换成串行数字信号供单片机处理,具有体积小,精度高,使用灵活等特点,其引脚如图:

使用单线数字温度传感器DS18B20,把温度信号直接转换成数字信号输入单片机,经单片机处理后,将实时温度显示在两个7段LED数码管上。电路图如下

数字温度计程序:
A_BIT EQU 20H        存放个位数变量
B_BIT EQU 21H        存放十位数变量
FLAG EQU 38H        DS18B20是否存在标志
DQ EQU P3.5        DQ引脚由P3.5控制
MAIN:        主程序标号
ACALL RE_TEMP        对传感器设置及读取
ACALL TURN        转化温度子程序
ACALL DISPLAY        显示子程序
JMP MAIN        循环
RE_TEMP:        对DS18B20初始化及读取
SETB DQ
ACALL RESET_1820        调用复位子程序
JB FLAG, ST        判断DS1820是否存在?
RET
ST:        DS18B20存在
MOV A,#0CCH        跳过ROM匹配
ACALL WRITE_1820        写入数据
MOV A,#44H        发出温度转换命令
ACALL WRITE_1820        写入数据
ACALL RESET_1820        准备读温度前先复位
MOV A,#0CCH        跳过ROM匹配
ACALL WRITE_1820        写入数据
MOV A,#0BEH        发出读温度命令
ACALL WRITE_1820        写入数据
ACALL READ_1820        读出温度数据
RET
RESET_1820:        复位(有具体的时序要求)
SETB DQ
NOP
CLR DQ
       ――――――――――――
       主机发出延时537微秒的复位低脉冲
MOV R1,#3
DLY: MOV R0,#107
DJNZ R0,$
DJNZ R1,DLY
       ――――――――――――
       然后拉高数据线
SETB DQ
NOP
NOP
NOP
       ――――――――――――
MOV R0,#25H
T2: JNB DQ ,T3        等待DS18B20回应
DJNZ R0, T2
JMP T4
       ――――――――――――
T3: SETB FLAG        置标志位,表示DS1820存在
JMP T5
       ――――――――――――
T4: CLR FLAG        清标志位,表示DS1820不存在
JMP T7
       ――――――――――――
T5: MOV R0,#117
T6: DJNZ R0,T6        时序要求延时一段时间
       ――――――――――――
T7: SETB DQ
RET
       ――――――――――――
WRITE_1820:        写入DS18B20(有具体的时序要求)
MOV R2,#8        一共8位数据
CLR C
WR1:
CLR DQ        总线低位,开始写入
MOV R3,#7
DJNZ R3,$        保持16微秒以上
RRC A        把字节DATA分成8个BIT环移给C
MOV DQ, C        写入一个BIT
MOV R3,#23
DJNZ R3,$        等待
SETB DQ        重新释放总线
NOP
DJNZ R2,WR1        写入下一个BIT
SETB DQ
RET
READ_1820:        将温度高位和低位从DS18B20中读出
MOV R4,#2        读出两个字节的数据
MOV R1,#29H        低位存入29H,高位存入28h
RE0:
MOV R2,#8        数据一共有8位
RE1:
CLR C
SETB DQ
NOP
NOP
CLR DQ        读前总线保持为低
NOP
NOP
NOP
SETB DQ        开始读总线释放
MOV R3,#9
RE2:
DJNZ R3,RE2        延时18微妙
MOV C, DQ        从总线读到一个BIT
MOV R3,#23
RE3:       
DJNZ R3,RE3        等待100秒
RRC A        把读得的位价值环移给A
DJNZ R2,RE1        读下一个BIT
MOV @R1,A
DEC R1
DJNZ R4,RE0
RET
TURN:
MOV A,29H
MOV C,40H        将28中的最低位移入C
RRC A
MOV C,41H
RRC A
MOV C,42H
RRC A
MOV C,43H
RRC A
MOV 29H,A
RET
DISPLAY:        将29H中的十六进制数成10进制
MOV A,29H
MOV B,#10        10进制/10=10进制
DIV AB
MOV B_BIT, A        十位在A
MOV A_BIT, B        个位在B
MOV DPTR,#TABLE        指定查表启始地址
MOV R0,#4
DP1:
MOV R1, #250        显示1000次
LOOP:
MOV A,A_BIT        取个位数
MOVC A,@A+DPTR        查个位数的7段代码
MOV P1,A        送出个位的7段代码
CLR P3.1        开个位显示
ACALL DELAY       
SETB P3.1
MOV A,B_BIT        取十位数
MOVC A,@A+DPTR        查十位数的7段代码
MOV P1,A        送出个十位的7段代码
CLR P3.0        开十位显示
ACALL DELAY        显示1MS
SETB P3.0
DJNZ R1,LOOP        250次没完循环
DJNZ R0,DP1        4个250次没完循环
RET
DELAY:        1ms延时
MOV R7, #80
DJNZ R7,$
RET
TABLE:        数码管共阳极0~9代码
DB 0C0H,0F9H,0A4H,0B0H,99H
DB 92H,82H,0F8H,80H,90H
END