ds18b20-lcd.asm

来自「温度控制?」· 汇编 代码 · 共 1,099 行 · 第 1/3 页

ASM
1,099
字号
          op        equ  21H.0
          com       equ  22H.1
          hw        equ  22H.2 

          K1        EQU  P1.4
          K2        EQU  P1.5
          K3        EQU  P1.6
          K4        EQU  P1.7

          BEEP      EQU  P3.7
          RELAY     EQU  P1.3
          LCD_X     EQU  2FH      ;LCD 地址变量
          LCD_RS    EQU  P2.0
          LCD_RW    EQU  P2.1
          LCD_EN    EQU  P2.2
          flag1     equ  20H.0    ;DS18B20是否存在标记
          KEY_UD    EQU  20H.1    ;设定 KEY 的UP与DOWN 标记
          date_line equ   p3.3
	  count1    data  0BH
          count2    data  0CH
          flag      data  08H
          iraddr1   data  09H
          iraddr2   data  0AH
          endcount1 data  0DH
          endcount2 data  0EH
          TEMP_ZH   DATA  24H     ;实时温度值存放单元
          TEMPL     DATA  25H     ;
          TEMPH     DATA  26H     ;
          TEMP_TH   DATA  27H     ;高温报警值存放单元
          TEMP_TL   DATA  28H     ;低温报警值存放单元
          TEMPHC    DATA  29H     ;
          TEMPLC    DATA  2AH
          TEMPPOINT DATA  2BH
;=====================================================
           ORG  0000H
           JMP  MAIN
	   org  000BH
	   JMP  timeint

MAIN:     MOV  SP,#60H
          MOV  A,#00H
          MOV  R0,#20H       ;将 20H-2FH 单元清零
          MOV  R1,#10H
CLEAR:    MOV  @R0,A
          INC  R0
          DJNZ  R1,CLEAR

          CALL  SET_LCD
          CALL  RE_18B20
START0:   call tran
          
start:    JB  K1,start11
          setb hw
           
          jmp  start22
start11:  jB  k2,start 
          setb com    	
start22:  CALL  RESET 
          CALL  TRAN1
           jb   hw,start33
           jb    com,setcom 
setcom:   MOV	TMOD,#20H		; 定时器1工作于8位自动重载模式,用于产生波特率
	  MOV	TH1,#0FDH
	  MOV	TL1,#0FDH		; 波特率9600
	  MOV	SCON,#50H		; 设定串行口工作方式
	  ANL	PCON,#0EFH		; 波特率不倍增
	  SETB	TR1			; 启动定时器1              ;18B20复位子程序
          MOV	IE,#0
start33:  JNB   FLAG1,START1   ;DS1820不存在
          JB    HW,MEUM1
	  JB    COM,MEUM2
MEUM1:    CALL  TRAN2
          JMP   START44     
MEUM2:    CALL  TRAN1
START44:  CALL  READ_E2
          CALL  TEMP_BJ        ;显示温度标记
          JMP   START2
START1:   CALL  MENU_ERROR
          CALL  TEMP_BJ        ;显示温度标记
          JMP  $

START2:
          CALL  RESET
         
	  
          JNB  FLAG1,START1    ;DS1820不存在
          MOV   A,#0CCH        ; 跳过ROM匹配
          CALL  WRITE
          MOV   A,#44H         ; 发出温度转换命令
          CALL  WRITE
          CALL  RESET
          MOV   A,#0CCH        ; 跳过ROM匹配
          CALL  WRITE
          MOV   A,#0BEH        ; 发出读温度命令
          CALL  WRITE
          CALL  READ
          call CONVTEMP
          Call DISPBCD
          CALL CONV
          CALL TEMP_COMP
	  jb    com,chuangkou
	  jb    hw,hongwai
hongwai:  call  main1
          jmp   main3
chuangkou:mov   a,#0xee
	  call  sendchar
	  mov   a,temp_zh
	  call  sendchar
	  mov   a,temppoint
	  call  sendchar
	  mov   a,temphc
	  call  sendchar  
main3:	  clr  tr0
          CALL  PROC_KEY       ; 键扫描
         
	  SJMP	START2
sendchar: MOV	SBUF,A
	  JNB	TI,$			; 等特数据传送
	  CLR	TI
          ret
;-----------------------------------------------------
PROC_KEY:
	 JB  K1,PROC_K1		  ; 按键K1处理
         CALL  BEEP_BL
         JNB  K1,$
         MOV  DPTR,#M_ALAX1
         MOV  A,#1
         CALL  LCD_PRINT
         CALL  LOOK_ALARM
         JB  K3,$
         CALL  BEEP_BL
         JMP  PROC_K2
PROC_K1:			  ; 按键K2处理
         JB  K2,PROC_END
         CALL  BEEP_BL
         JNB  K2,$
         MOV   DPTR,#RESET_A1
         MOV   A,#1
         CALL  LCD_PRINT
         CALL  SET_ALARM
         CALL  RE_18B20           ;将设定的TH,TL值写入DS18B20内
         CALL  WRITE_E2
PROC_K2:
         CALL  MENU_OK
         CALL  TEMP_BJ
	 JMP   PROC_END                
PROC_END:
         RET
;============================================
;设定报警值 TH、TL
;============================================
SET_ALARM:
         ;CALL  RESET_ALARM
         CALL  LOOK_ALARM
AS0:
         JB   K1,AS00
         CALL  BEEP_BL
         JNB  K1,$
         CPL  20H.1            ;UP/DOWN 标记
AS00:    JB  20H.1,ASZ01       ;20H.1=1,UP
         JMP  ASJ01            ;20H.1=0,DOWN

ASZ01:   JB  K2,ASZ02          ;TH值调整(增加)
         CALL  BEEP_BL
         INC  TEMP_TH
         MOV  A,TEMP_TH
         CJNE  A,#120,ASZ011
         MOV  TEMP_TH,#0
ASZ011:  CALL  LOOK_ALARM
         MOV  R5,#10
         CALL  DELAY
         JMP  ASZ01

ASZ02:   JB  K3,ASZ03          ;TL值调整(增加)
         CALL  BEEP_BL
         INC  TEMP_TL
         MOV  A,TEMP_TL
         CJNE  A,#99,ASZ021
         MOV  TEMP_TL,#00H
ASZ021:  CALL  LOOK_ALARM    ;
         MOV  R5,#10
         CALL  DELAY
         JMP  ASZ02
ASZ03:   JB  K4,AS0          ;确定调整 OK
         CALL  BEEP_BL
         JNB  K4,$
         RET

ASJ01:
         JB  K2,ASJ02          ;TH值调整 (减少)
         CALL  BEEP_BL
         DEC   TEMP_TH
         MOV  A,TEMP_TH
         CJNE  A,#0FFH,ASJ011
         JMP  ASJ022
ASJ011:  CALL  LOOK_ALARM
         MOV  R5,#10
         CALL  DELAY
         JMP  AS0

ASJ02:   JB  K3,ASJ03         ;TL值调整(减少)
         CALL  BEEP_BL
         DEC  TEMP_TL
         MOV  A,TEMP_TL
         CJNE  A,#0FFH,ASJ021
         JMP  ASJ022
ASJ021:  CALL  LOOK_ALARM    ;
         MOV  R5,#10
         CALL  DELAY
         JMP  AS0
ASJ022:  CPL  20H.1
         JMP  ASZ01
ASJ03:   JMP  ASZ03
         RET


RESET_ALARM:
          MOV  DPTR,#RESET_A1  ;指针指到显示信息区
          MOV  A,#1            ;显示在第一行
          CALL  LCD_PRINT
          RET
RESET_A1:
     DB  "RESET ALERT CODE"

TEMP_COMP:
          MOV  A,TEMP_TH       
          SUBB  A,TEMP_ZH       ;减数>被减数,则
          JC  CHULI1            ;借位标志位C=1,转
          MOV  A,TEMP_ZH
          SUBB  A,TEMP_TL       ;减数>被减数,则
          JC  CHULI2            ;借位标志位C=1,转
          MOV  DPTR,#BJ5
          CALL  TEMP_BJ3
          CLR   RELAY           ;继电器吸合
          RET
 CHULI1:
          MOV  DPTR,#BJ3
          CALL  TEMP_BJ3
          SETB  RELAY           ;继电器关闭
          CALL  BEEP_BL
          RET
 CHULI2:
          MOV  DPTR,#BJ4
          CALL  TEMP_BJ3
          CALL  BEEP_BL
          RET
;-----------------------------------------
TEMP_BJ3:
          MOV  A,#0CEH
          CALL WCOM
          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  " !"

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
TRAN:     
          MOV  DPTR,#M_HW  ;指针指到显示消息
          MOV  A,#1          ;显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#M_COM  ;指针指到显示消息
          MOV  A,#2          ;显示在第一行
          CALL  LCD_PRINT

          RET
TRAN1:    MOV  DPTR,#M_OK3  ;指针指到显示消息
          MOV  A,#1          ;显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#M_OK2  ;指针指到显示消息
          MOV  A,#2          ;显示在第一行
          CALL  LCD_PRINT
          RET
TRAN2:    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 hw  OK   ",0
M_OK2:
    DB   " TEMP:          ",0
m_OK3:
    db   "DS18B20 COM 0K  ",0
M_HW:
   DB    "HW  SELECT K1   ",0
M_COM:
   DB    "COM SELECT K2  ",0
;-----------------------------------------------
MENU_ERROR:
          MOV  DPTR,#M_ERROR1  ;指针指到显示消息1
          MOV  A,#1          ;显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#M_ERROR2  ;指针指到显示消息1
          MOV  A,#2          ;显示在第一行
          CALL  LCD_PRINT
          RET
M_ERROR1:
    DB   " DS18B20 ERROR  ",0
M_ERROR2:
    DB   " TEMP: ----     ",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
;=======================================================
RE_18B20:

⌨️ 快捷键说明

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