当前位置: 代码迷 >> 单片机 >> DS18B20与单片机运用
  详细解决方案

DS18B20与单片机运用

热度:79   发布时间:2016-04-28 15:50:06.0
DS18B20与单片机应用

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