DS18B20与单片机应用
2012年01月19日
;DS18B20温度传感器和7个LED数码显示程序(原创程序,请支持)
;版权归Luiing所有,转载请说明出处
ORG 0000H
;LED数码管采用动态,P0口接八个数据口,P2.0-P2.2采用3-8译码器控制七个LED
TX BIT P2.3 ;DS18B20数据口接P2.3
FLAG BIT 10H
TEMH EQU 50H ;整数部分
TEML EQU 51H ;小数部分
MOV SP,#60H
CLR EA
AJMP MAIN
ORG 0200H
MAIN:
;MOV R0,#10
LCALL TMP;温度传感器设置
LCALL CHANG;温度转换为十进制
STR:LCALL DISPLAY;温度显示
;DJNZ R0,STR
AJMP MAIN
;//////////////////////////
TMP:;温度传感器DS18B20
LCALL RESERT
MOV A,#0CCH
LCALL WRITE
MOV A,#44H
LCALL WRITE
;LCALL DELAY750;延时750Ms
LCALL RESERT
MOV A,#0CCH
LCALL WRITE
MOV A,#0BEH
LCALL WRITE
LCALL READ
MOV 30H,A
LCALL READ
MOV 31H,A
RET
DELAY750:;750USDELAY
SETB RS0
MOV R0,#20
MS2:MOV R1,#20
MS1:MOV R2,#20
DJNZ R2,$
DJNZ R1,MS1
DJNZ R0,MS2
CLR RS0
RET
;////////////////////////////
CHANG:;温度转换为十进制
PUSH A
PUSH B
MOV A,31H
ANL A,#07H
SWAP A
MOV B,A
MOV A,30H
ANL A,#0F0H
SWAP A
ADD A,B MOV TEMH,A MOV A,30H ANL A,#0FH MOV TEML,A MOV A,31H JNB ACC.3,POSI;区分正负温度
;//////////////负温度转化
MOV A,TEML
SWAP A
CPL A
ANL A,#0F0H
ADD A,#10H
SWAP A
MOV 1FH,C
MOV TEML,A
MOV A,TEMH
CPL A
SUBB A,#80H
MOV C,1FH
ADDC A,#0
MOV 70H,#20
AJMP NEG
POSI:
MOV A,TEMH
MOV B,#100
DIV AB
MOV 70H,A
MOV A,B
NEG:
MOV B,#10
DIV AB
MOV 71H,A
MOV A,B
ADD A,#10
MOV 72H,A
;整数部分分离
MOV A,TEML
MOV B,#5
MUL AB
MOV B,#10
DIV AB
MOV 76H,B
MOV 75H,A
MOV A,TEML
MOV B,#2
MUL AB
ADD A,75H
MOV B,#10
DIV AB
MOV 75H,B
MOV 74H,A
MOV A,TEML
MOV B,#6
MUL AB
ADDC A,74H
MOV B,#10
DIV AB
MOV 74H,B
MOV 73H,A
;小数部分分离
POP B
POP A
RET
;//////////////////////
DISPLAY: ;温度显示 70H---76H XXX.XXXX
;采用默认的12位,精度0.0625,-55~~+125
SETB RS0
MOV R0,#70H
MOV R1,#7
MOV R2,#0
MOV DPTR,#TABLE
DIS:
MOV A,@R0
MOVC A,@A+DPTR
MOV P2,R2
MOV P0,A
INC R2
INC R0
LCALL DELAY1MS
DJNZ R1,DIS
CLR RS0
RET
;/////////////////////////
DELAY1MS:
SETB RS1
MOV R0,#100
MS:MOV R1,#20
DJNZ R1,$
DJNZ R0,MS
CLR RS1
RET
;////////////////////
RESERT:;DS18B20初始化
;SETB RS0
SETB TX
NOP
CLR TX
MOV R0,#240
;RST:CLR TX
DJNZ R0,$;DELAY480US
SETB TX
MOV R1,#30;DELAY 60US
DJNZ R1,$
JNB TX,RE1
CLR FLAG
SETB TX
RET
RE1:SETB FLAG
MOV R2,#200
DJNZ R2,$ ;DELAY 400us
SETB TX
RET
;///////////
WRITE:;DS18B20写字节
;SETB RS0
CLR C
MOV R0,#8
WW:
MOV R1,#6
MOV R2,#23
RRC A
CLR TX
DJNZ R1,$;DELAY 12US
MOV TX,C
DJNZ R2,$;DELAY 46US SETB TX NOP DJNZ R0,WW SETB TX ;CLR RS0 RET ;/////////// READ:;DS18B20读字节
;SETB RS0
CLR C
MOV R0,#8;八位
RE:
SETB TX
MOV R1,#10;延时20us
MOV R2,#15 ;延时30us
CLR TX
NOP
SETB TX;此句最重要,读取数据的时候一定要释放总线,否则读不出暂存器数据
DJNZ R1,$
MOV C,TX
DJNZ R2,$
RRC A
DJNZ R0,RE
SETB TX
;CLR RS0
RET
;//////////////
TABLE:
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;0-9 需要加点应用ADD 80H即可
DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H,0FFH,0EFH;0. -9.
DB 40H ;-
END