利用寄生电容的方法不会用 就想到了这个方法 方法很简单 加入二极管和电容就可以(如图) 不开强推电压在2.4V左右 18B20也能工 开强推后电压在3.7V左右 我不知道我用的二芯电线多长 耗电小压降应该没多少
读取温度前把IO设置成普通模式 读取后设置成强推 快速给电容充电
制作出来的实物图如下:
电路原理图如下:
我用的单片机是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
|