一、實驗要求
(1)握碼管的使用方式
(2)掌握DS18B20溫度傳感器的工作原理
(3)掌握單總線通信方式實現 MCU與DS18B20數據傳輸
二、設計思路
1.整體思路
? 通過編寫數碼管顯示程序和單總線溫度采集程序,結合溫度傳感報警,利用手指觸碰傳感器,當溫度超過閾值時開啟蜂鳴器報警。
2.流程圖
3.主要模塊設計思路及分析
(1)判斷溫度是否達到閾值
(2)蜂鳴器子程序
三、?實現效果
室溫時顯示26度
當升溫至30度則會報警
四、總結
在這次實驗中,我學習了如何通過DS18B20溫度傳感器來采集和顯示溫度。我了解到,DS18B20是一種常用的數字溫度傳感器,它可以通過單總線通信方式與MCU進行數據傳輸。這種方式相比于傳統的模擬溫度傳感器,具有更高的精度和可靠性。
在實驗過程中,我遇到了一些困難,例如如何正確地連接編碼器和DS18B20傳感器,以及如何編寫相應的程序來讀取和顯示溫度。最開始當達到設置的閾值時,蜂鳴器不會報警響應,在詢問同學后我添加了一個DEL子程序來控制蜂鳴子程序的響應。
附錄:
DAT BIT P3.7 ;定義DQ線
swpH EQU 0D2H
swpL EQU 0EFH
WDLSB DATA 30H ;定義溫度低字節
WDMSB DATA 31H ;定義溫度高字節
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0_INT
ORG 0100HVALUE: DB 3FH, 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ;共陰極
T0_INT: MOV TH0, #swpHMOV TL0, #swpLPUSH ACC ;A進棧保護LCALL ALARM ;判斷是否達到溫度閾值JB 21H,dsl ;判斷輸出溫度高位還是低位MOV R1,42H ;高位溫度放至R1MOV DPTR, #100HLCALL LOOP2 ;循環,使DPTR變為相應溫度位的值,再通過查表形式獲得對應溫度段碼MOV A, #0HMOVC A, @A+DPTRMOV P0, A ;將高位溫度傳至P0MOV P2, #1CHPOP ACC ;出棧ACC完成對ACC的保護SJMP kkk
dsl:MOV R1,43H ;低位溫度放至R1MOV DPTR, #100HLCALL LOOP2MOV A, #0HMOVC A, @A+DPTRMOV P0, A ;低位溫度傳至R2MOV P2, #18HPOP ACC
LOOP2: ;將DPTR變至響應溫度的值DEC R1INC DPTRCJNE R1, #0FFH, LOOP2 RET
kkk:CPL 21H ;21H取反RETI ;中斷返回
MAIN:CLR EA ;關中斷MOV TMOD,#01H ;設置T0初始化MOV TH0,#swpH ;裝入定時器10ms中斷的定時常數MOV TL0,#swpL ;SETB EA ;開中斷SETB ET0 ;允許定時器T0中斷SETB TR0 ;啟動定時器T0計數MOV R2,#2 ;MOV R0,#42H ;2個顯示緩沖單元42H和43H清0
OVER: MOV @R0,#00H INC R0 ;指針R0指向43HDJNZ R2,OVER
LOOP: LCALL DSWD ;調用讀出溫度子程序SJMP LOOP
DSWD:LCALL RSTSNR ;調用復位子程序JNB F0,KEND ;未應答則跳轉KENDMOV R0,#0CCH ;跳過ROM匹配指令LCALL SEND_BYTE ;發送一字節跳過ROM匹配命令MOV R0,#44H ;溫度轉換命令LCALL SEND_BYTE ;發送一字節溫度轉換指令SETB EAMOV 48H,#1 ;延時75ms以上準備讀
SS2:MOV 49H,#255
SS1:MOV 4AH,#255
SS0:DJNZ 4AH,SS0 DJNZ 49H,SS1DJNZ 48H,SS2CLR EALCALL RSTSNRJNB F0,KENDMOV R0,#0CCH ;跳過ROM匹配命令LCALL SEND_BYTEMOV R0,#0BEH ;溫度命令BEHLCALL SEND_BYTE ;發出一字節讀溫度命令LCALL READ_BYTE ;讀一字節的溫度值MOV WDLSB,A ;讀一字節的溫度值(低字節)LCALL READ_BYTE ;讀一字節的溫度值MOV WDMSB,A ;讀一字節的溫度值(高字節)LCALL TRANS12 ;調用溫度轉換子程序
KEND:SETB EARET
TRANS12: MOV A,30H ;溫度轉換子程序ANL A,#0F0HMOV 3AH,AMOV A,31HANL A,#0FHORL A,3AHSWAP AMOV B,#10DIV ABMOV 43H,BMOV B,#10DIV ABMOV 42H,BMOV 41H,ARETSEND_BYTE:MOV A,R0 ;發送一個字節的子程序MOV R5,#8
SEN3:CLR CRRC AJC SEN1LCALL WRITE_0SJMP SEN2
SEN1:LCALL WRITE_1
SEN2:DJNZ R5,SEN3 ;循環八次發送一個字節 RETREAD_BYTE:MOV R5,#8 ;讀一個字節的子程序
READ1:LCALL READRRC ADJNZ R5,READ1 ;循環八次讀一個字節MOV R0,ARET
RSTSNR:SETB DAT ;復位程序NOPNOPCLR DATMOV R6,#250 DJNZ R6,$MOV R6,#50DJNZ R6,$SETB DAT ;主機釋放總線,IO口改為輸入MOV R6,#15DJNZ R6,$CALL CHCK ;調用應答子程序MOV R6,#60DJNZ R6,$SETB DATRET
CHCK:MOV C,DATJC RST0SETB F0 ;檢測到信號置為F0SJMP CHCK0
RST0:CLR F0
CHCK0:RET
WRITE_0:CLR DAT ;寫0子程序MOV R6,#30DJNZ R6,$SETB DATRET
WRITE_1: ;寫1子程序CLR DATNOPNOPNOPNOPNOPSETB DATMOV R6,#30DJNZ R6,$RETREAD: ;讀一位數據子程序SETB DATNOPNOPCLR DATNOPNOPSETB DAT ;置位DAT準備接收數據NOPNOPNOPNOPNOPNOPNOPMOV C,DATMOV R6,#23DJNZ R6,$RETALARM: ;判斷溫度是否達到閾值,設置溫度閾值為30MOV A, 43HSUBB A, #00HMOV A, 42HSUBB A, #03H JNC BUZZER CLR CRETBUZZER: ;蜂鳴器響應子程序MOV R1,#0FFHCPL P2.5LCALL DELRET