⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds18b20.txt

📁 利用C51和DS18B20进行温度读取
💻 TXT
字号:
   

    TemL EQU 29H  ;温度的低8位
    TemH EQU 28H  ;温度的高8位
    FLAG bit 21H  ;是否检测到DS18B20标志位
    TEMPER_NUM  equ  38h
    DQ   EQU P3.7
    ORG  0000H  ;ClimberWin 2005.9.28
    AJMP  MAIN
    ;ORG  000BH
    ;AJMP   DINSHI
    ORG    0030H
                 ;主程序;
;;************************************
  main:                         ;***
       MOV   SP,#60H
       ACALL  DELAY2
       acall  RE_CONFIG ;重新写DS18B20暂存存储器设定 
       ;MOV    TMOD,#01H
       ;MOV    TH0,#0AFH
       ;MOV    TL0,#3CH
       MOV    A,#0ffH
       ;mov    4bh,#0fcH
       MOV    P1,A
       MOV    P3,A
       ;SETB   ET0
       ;SETB   TR0
       ;SETB   EA
  START:
        acall  RE_CONFIG 
       aCALL CLIMBER
       ACALL  bin_bcd1;数码转换
       ACALL   DISPLAY
       ;ACALL   KEY
       AJMP   START
   ;;;;;;;;;;
   ; 键盘子程序;
   ;;;;;;;;;;
key:
   ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;
;显示子程序
;;;;;;;;;;;;;;;;;;;;;
display:
    mov    r2,#04h
    mov    r3,#0feh
    mov    r0,#4ah
dislop:
    mov    a,r3
    mov    p3,a
    mov    a,@R0
    mov    dptr,#tab
    movc   a,@a+dptr
    mov    p1,a
    acall  delay2
    dec    r0
    mov    a,r3
    rl     a
    mov    r3,a
    djnz   r2,dislop
    ret
 delay2:
    mov   r4,#032h
 dellop:
    mov   r5,#064h
    djnz  r5,$
    djnz  r4,dellop
    ret

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;  中断子程序,读温度;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
 DINSHI: 
     push   acc
     push   psw
     CLR   tr0
     MOV    TH0,#0AFH
     MOV    TL0,#3CH 
     setb   tr0
     acall  RE_CONFIG
     CALL CLIMBER;调用读温度子程序;***
     ;ACALL  bin_bcd1;数码转换
     pop  psw
     pop  acc
     RETI                    ;***
;;************************************
              ;ds18b20初始化子程序*
;;*************************************
INIT:
     SETB DQ
     NOP
     CLR DQ
     MOV R7,#34 ;延时510ms
     CALL DELAY
     SETB DQ
     MOV R7,#04  ;延时60ms
     CALL DELAY
     CLR FLAG
     JB DQ,BACK
     SETB FLAG
     MOV R7,#28  ;延时420ms
     CALL DELAY
     SETB DQ     ;然后拉高数据线
BACK:
      RET
;********************************************
  ;重新写DS18B20暂存存储器设定值;
  ;使用资源
;;*************************************
RE_CONFIG:
    SETB DQ
    CALL INIT     
    JB  flag, RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
    RET
RE_CONFIG1:
   MOV A,0CCH ; 发SKIP ROM命令
   call Write
   MOV A,4EH ; 发写暂存存储器命令
   call Write
   MOV A,00H ; TH(报警上限)中写入00H
   call Write
   MOV A,00H ; TL(报警下限)中写入00H
   call Write
    MOV A,#07FH ; 选择12位温度分辨率
    call Write
RET
;********************************************
            ;读出转换后的温度值;
;;*************************************
CLIMBER:
       SETB   RS1  ; 改变寄存器位置
       SETB DQ
       CALL INIT     ;先复位DS18B20
       JB FLAG,TSS2
       RET           ;判断DS1820是否存在?若DS18B20不存在则返回
TSS2:
       MOV A,#0CCH   ;跳过ROM匹配
       CALL WRITE
       MOV A,#44H    ;发出温度转换命令
       CALL WRITE
       MOV  R7,#50   ;延时750ms转换时间
       CALL DELAY
       CALL INIT     ;准备读温度前先复位
       MOV A,#0CCH   ;跳过ROM匹配
       CALL WRITE
       MOV A,#0BEH   ;发出读温度命令
       CALL WRITE
       CALL READ
       RET
;;*******************************************************
               ;写DS18B20的子程序(注意时序);
	       ;使用资源C,R7、R2
;;*******************************************************
WRITE:
        CLR C
        MOV R2,#8     ;一共8位数据
WR1:
        CLR DQ
        MOV R7,#1
        CALL DELAY
        RRC A
        MOV DQ,C
        MOV R7,#1
        CALL DELAY
        SETB DQ
        NOP
        DJNZ R2,WR1
        SETB DQ
        RET
;;*********************************************************
                  ;读DS18B20的程序;
;;*********************************************************
READ:
     MOV R4,#2   ;将温度高位和低位从DS18B20中读出
     MOV R1,#29H ;低位存入29H(TemL),高位存入28H(TemH)
WIN00:
     MOV R2,#8   ;数据一共有8位
WIN01:
     CLR C
     SETB DQ
     NOP
     NOP
     CLR DQ
     NOP
     NOP
     NOP
     SETB DQ
     MOV R7,#01
     CALL DELAY
     MOV C,DQ
     MOV R7,#03
     CALL DELAY
     RRC A
     DJNZ R2,WIN01
     MOV @R1,A
     DEC R1
     DJNZ R4,WIN00
     RET
;*******************************************
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY: MOV R6,#06H                 ;;;;
D1:    DJNZ R6,D1    ;延时=R7*15ms ;;;;
       DJNZ R7,DELAY               ;;;;
       RET                         ;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;//*****************************************//

; 将从DS18B20中读出的温度数据进行转换
;//*****************************************//

bin_bcd1:
   mov  47h,#00h
   MOV   A,TEMH
   JB   ACC.7,FUTEMR
   MOV   A,TEMH
   MOV   R4,A
   MOV   A,TEML
   MOV   R5,A
 zhuhuan: 
   MOV   R7,#10H
   ACALL   ZH
   MOV    A,46H
   MOV    B,#64H
   DIV    AB
   MOV    48H,A
   MOV    A,B
   MOV    B,#0AH
   DIV    AB
   MOV    49H,A
   MOV    4AH,B
   mov    a,47h
   jz     zhen
   ajmp  bfh
   zhen:
    mov    47h,#0eh 
    bfh:
   RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;多字节BCD码取补
;入口条件:字节数在R7中,操作数在[R0]中。
;出口信息:结果仍在[R0]中。            ;;;
;影响资源:PSW、A、R2、R3 堆栈需求: 2字节;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 FUTEMR:   
   MOV  B,TEMH
   MOV  A,#0FFH
   SUBB  A,B
   MOV   R4,A
   MOV  B,TEML
   MOV  A,#0FFH
   SUBB  A,B
   MOV   R5,A
   MOV   A,R5
   add   A,#01h
   MOV  R5,A
   MOV  A,R4
   ADDC A,#00H
   MOV  R4,A
   mov  47h,#0fh
   ljmp  zhuhuan
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;入口条件:被除数在R4、R5中,除数在R7中。
;出口信息:OV=0 时,单字节商在R3中,OV=1 时溢出。
;影响资源:PSW、A、R3~R7 堆栈需求: 2字节
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ZH:
      CLR C
      MOV A,R4
      SUBB A,R7
      JC DV50
      SETB OV ; ;商溢出
      RET
DV50: MOV R6,#8; ;求平均值(R4R5/R7-→R3)
DV51: MOV A,R5
      RLC A
      MOV R5,A
      MOV A,R4
      RLC A
      MOV R4,A
      MOV F0,C
      CLR C
      SUBB A,R7
      ANL C,/F0
      JC DV52
      MOV R4,A
DV52: CPL C
     MOV A,R3
     RLC A
     MOV R3,A
     DJNZ R6,DV51
     MOV A,R4 ;;四舍五入
     ADD A,R4
     JC DV53
     SUBB A,R7
     JC DV54
DV53: INC R3
DV54: CLR OV
      MOV 46H,R3                  
      RET 

tab:
   db  0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h  ;;不带小数点十六进制数字0--7对应的编码
   db  80h,90h,88h,83h,0c6h,0a1h,0ffh,0bfh     ;;不带小数点十六进制数字8--F对应的编码
   
   




END


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -