利用寄生電容的方法不會用 就想到了這個方法 方法很簡單 加入二極管和電容就可以(如圖) 不開強推電壓在2.4V左右 18B20也能工 開強推后電壓在3.7V左右 我不知道我用的二芯電線多長 耗電小壓降應該沒多少
讀取溫度前把IO設置成普通模式 讀取后設置成強推 快速給電容充電
制作出來的實物圖如下:
51hei截圖20200628100336.jpg (142.66 KB, 下載次數: 91)
下載附件
2020-6-28 10:04 上傳
51hei截圖20200628100350.jpg (46.1 KB, 下載次數: 71)
下載附件
2020-6-28 10:04 上傳
電路原理圖如下:
51hei截圖20200628094249.jpg (12.31 KB, 下載次數: 76)
下載附件
2020-6-28 09:51 上傳
我用的單片機是STC12C5A60S2 晶振12M 其它單片機未測試 估計也沒什么問題
P3M1 EQU 0B1H
P3M0 EQU 0B2H
DQ BIT P3.5; 18b20
TEMPL DATA 26H
TEMPH DATA 27H
TEMPHC DATA 2AH
TEMPLC DATA 2BH
TEMP_ZH DATA 2CH
FLAG EQU 6EH ;溫度標志位
MAIN: MOV P3M1,#00000000B; 全普通
MOV P3M0,#00000000B; 全普通
LCALL RE_TEMP ; 讀溫度
MOV P3M1,#00000000B; P3.5強推 其余普通
MOV P3M0,#00100000B; P3.5強推 其余普通
LCALL CONVER ; 處理溫度
LCALL DISPBCD ; BCD 碼溫度值
LCALL DISPLAY_INT ; 顯示溫度 LJMP MAIN
;***************************************************************
;溫度讀取
;************************************************************ ***
RE_TEMP:
SETB DQ
ACALL INIT_18B20
JB FLAG, ST
RET
ST:
MOV A, #0CCH
ACALL WRITE_18B20
MOV A, #44H
ACALL WRITE_18B20
ACALL INIT_18B20
MOV A, #0CCH
ACALL WRITE_18B20
MOV A, #0BEH
ACALL WRITE_18B20
ACALL READ_18B20
RET
;***************************************************************
;寫DS18B20
;***************************************************************
WRITE_18B20:
MOV R2, #8
CLR C
WR1: CLR DQ
MOV R6,#01H ; DELAY2US: ;誤差 0us
DL4: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL4
RRC A
MOV DQ, C
MOV R6,#33H ;DELAY60US: ;誤差 0us
DL5: MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL5
SETB DQ
MOV R6,#01H; DELAY2US: ;誤差 0us
DL6: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL6
DJNZ R2, WR1
SETB DQ
RET
;***************************************************************
;初始化DS18B20
;***************************************************************
INIT_18B20:
SETB DQ
MOV R6,#01H;DELAY2US: ;誤差 0us
DL1: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL1
CLR DQ
MOV R6,#6FH; DELAY500US: ;誤差 0us
DL2: MOV R5,#0CH
DJNZ R5,$
DJNZ R6,DL2
SETB DQ
MOV R6,#33H;DELAY60US: ;誤差 0us
DL3: MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL3
NOP;
MOV R0, #25H
T2: JNB DQ, T3
DJNZ R0, T2
JMP T4
T3: SETB FLAG
JMP T5
T4: CLR FLAG
JMP T7
T5: MOV R0, #117
T6: DJNZ R0, T6
T7: SETB DQ
MOV R6,#6FH; DELAY500US: ;誤差 0us
DL11: MOV R5,#0CH
DJNZ R5,$
DJNZ R6,DL11
RET
;***************************************************************
;讀DS18B20
;***************************************************************
;從DS18B20中讀出溫度低位、高位和報警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ_18B20:
MOV R4,#4 ; 將溫度高位和低位從DS18B20中讀出
MOV R1,#26H ; 存入26H、27H、28H、29H
RE00: MOV R2,#8
RE01: CLR C
; SETB DQ
; MOV R6,#01H; DELAY2US: ;誤差 0us
;DL10: MOV R5,#03H
; DJNZ R5,$
; DJNZ R6,DL10
CLR DQ ;讀前總線保持為低
MOV R6,#01H; DELAY2US: ;誤差 0us
DL7: MOV R5,#03H
DJNZ R5,$
DJNZ R6,DL7
SETB DQ ;開始讀總線釋放
MOV R6,#03H;DELAY10US: ;誤差 0us
DL8: MOV R5,#08H
DJNZ R5,$
DJNZ R6,DL8
MOV C,DQ ;從DS18B20總線讀得一個BIT
MOV R6,#33H;DELAY60US: ;誤差 0us
DL9: MOV R5,#02H
DJNZ R5,$
DJNZ R6,DL9
RRC A ;把讀得的位值環移給A
DJNZ R2,RE01 ;讀下一個BIT
MOV @R1,A
INC R1
DJNZ R4,RE00
RET
;***************************************************************
;溫度轉換
;***************************************************************
CONVER:
; 處理溫度 BCD 碼子程序
;****************************************************
CONVTEMP: MOV A,TEMPH ;判溫度是否零下
ANL A,#80H
JZ TEMPC1 ;溫度零上轉
CLR C
MOV A,TEMPL ;二進制數求補(雙字節)
CPL A ;取反加1
ADD A,#01H
MOV TEMPL,A
MOV A,TEMPH ;-
CPL A
ADDC A,#00H
MOV TEMPH,A ;TEMPHC HI =符號位
MOV TEMPHC,#0BH
SJMP TEMPC11
TEMPC1: MOV TEMPHC,#0AH ;
TEMPC11: MOV A,TEMPHC
SWAP A
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH ;乘0.0625
MOV DPTR,#TEMPDOTTAB
MOVC A,@A+DPTR
MOV TEMPLC,A ;TEMPLC LOW=小數部分 BCD
MOV A,TEMPL ;整數部分
ANL A,#0F0H
SWAP A
MOV TEMPL,A
MOV A,TEMPH
ANL A,#0FH
SWAP A
ORL A,TEMPL
MOV TEMP_ZH,A ;組合后的值存入TEMP_ZH
LCALL HEX2BCD1
MOV TEMPL,A
ANL A,#0F0H
SWAP A
ORL A,TEMPHC ;TEMPHC LOW = 十位數 BCD
MOV TEMPHC,A
MOV A,TEMPL
ANL A,#0FH
SWAP A ;TEMPLC HI = 個位數 BCD
ORL A,TEMPLC
MOV TEMPLC,A
MOV A,R7
JZ TEMPC12
ANL A,#0FH
SWAP A
MOV R7,A
MOV A,TEMPHC ;TEMPHC HI = 百位數 BCD
ANL A,#0FH
ORL A,R7
MOV TEMPHC,A
TEMPC12: RET
;===========================================================
;顯示區 BCD 碼溫度值刷新子程序
;===========================================================
DISPBCD: MOV A,TEMPLC
ANL A,#0FH
MOV 70H,A ;小數位
MOV A,TEMPLC
SWAP A
ANL A,#0FH
MOV 71H,A ;個位
MOV A,TEMPHC
ANL A,#0FH
MOV 72H,A ;十位
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,A ;百位
MOV A,TEMPHC
ANL A,#0F0H
CJNE A,#010H,DISPBCD0
SJMP DISPBCD2
;========================================
DISPBCD0: MOV A,TEMPHC
ANL A,#0FH
JNZ DISPBCD2 ;十位數是0
MOV A,TEMPHC
SWAP A
ANL A,#0FH
MOV 73H,#0AH ;符號位不顯示
MOV 72H,A ;十位數顯示符號
DISPBCD2: RET
;***************************************************************
;顯示溫度整數部分
;***************************************************************
DISPLAY_INT:
;百位
MOV A,73H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.4
CALL XSYS
SETB P1.4;
;十位
DIST: MOV A,72H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.5
CALL XSYS
SETB P1.5;
;個位
DISY: MOV A,71H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.6
CLR P0.7
CALL XSYS
SETB P0.7;
SETB P1.6;
;小數
MOV A,70H;
MOV DPTR, #TAB
MOVC A,@A+DPTR
MOV P0,A;
CLR P1.7
CALL XSYS
SETB P1.7;
RET
;===================================================================
DELAY10MS: ;@11.0592MHz
NOP
NOP
NOP
MOV R0,#87
MOV R1,#10
NEXT:
DJNZ R1,NEXT
DJNZ R0,NEXT
RET
;顯示延時
XSYS:
DELAY200US: ;誤差 0us
MOV R6,#0ABH
DLA:
MOV R5,#02H
DJNZ R5,$
DJNZ R6,DLA
RET
;***************************************************************
;單字節十六進制轉 BCD
;******************************************************
HEX2BCD1: MOV B,#064H
DIV AB
MOV R7,A
MOV A,#0AH
XCH A,B
DIV AB
SWAP A
ORL A,B
RET
;***************************************************************
; 數據查表
;***************************************************************
TAB: DB 0C0h,0F9h,0A4h,0B0h,99h,92h,82h,0F8h,80h,90h,0FFH,0BFH; ;共陽
; 0 1 2 3 4 5 6 7 8 9 空 -
; 小數部分碼表
;-----------------------------------------------------------
TEMPDOTTAB: DB 00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
DB 06H,07H,08H,08H,09H,09H
;====================================================
END
|