数字温度传感器实验
一. 实验目的
熟悉数字温度传感器DS18B20 的使用方法和工作原理,了解单总线的读写控制方法。
二. 实验设备及器件
IBM PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
温度计 一个
三. 实验内容
1. 编写程序,通过单片机的P3.3 口对DS18B20 进行操作,实现数字温度的采集。
2. 记录采集到的温度数据,分析实验结果是否正确。
四. 实验要求
熟悉单总线方式的工作原理及应用,初步了解温度传感器的使用技巧。
五. 实验步骤
1. 安装B4 区JP12 接口上的短路帽,将B4 区的DQ 针与A2 区的INT1(P3.3)相
连。
2. 运行编写好的软件程序,完成多次温度采集并记录采集到的温度数据。
3. 使用温度计测量环境的实际温度与实验数据相比较,判断采集数据的准确度。
六. 实验预习要求
结合本实验的温度采集程序设计基础,认真阅读本书2.8.10 节的实验内容和
DS18B20的数据手册,完成温度采集显示的综合实验。
七. 实验参考程序
TEMPER_L EQU 36H ;存放读出温度低位数据
TEMPER_H EQU 35H ;存放读出温度高位数据
TEMPER_NUM EQU 60H ;存放转换后的温度值
FLAG1 BIT 00H
DQ BIT P3.3 ;一线总线控制端口
ORG 8000H
LJMP MAIN
ORG 8100H
MAIN:
MOV SP,#70H
LCALL GET_TEMPER ;从DS18B20 读出温度数据
LCALL TEMPER_COV ;转换读出的温度数据并保存
SJMP $ ;完成一次数字温度采集
;以下为DS18B20 单总线操作子程序
;读出转换后的温度值
GET_TEMPER:
SETB DQ ;定时入口
BCD:
LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ;若DS18B20 不存在则返回
S22:
LCALL DELAY1
MOV A,#0CCH ;跳过ROM 匹配0CCH
LCALL WRITE_1820
MOV A,#44H ;发出温度转换命令
LCALL WRITE_1820
NOP
LCALL DELAY
LCALL DELAY
CBA:
LCALL INIT_1820
JB FLAG1,ABC
LJMP CBA
ABC:
LCALL DELAY1
MOV A,#0CCH ;跳过ROM 匹配
LCALL WRITE_1820
MOV A,#0BEH ;发出读温度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;读DS18B20 的程序,从DS18B20 中读出一个字节的数据
READ_1820:
MOV R2,#8 ;读取8 个位,一个字节
RE1:
CLR C
SETB DQ
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,RE1
RET
;写DS18B20 的程序
WRITE_1820:
MOV R2,#8 ;读取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
;读DS18B20 的程序,从DS18B20 中读出两个字节的温度数据
READ_18200:
MOV R4,#2 ;将温度高低位从DS18B20 中读出
MOV R1,#36H
;低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8 ;读取8 个位,一个字节
RE01:
CLR C
SETB DQ
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
;将从DS18B20 中读出的温度数据进行转换
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L ;舍去温度低位中小数点后的四位温度
数值
SWAP A
MOV TEMPER_NUM,A
MOV A,TEMPER_L
JNB ACC.3,TEMPER_COV1 ;四舍五入温度值
INC TEMPER_NUM
TEMPER_COV1:
MOV A,TEMPER_H
ANL A,#07H
SWAP A
ADD A,TEMPER_NUM
MOV TEMPER_NUM,A ;保存变换后的温度数据
LCALL BIN_BCD
RET
;将16 进制的温度数据转换成压缩BCD 码
BIN_BCD:
MOV DPTR,#TEMP_TAB
MOV A,TEMPER_NUM
MOVC A,@A+DPTR
MOV TEMPER_NUM,A
RET
TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H
;DS18B20 初始化程序
INIT_1820:
SETB DQ
NOP
CLR DQ
MOV R0,#80H
TSR1:
DJNZ R0,TSR1 ;延时
SETB DQ
MOV R0,#25H ;96US
TSR2:
DJNZ R0,TSR2
JNB DQ,TSR3
LJMP TSR4 ;延时
TSR3:
SETB FLAG1 ;置标志位,表示DS1820 存在
LJMP TSR5
TSR4:
CLR FLAG1 ;清标志位,表示DS1820 不存在
LJMP TSR7
TSR5:
MOV R0,#06BH ;200US
TSR6:
DJNZ R0,TSR6 ;延时
TSR7:
SETB DQ
RET
;重新写DS18B20 暂存存储器设定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ;若DS18B20 存在,转RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ;发SKIP ROM 命令
LCALL WRITE_1820
MOV A,#4EH ;发写暂存存储器命令
LCALL WRITE_1820
MOV A,#00H ;TH(报警上限)中写入00H
LCALL WRITE_1820
MOV A,#00H ;TL(报警下限)中写入00H
LCALL WRITE_1820
MOV A,#7FH ;选择12 位温度分辨率
LCALL WRITE_1820
RET
;延时子程序
DELAY:
MOV R7,#00H
MIN:
DJNZ R7,YS500
RET
YS500:
LCALL YS500US
LJMP MIN
YS500US:
MOV R6,#00H
DJNZ R6,$
RET
DELAY1:
MOV R7,#20H
DJNZ R7,$
RET
;
END
八. 实验思考题
设计一个单总线工作方式下,采用多个DS18B20 实现多路数字温度采集的实验
程序,完成多个点的温度采集。
评论
查看更多