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

📄 ds18b20-lcd1602-温度控制.asm

📁 基于51的DS18B20_1Wire温度控制等C,ASM源程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
          MOV  R1,#0
          MOV  R0,#2          ;写两个标记字符

BBJJ3:    MOV  A,R1
          MOVC A,@A+DPTR      ;读出要写的标记字符
          CALL  WDATA         ;写入标记字符
          INC R1
          DJNZ  R0,BBJJ3      ;没有写完,继续
          RET
BJ3:
      DB  ">H"                ;超温标记
BJ4:
      DB  "<L"                ;欠温标记
BJ5:
      DB  "!!"                ;加热标记
;==================================================
;显示温度标记 ℃ 子程序
;将预先写入LCD1602 CGRAM 的数读出,并送显示
;==================================================
TEMP_BJ:
          MOV  A,#0CBH       ;指定写入地址
          CALL WCOM
          MOV  DPTR,#BJ1     ;指针指到显示消息区
          MOV  R1,#0
          MOV  R0,#2         ;写两个标记字符

BBJJ1:    MOV  A,R1
          MOVC A,@A+DPTR
          CALL  WDATA
          INC R1
          DJNZ  R0,BBJJ1     ;没有写完,继续
          RET
BJ1:
      DB  00H,"C"            ;字符 “℃”
;=================================================
MENU_OK:

          MOV  DPTR,#M_OK1   ;指针指到显示信息区
          MOV  A,#1          ;显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#M_OK2   ;指针指到显示信息区
          MOV  A,#2          ;显示在第二行
          CALL  LCD_PRINT
          RET
M_OK1:
    DB   "   DS18B20 OK   ",0
M_OK2:
    DB   " TEMP:          ",0
;-----------------------------------------------
MENU_ERROR:
          MOV  DPTR,#M_ERROR1  ;指针指到显示信息区
          MOV  A,#1            ;显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#M_ERROR2  ;指针指到显示信息区
          MOV  A,#2            ;显示在第二行
          CALL  LCD_PRINT
          RET
;----------------------------------------------------
M_ERROR1:
    DB   " DS18B20 ERROR  ",0

M_ERROR2:
    DB   "  PLEASE CHECK  ",0

;====================================================
;DS18B20 复位与检测子程序
;DS18B20 正常 FLAG1 置 1,不正常 FLAG1 置 0。
;====================================================
RESET:
        SETB DATE_LINE        ;
        NOP
        CLR DATE_LINE
        MOV R0,#6BH           ;主机发出延时复位低脉冲
        MOV R1,#04H
TSR1:   DJNZ R0,$             ;延时
        MOV R0,#6BH
        DJNZ R1,TSR1
        SETB DATE_LINE        ;然后拉高数据线
        NOP
        NOP
        NOP
        MOV R0,#32H
TSR2:   JNB DATE_LINE,TSR3    ;等待DS18B20回应
        DJNZ R0,TSR2
        JMP TSR4              ; 延时
TSR3:   SETB FLAG1            ; 置标志位,表示DS1820存在
        JMP TSR5
TSR4:   CLR FLAG1             ; 清标志位,表示DS1820不存在
        JMP TSR7
TSR5:   MOV R0,#06BH
TSR6:   DJNZ R0,$             ; 时序要求延时一段时间
TSR7:   SETB DATE_LINE
        RET

;==========================================================
;重新对 DS18B20 初始化
;将设定的温度报警值写入 DS18B20
;==========================================================
RE_18B20:
        JB  FLAG1,RE_18B20A
        RET
RE_18B20A:
        CALL  RESET
        MOV  A,#0CCH       ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#4EH        ;写暂存寄存器
        LCALL  WRITE
        MOV  A,TEMP_TH     ;TH(报警上限)
        LCALL  WRITE
        MOV  A,TEMP_TL     ;TL(报警下限)
        LCALL  WRITE
        MOV  A,#7FH        ;12位精确度
        LCALL  WRITE
        RET
;------------------------------------------------------------
;把 DS18B20 暂存器里的温度报警值拷贝到EEROM
;------------------------------------------------------------
WRITE_E2:
        CALL  RESET
        MOV  A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#48H         ;把暂存器里的温度报警值拷贝到EEROM
        LCALL  WRITE
        RET
;--------------------------------------------------------------
;把 DS18B20 EEROM 里的温度报警值拷贝回暂存器
;-------------------------------------------------------------
READ_E2:
        CALL  RESET
        MOV  A,#0CCH        ;跳过ROM匹配
        LCALL  WRITE
        MOV  A,#0B8H        ;把EEROM里的温度报警值拷贝回暂存器
        CALL  WRITE
        RET
;--------------------------------------------------------------
;将自定义字符“℃”写入 LCD1602 的 CGRAM 中
;--------------------------------------------------------------
STORE_DATA:
        MOV  A,#40H          ;指定地址
        CALL  WCOM
        MOV  R2,#08H         ;共取 8 个数
        MOV  DPTR,#D_DATA
        MOV  R3,#00H
S_DATA:
        MOV  A,R3
        MOVC  A,@A+DPTR      ;查表取数
        CALL  WDATA          ;写入数据
        INC  R3
        DJNZ  R2,S_DATA      ;没有取完,继续
        RET

D_DATA:
    DB  0CH,12H,12H,0CH,00H,00H,00H,00H   ;字符 “°”
;------------------------------------------------------------------
;DS18B20 写命令、数据子程序
;根据命令的内容,进行写操作
;------------------------------------------------------------------
WRITE:
        MOV R2,#8            ;8位数据长度
        CLR  C
WR1:
        CLR DATE_LINE        ;开始写入DS18B20总线要处于复位(低)状态
        MOV R3,#08
        DJNZ R3,$            ;总线复位保持16微妙以上
        RRC A                ;把一个字节DATA 分成8个BIT环移给C
        MOV DATE_LINE,C      ;写入一个BIT
        MOV R3,#3CH
        DJNZ R3,$            ;等待120微妙
        SETB DATE_LINE       ;重新释放总线
        NOP
        DJNZ R2,WR1          ;写入下一个BIT
        SETB DATE_LINE
        RET
;--------------------------------------------------------------------
;DS18B20 读温度子程序
; 将温度低位、高位、TH、TL从DS18B20中读出
; 分别存入 25H、26H、27H、28H 单元中
;--------------------------------------------------------------------
READ_TEMP:
         CLR  TR0
         MOV   A,#0CCH        ; 跳过ROM匹配
         CALL  WRITE
         MOV   A,#44H         ; 发出温度转换命令
         CALL  WRITE
         CALL  RESET
         MOV   A,#0CCH        ; 跳过ROM匹配
         CALL  WRITE
         MOV   A,#0BEH        ; 发出读温度命令
         CALL  WRITE          ;先写入命令

         MOV R4,#4             ;存入4个单元中
         MOV R1,#TEMPL         ;存入单元的首地址送入 R1
RE00:
         MOV R2,#8             ;8位数据长度
RE01:
         CLR CY
         SETB DATE_LINE
         NOP
         NOP
         CLR DATE_LINE        ;读前总线保持为低
         NOP
         NOP
         NOP
         SETB DATE_LINE       ;开始读总线释放
         MOV R3,#07           ;延时15微妙
         DJNZ R3,$
         MOV C,DATE_LINE      ;从DS18B20总线读得一个BIT
         MOV R3,#3CH
         DJNZ R3,$            ;等待100微妙
         RRC A                ;把读得的位值环移给A
         DJNZ R2,RE01         ;读下一个BIT
         MOV @R1,A
         INC R1
         DJNZ R4,RE00         ;没有读完,继续
         SETB  TR0
         RET
;*****************************************************
;处理温度 BCD 码子程序
;整数部分:取出 TEMPL 高四位和 TEMPH 低四位进行重新组合
;小数部分:取出 TEMPL 低四位,查小数码表
;****************************************************
CONVTEMP:
         MOV  A,TEMPH       ;判温度是否零下
         ANL  A,#80H
         JZ  TEMPC1         ;温度零上转
         SETB FLAG3         ;温度为负值
         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
         JMP  TEMPC2
TEMPC1:
         CLR  FLAG3               ;温度为正值
TEMPC2:
         MOV  A,TEMPL
         ANL  A,#0FH              ;取出小数部分
         MOV  B,#10               ;将TEMP_L的低四位X10/16得小数后一位数.
         MUL  AB
	 MOV  B,#16
	 DIV  AB
         MOV  70H,A               ;小数部分 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             ;(A)=十位数和个位数
         ANL  A,#0F0H
         SWAP  A
         MOV  72H,A               ;十位数 BCD
         MOV  A,TEMPL
         ANL  A,#0FH
         MOV  71H,A               ;个位数 BCD

         MOV  A,R4                ;(R4)= 百位数
         MOV  73H,A
TEMPC3:
         RET
;====================================================
;单字节十六进制转BCD
;入口:(A)=单字节十六进制的温度值
;出口:(R4)= 百位数,(A)=十位数和个位数
;====================================================
HEX2BCD1:
         MOV  B,#064H
         DIV  AB
         MOV  R4,A             ;(R4)=百位数
         MOV  A,#0AH
         XCH  A,B
         DIV  AB
         SWAP  A
         ORL  A,B             ;(A)=十位数和个位数
         RET

;=====================================================
;显示 TH 和 TL 值的子程序
;=====================================================
LOOK_ALARM:
          MOV  DPTR,#M_ALAX2   ;指针指到显示信息区
          MOV  A,#2            ;显示在第二行
          CALL  LCD_PRINT      ;

          MOV  A,#0C6H         ;指定地址
          CALL  TEMP_BJ1

⌨️ 快捷键说明

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