數字溫度傳感器實驗
一. 實驗目的
熟悉數字溫度傳感器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 實現多路數字溫度采集的實驗
程序,完成多個點的溫度采集。
評論
查看更多