單總線和I2C 總線結(jié)合實現(xiàn)數(shù)字溫度計實驗
一. 實驗?zāi)康?br>通過本實驗,理解掌握單總線器件和I2C總線器件的應(yīng)用,熟悉串行總線的操作
技巧。
二. 實驗設(shè)備及器件
IBM PC 機 一臺
DP-51PROC 單片機綜合仿真實驗儀 一臺
三. 實驗內(nèi)容
1. 編寫程序,通過單片機的P3.3 口控制一個DS18B20 完成數(shù)字溫度的采集,然后
用程序處理采集到的數(shù)據(jù)結(jié)果。
2. 編寫程序,通過I2C 總線器件ZLG7290 實現(xiàn)溫度數(shù)據(jù)的輸出顯示。
3. 結(jié)合以上兩部分程序,編程實現(xiàn)數(shù)字式溫度計的程序設(shè)計。
四. 實驗要求
熟練掌握單總線方式器件的應(yīng)用,熟悉I2C 總線協(xié)議,學(xué)習I2C 器件的使用方法。
五. 實驗步驟
1. 安裝B4 區(qū)JP12 接口上的短路帽,將B4 區(qū)的DQ 與A2 區(qū)INT1(P3.3)相連。
2. 安裝D5 區(qū)JP1 接口上的短路帽,將D5 區(qū)的SDA、SCL 分別與A2 區(qū)的P17、
P16 相連。
3. 將D5 區(qū)的RST_L 針接上高電平。
4. 運行編寫好的軟件程序,觀察D5 區(qū)數(shù)碼管顯示的溫度數(shù)據(jù)。然后改變DS18B20
的表面溫度,查看顯示的溫度數(shù)據(jù)是否有變化,并調(diào)整實驗程序使測量值更準確。
六. 實驗預(yù)習要求
認真學(xué)習本書2.8.10 節(jié)的實驗內(nèi)容和實驗原理,做好實驗前的準備工作。
七. 實驗參考程序
TEMPER_L EQU 36H ;存放讀出溫度低位數(shù)據(jù)
TEMPER_H EQU 35H ;存放讀出溫度高位數(shù)據(jù)
TEMPER_NUM EQU 37H ;存放轉(zhuǎn)換后的溫度值
FLAG1 BIT 00H
DQ BIT P3.3 ;單總線控制端口
SDA BIT P1.7 ;I2C 總線定義
SCL BIT P1.6
MTD EQU 40H ;發(fā)送數(shù)據(jù)緩沖器
MRD EQU 49H ;接收數(shù)據(jù)緩沖區(qū)
;定義器件地址,變量
ZLG7290 EQU 70H ;ZLG7290 的器件地址
ACK BIT 10H ;應(yīng)答標志位
SLA DATA 50H ;器件的從地址
SUBA DATA 51H ;器件的子地址
NUMBYTE DATA 52H ;讀/寫的字節(jié)數(shù)變量
ORG 8000H
LJMP MAIN
ORG 8100H
;溫度計主程序如下:
MAIN:
MOV SP,#70H
DISP_LOOP:
LCALL GET_TEMPER ;從DS18B20 讀出溫度數(shù)據(jù)
LCALL TEMPER_COV ;轉(zhuǎn)換讀出的溫度數(shù)據(jù)并保存
LCALL DELAY
MOV MTD,#60H
MOV MTD+1,TEMPER_NUM ;溫度值低位
ANL MTD+1,#0FH
MOV SLA,#ZLG7290 ;指定器件地址
MOV SUBA,#07H ;指定子地址
MOV NUMBYTE,#02H ;發(fā)送2 字節(jié)數(shù)據(jù)
LCALL IWRNBYTE ;調(diào)用寫2 字節(jié)數(shù)據(jù)程序
MOV MTD,#61H
MOV A,TEMPER_NUM
SWAP A
ANL A,#0FH
MOV MTD+1,A ;溫度值高位
MOV SLA,#ZLG7290 ;指定器件地址
MOV SUBA,#07H ;指定子地址
MOV NUMBYTE,#02H ;發(fā)送2 字節(jié)數(shù)據(jù)
LCALL IWRNBYTE ;調(diào)用寫2 字節(jié)數(shù)據(jù)程序
LCALL DELAY
SJMP DISP_LOOP ;溫度循環(huán)采集顯示
;讀出轉(zhuǎn)換后的溫度值
GET_TEMPER:
SETB DQ ;定時入口
BCD:
LCALL INIT_1820
JB FLAG1,S22
LJMP BCD ;若DS18B20 不存在則返回
S22:
LCALL DELAY1
MOV A,#0CCH ;跳過ROM 匹配------0CC
LCALL WRITE_1820
MOV A,#44H ;發(fā)出溫度轉(zhuǎn)換命令
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 ;發(fā)出讀溫度命令
LCALL WRITE_1820
LCALL READ_18200 ;READ_1820
RET
;讀DS18B20 的程序,從DS18B20 中讀出一個字節(jié)的數(shù)據(jù)
READ_1820:
MOV R2,#8 ;讀取一個字節(jié)
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 ;發(fā)送一個字節(jié)
CLR C
WR1820:
CLR DQ
MOV R3,#6 ;延時
DJNZ R3,$
RRC A
MOV DQ,C ;發(fā)送一個位
MOV R3,#23 ;延時
DJNZ R3,$
SETB DQ
NOP
DJNZ R2,WR1820
SETB DQ
RET
;讀DS18B20 的程序,從DS18B20 中讀出兩個字節(jié)的溫度數(shù)據(jù)
READ_18200:
;將溫度高位和低位從DS18B20 中讀出
MOV R4,#2
MOV R1,#36H
; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
RE00:
MOV R2,#8 ;讀取一個字節(jié)
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 中讀出的溫度數(shù)據(jù)進行轉(zhuǎn)換
TEMPER_COV:
MOV A,#0F0H
ANL A,TEMPER_L
; 舍去溫度低位中小數(shù)點后的四位溫度數(shù)值
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 ;保存變換后的溫度數(shù)據(jù)
LCALL BIN_BCD
RET
;將16 進制的溫度數(shù)據(jù)轉(zhuǎn)換成壓縮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 暫存存儲器設(shè)定值
RE_CONFIG:
JB FLAG1,RE_CONFIG1 ;若DS18B20 存在,轉(zhuǎn)RE_CONFIG1
RET
RE_CONFIG1:
MOV A,#0CCH ;發(fā)SKIP ROM 命令
LCALL WRITE_1820
MOV A,#4EH ;發(fā)寫暫存存儲器命令
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
$INCLUDE(VI2C_ASM.INC) ;包含VIIC 軟件包
;
END
八. 實驗思考題
參考圖如下電路圖,設(shè)計一個程序能夠?qū)崿F(xiàn)多路DS18B20數(shù)字溫度采集功能,并
能使溫度數(shù)據(jù)通過數(shù)碼管循環(huán)顯示。
評論
查看更多