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

📄 bs18b20应用程序.txt

📁 DS18B20数字温度传感器的使用说明及应用程序
💻 TXT
字号:
TEMPER_L   EQU 36H
TEMPER_H   EQU 35H
TEMPER_NUM EQU 60H
FLAG1      BIT 00H
DQ         BIT P3.3 
RS         EQU P3.7            ;RS <---->P2.0
RW         EQU P3.6            ;R/W <--->P2.1
E          EQU P3.5            ;E <----->P2.2
LCD_DB     EQU P1 
            
AAA:MOV   SP,#70H
    LCALL GET_TEMPER
    LCALL TEMPER_COV
    LCALL DISPLAY;调用显示子程序

    LJMP AAA
   NOP

;/////读出转换后的温度值
GET_TEMPER:
           SETB DQ ; 定时入口
       BCD:LCALL INIT_1820
           JB FLAG1,S22
           LJMP CC ; 若DS18B20不存在则返回

       S22:LCALL DELAY1
           MOV A,#0CCH ; 跳过ROM匹配------0CC
           LCALL WRITE_1820
           MOV A,#44H ; 发出温度转换命令
           LCALL WRITE_1820
           NOP
           LCALL DELAY
           LCALL DELAY
       CBA:LCALL INIT_1820
           JB FLAG1,ABC
           LJMP CBA
       ABC:LCALL DELAY1
           MOV A,#0CCH ; 跳过ROM匹配
           LCALL WRITE_1820
           MOV A,#0BEH ; 发出读温度命令
           LCALL WRITE_1820
           LCALL READ_18200         ;READ_1820
           RET

;/////读DS18B20的程序,从DS18B20中读出一个字节的数据
READ_1820:
          MOV R2,#8
      RE1:
         CLR C
         SETB DQ
         NOP
         NOP
         CLR DQ
         NOP
         NOP
         NOP
         SETB DQ
         MOV  R3,#7
         DJNZ R3,$
         MOV C,DQ
         MOV R3,#23
         DJNZ R3,$
         RRC A
         DJNZ R2,RE1
         RET

;/////写DS18B20的程序
WRITE_1820:
          MOV R2,#8
          CLR C
      WR1:
         CLR DQ
         MOV R3,#6
         DJNZ R3,$
         RRC A
         MOV DQ,C
         MOV R3,#23
         DJNZ R3,$
         SETB DQ
         NOP
         DJNZ R2,WR1
         SETB DQ
         RET

;/////读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
          MOV R4,#2      ; 将温度高位和低位从DS18B20中读出
          MOV R1,#36H    ; 低位存入36H(TEMPER_L),高位存入35H(TEMPER_H)
     RE00:
          MOV R2,#8
     RE01:
          CLR C
          SETB DQ
          NOP
          NOP
          CLR DQ
          NOP
          NOP
          NOP
          SETB DQ
          MOV  R3,#7
          DJNZ R3,$
          MOV  C,DQ
          MOV  R3,#23
          DJNZ R3,$
          RRC  A
          DJNZ R2,RE01
          MOV @R1,A
          DEC R1
          DJNZ R4,RE00
          RET

;/////将从DS18B20中读出的温度数据进行转换
TEMPER_COV:
          MOV  A,#0F0H
          ANL  A,TEMPER_L        ; 舍去温度低位中小数点后的四位温度数值
          SWAP A
          MOV  TEMPER_NUM,A
          MOV  A,TEMPER_L
          JNB  ACC.3,TEMPER_COV1 ; 四舍五入去温度值
          INC TEMPER_NUM

TEMPER_COV1:
           MOV  A,TEMPER_H
           ANL  A,#07H
           SWAP A
           ORL  A,TEMPER_NUM
           MOV TEMPER_NUM,A ; 保存变换后的温度数据
           LCALL BIN_BCD
           RET

;/////将16进制的温度数据转换成压缩BCD码
BIN_BCD:
        MOV DPTR,#TEMP_TAB
        MOV A,TEMPER_NUM
        MOVC A,@A+DPTR
        MOV TEMPER_NUM,A
        RET

TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H

;/////DS18B20初始化程序
INIT_1820:
          SETB DQ
          NOP
          CLR  DQ
          MOV  R0,#80H
     TSR1:
          DJNZ R0,TSR1  ; 延时
          SETB DQ
          MOV  R0,#25H  ;96US-25H
    TSR2:
          DJNZ R0,TSR2
          JNB DQ,TSR3
          LJMP TSR4 ; 延时
    TSR3:
          SETB FLAG1 ; 置标志位,表示DS1820存在
          LJMP TSR5
     TSR4:
         CLR FLAG1 ; 清标志位,表示DS1820不存在
         LJMP TSR7
     TSR5:
         MOV R0,#06BH ;200US
    TSR6:
         DJNZ R0,TSR6 ; 延时
    TSR7:
         SETB DQ
         RET

;/////重新写DS18B20暂存存储器设定值
RE_CONFIG:
          JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
          RET

RE_CONFIG1:
          MOV A,#0CCH ; 发SKIP ROM命令
          LCALL WRITE_1820
          MOV A,#4EH ; 发写暂存存储器命令
          LCALL WRITE_1820
          MOV A,#00H ; TH(报警上限)中写入00H
          LCALL WRITE_1820
          MOV A,#00H ; TL(报警下限)中写入00H
          LCALL WRITE_1820
          MOV A,#7FH ; 选择12位温度分辨率
          LCALL WRITE_1820
          RET

;/////延时子程序
 DELAY:MOV R7,#00H
   MIN:DJNZ R7,YS500
       RET

  YS500:LCALL YS500US
        LJMP MIN
YS500US:MOV R6,#00H
        DJNZ R6,$
        RET
DELAY1:MOV R7,#20H
       DJNZ R7,$
       RET

;显示子程序
display:
  
  ACALL LCD_INT
  MOV P1,#01H            ;清屏
  ACALL ENABLE
  MOV P1,#81H
  LCALL ENABLE
  MOV P1,#'T'
  LCALL WRITER
  MOV P1,#'='
  LCALL WRITER
  CLR C
  LJMP DISP3
  RET
;说明:使用前,必须先对液晶显示模块进行初始化。然后,先把
;     显示地址(位置)送到液晶模块的数据口,再调用"ENABLE"
;     子程序把这个地址送入模块中。之后,把要显示的字符的
;     ASCII码 送到液晶模块的数据口,再调用"WRITER"子程序
;     把这个数据送入模块中让它显示出来。
;
;======液晶模块初始化,一般放在程序开头=======
LCD_INT:   MOV LCD_DB,#01H            ;清屏
        ACALL ENABLE
        MOV LCD_DB,#38H            ;工作方式设置
        ACALL ENABLE
        MOV LCD_DB,#0CH            ;显示状态设置
        ACALL ENABLE
        MOV LCD_DB,#06H            ;输入方式设置
        ACALL ENABLE
                       RET
;==============初始化结束=====================         
;


;*****************************************************************************
DISP3:
  
  MOV A,TEMPER_NUM
  ANL A,#0F0H
  SWAP A
  LCALL NEX0
  MOV A,TEMPER_NUM
  ANL A,#0FH
  LCALL NEX0
  ; MOV P1,#2EH
  ; LCALL WRITER
  ;MOV A,TEMPER_L
  ;ANL A,#0FH
  ;MOV DPTR,#TAB2
  ;MOVC A,@A+DPTR
  ;MOV 36H,A
  ;ANL A,#0F0H
  ;SWAP A
  ;LCALL NEX0
  ;MOV A,36H
  ;ANL A,#0FH
  ;LCALL NEX0
  ;MOV P1,#0DFH
  ; LCALL WRITER
  ;MOV P1,#43H
  ;LCALL WRITER
  RET
CC:ACALL LCD_INT
  MOV P1,#01H            ;清屏
  ACALL ENABLE
  LCALL ENABLE
  MOV P1,#'N'
  LCALL WRITER
  MOV P1,#'O'
      JMP DD
NEX0:
  CJNE A,#00H,NEX1
  MOV P1,#30H
  LJMP NEX10
NEX1:
  CJNE A,#01H,NEX2
  MOV P1,#31H
  LJMP NEX10
NEX2:
  CJNE A,#02H,NEX3
  MOV P1,#32H
  LJMP NEX10
NEX3:
  CJNE A,#03H,NEX4
  MOV P1,#33H
  LJMP NEX10
NEX4:
  CJNE A,#04H,NEX5
  MOV P1,#34H
  LJMP NEX10
NEX5:
  CJNE A,#05H,NEX6
  MOV P1,#35H
  LJMP NEX10
NEX6:
  CJNE A,#06H,NEX7
  MOV P1,#36H
  LJMP NEX10
NEX7:
  CJNE A,#07H,NEX8
  MOV P1,#37H
  LJMP NEX10
NEX8:
  CJNE A,#08H,NEX9
  MOV P1,#38H
  LJMP NEX10
NEX9:
  CJNE A,#09H,NEX11
  MOV P1,#39H
NEX10:
  LCALL WRITER
NEX11:
  RET



;===================模块的各个子程序===========================
;
;=======RS=0,RW=0,E=1,使模块工作并准备接收控制指令===========
ENABLE: CLR RS
    CLR RW
    CLR E
    ACALL WAIT
    SETB E
    RET
;
;===读BF值,对模块进行任何操作前必须判断模块是否"忙"(BF=1)
;         如果不"忙"(BF=0)才可以进行各种操作
WAIT:   MOV LCD_DB,#0FFH
    CLR RS
    SETB RW
    CLR E
    NOP
    SETB E
    JB LCD_DB.7,WAIT
    RET
;
;=====RS=1,RW=0,E=1,写显示数据到模块指令============
WRITER: SETB RS
    CLR RW
    CLR E
    ACALL WAIT
    SETB E
    RET
;
;==============延时==========================
DELAY1S:MOV   R5,#01
DL4_PA: MOV   R6,#100
DL4_PB: MOV   R7,#100
    DJNZ   R7,$
    DJNZ   R6,DL4_PB
    DJNZ   R5,DL4_PA
    RET
;===========================================

DD:NOP
End


⌨️ 快捷键说明

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