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

📄 xl18b20.asm

📁 DS18B20温度控制数码管 1、K3 → 进入设定温度报警值 TL 状态:L--20 2、K3 → 进入设定温度报警值 TH 状态:H--28 3、K3 → 返回
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;/*******************************************************************************
;*  标题:  xl系列单片机实验仪演示程序 DS18B20温度控制数码管                     *
;*  文件:   xl18b20.asm                                                         *
;*  日期:  2006-1-5                                                             *
;*  版本:  3.0 (试验通过版)可用xl600-xl1000单片机综合试验仪试验               *
;*  邮箱:  sxj1974@163.com                                                      *
;*  网站: http://www.51c51.com    www.8951.com                                 *
;********************************************************************************
;*  描述:                                                                       *
;*          DS18B20温度控制数码管显示                                           *
;*        1、K3 → 进入设定温度报警值 TL 状态:                                  *
;*           L--20                                                            *
;*        2、K3 → 进入设定温度报警值 TH 状态:                                  *
;*           H--28                                                            *
;*        3、K3 → 返回                                                         *
;*        4、设定过程: K1 →加键 (UP), K2 →减键 (DOWN),可快速调。       *
;*   资源: 继电器p1.0 喇叭p3.7 18b20 p3.3 按键k1-k4 p1.4-p1.7 数码管P0数据P2控制*
;********************************************************************************
;* 【版权】 Copyright(C)深圳市学林电子有限公司 www.51c51.com                    *
;* 【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息!                  *
;*  【技术支持】请访问http://www.51c51.com/bbs/index.asp  官方论坛              *
;********************************************************************************/

          TIMER_L     DATA  23H
          TIMER_H     DATA  24H
          TIMER_COUN  DATA  25H

          TEMPL       DATA  26H
          TEMPH       DATA  27H
          TEMP_TH     DATA  28H
          TEMP_TL     DATA  29H

          TEMPHC      DATA  2AH
          TEMPLC      DATA  2BH
          TEMP_ZH     DATA  2CH

          BEEP        EQU   P3.7
          DATA_LINE   EQU   P3.3
          RELAY       EQU   P1.3

          FLAG1       EQU   20H.0
          FLAG2       EQU   20H.1

;-------------------------------------------------
          K1   EQU  P1.4
          K2   EQU  P1.5
          K3   EQU  P1.6
          K4   EQU  P1.7
;=================================================
          ORG 0000H
          JMP  MAIN

          ORG  000BH
          AJMP  INT_T0
;--------------------------------------------------
MAIN:     MOV SP,#30H
          MOV  TMOD,#01H        ;T0,方式1
          MOV  TIMER_L,#00H     ;50ms定时值
          MOV  TIMER_H,#4CH
          MOV  TIMER_COUN,#00H  ;中断计数
          MOV  IE,#82H          ;EA=1,ET0=1
          LCALL  READ_E2
          ;LCALL  RE_18B20
          MOV  20H,#00H
          SETB   BEEP
          SETB   RELAY
          MOV  7FH,#0AH         ;熄灭符

          CALL RESET            ;复位与检测DS18B20
          JNB FLAG1,MAIN1       ;FLAG1=0,DS18B20不存在
          JMP  START

MAIN1:    CALL RESET
          JB FLAG1,START
          LCALL  BEEP_BL        ;DS18B20错误,报警
          JMP  MAIN1
START:
          MOV A,#0CCH         ; 跳过ROM匹配
          CALL WRITE
          MOV A,#044H         ; 发出温度转换命令
          CALL WRITE

          CALL RESET
          MOV A,#0CCH         ; 跳过ROM匹配
          CALL WRITE
          MOV A,#0BEH         ; 发出读温度命令
          CALL WRITE

          CALL  READ           ;读温度数据
          CALL  CONVTEMP
          CALL  DISPBCD
          CALL  DISP1
          CALL  SCANKEY
          LCALL  TEMP_COMP
          JMP   MAIN1

;=====================================================
;DS18B20 复位与检测子程序
;FLAG1=1 OK, FLAG1=0 ERROR
;======================================================
RESET:
          SETB DATA_LINE
          NOP
          CLR DATA_LINE
          MOV R0,#64H            ;主机发出延时600微秒的复位低脉冲
          MOV R1,#03H
RESET1:   DJNZ R0,$
          MOV R0,#64H
          DJNZ R1,RESET1
          SETB DATA_LINE        ;然后拉高数据线
          NOP
          MOV R0,#25H
RESET2:   JNB DATA_LINE,RESET3  ;等待DS18B20回应
          DJNZ R0,RESET2
          JMP RESET4            ; 延时
RESET3:   SETB FLAG1            ; 置标志位,表示DS1820存在
          JMP RESET5
RESET4:   CLR FLAG1             ; 清标志位,表示DS1820不存在
          JMP RESET6
RESET5:   MOV R0,#064H
          DJNZ R0,$             ; 时序要求延时一段时间
RESET6:   SETB DATA_LINE
          RET
;===========================================================
;
;===========================================================
WRITE:  MOV R2,#8            ;一共8位数据
        CLR CY
WR1:
        CLR DATA_LINE        ;开始写入DS18B20总线要处于复位(低)状态
        MOV R3,#09
        DJNZ R3,$            ;总线复位保持18微妙以上
        RRC A                ;把一个字节DATA 分成8个BIT环移给C
        MOV DATA_LINE,C      ;写入一个BIT
        MOV R3,#23
        DJNZ R3,$            ;等待46微妙
        SETB DATA_LINE       ;重新释放总线
        NOP
        DJNZ R2,WR1          ;写入下一个BIT
        SETB DATA_LINE
        RET
;============================================================
;从DS18B20中读出温度低位、高位和报警值TH、TL
;存入26H、27H、28H、29H
;============================================================
READ:    MOV R4,#4            ; 将温度高位和低位从DS18B20中读出
         MOV R1,#26H          ; 存入26H、27H、28H、29H
RE00:    MOV R2,#8
RE01:    CLR C
         SETB DATA_LINE
         NOP
         NOP
         CLR DATA_LINE        ;读前总线保持为低
         NOP
         NOP
         NOP
         SETB DATA_LINE       ;开始读总线释放
         MOV R3,#09           ;延时18微妙
         DJNZ R3,$
         MOV C,DATA_LINE      ;从DS18B20总线读得一个BIT
         MOV R3,#23
         DJNZ R3,$            ;等待46微妙
         RRC A                ;把读得的位值环移给A
         DJNZ R2,RE01         ;读下一个BIT
         MOV @R1,A
         INC R1
         DJNZ R4,RE00
         RET        
;--------------------------------------------
;200ms对闪动标记取反一次
;--------------------------------------------
INT_T0:
          PUSH  ACC
          PUSH  PSW
          MOV  TL0,TIMER_L
          MOV  TH0,TIMER_H
          INC  TIMER_COUN
          MOV  A,TIMER_COUN
          CJNE  A,#04H,INT_END
          MOV  TIMER_COUN,#00H
          CPL  FLAG2
INT_END:
          POP  PSW
          POP  ACC
          RETI
;==========================================================
;重新对 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

;====================================================
;功能键扫描子程序
;====================================================
SCANKEY:
              MOV  P1,#0F0H
              JB  K1,SCAN_K2
              CALL  BEEP_BL
SCAN_K1:      CALL  ALERT_TL
              CALL  ALERT_PLAY
              JB   K1,SCAN_K1
              CALL  BEEP_BL
SCAN_K11:     CALL  ALERT_TH
              CALL  ALERT_PLAY
              JB    K1,SCAN_K11
              CALL  BEEP_BL
SCAN_K2:      JB  K2,SCAN_K3
              CALL  BEEP_BL
SCAN_K3:      JB  K3,SCAN_K4
              CALL  BEEP_BL
              LCALL  RESET_ALERT
              LCALL  RE_18B20
              LCALL  WRITE_E2
SCAN_K4:      JB  K4,SCAN_END
              CALL  BEEP_BL
SCAN_END:     RET

;================================================
;设置温度报警值
;================================================
RESET_ALERT:
          CALL  ALERT_TL
          CALL  ALERT_PLAY
          JNB K3,$              ;K3为位移键
          SETB  TR0
RESET_TL:
          CALL  ALERT_PLAY
          JNB  FLAG2,R_TL01
          mov  75H,7fh          ;送入熄灭符
          mov  76H,7fh
          CALL  ALERT_PLAY
          JMP   R_TL02
R_TL01:   CALL  ALERT_TL
          mov  75h,7Eh          ;送设定值
          mov  76h,7Dh
          CALL  ALERT_PLAY      ;显示设定值
R_TL02:   JNB  K1,K011A
          JNB  K2,K011B
          JNB  K3,RESET_TH
          JMP  RESET_TL
K011A:
          INC  TEMP_TL
          MOV  A,TEMP_TL
          CJNE  A,#120,K012A    ;没有到设定上限值,转
          MOV  TEMP_TL,#0
K012A:    CALL  TL_DEL
          JMP   RESET_TL
K011B:
          DEC  TEMP_TL
          MOV  A,TEMP_TL
          CJNE  A,#00H,K012B   ;没有到设定下限值,转
          MOV  TEMP_TL,#119
K012B:    CALL  TL_DEL
          JMP   RESET_TL
;-------------------------------------------------------
RESET_TH:
           CALL  BEEP_BL
           JNB  K3,$
RESET_TH1:
          CALL  ALERT_PLAY
          JNB  FLAG2,R_TH01
          mov  75H,7fh          ;送入熄灭符
          mov  76H,7fh
          CALL  ALERT_PLAY
          JMP   R_TH02
R_TH01:   CALL  ALERT_TH
          mov  75h,7Eh          ;
          mov  76h,7Dh
          CALL  ALERT_PLAY
R_TH02:   JNB  K1,K021A
          JNB  K2,K021B
          JNB  K3,K002
          JMP  RESET_TH1
K021A:
          INC  TEMP_TH
          MOV  A,TEMP_TH
          CJNE  A,#120,K022A   ;没有到设定上限值,转
          MOV  TEMP_TH,#0
K022A:     CALL  TH_DEL
          JMP   RESET_TH1

K021B:
          DEC  TEMP_TH         ;减1
          MOV  A,TEMP_TH
          CJNE  A,#00H,K022B   ;没有到设定下限值,转
          MOV  TEMP_TH,#119
K022B:    CALL  TH_DEL
          JMP   RESET_TH1

K002:     CALL  BEEP_BL
          CLR  TR0             ;关闭中断
          RET
;-----------------------------------------------------
;键延时子程序
;多次调用报警值显示程序来延时
;-----------------------------------------------------
TL_DEL:                        ;报警低值延时
          MOV  R2,#0AH
TL_DEL1:  CALL  ALERT_TL
          CALL  ALERT_PLAY
          DJNZ  R2,TL_DEL1
          RET
TH_DEL:                        ;报警高值延时
          MOV  R2,#0AH
TH_DEL1:  CALL  ALERT_TH
          CALL  ALERT_PLAY
          DJNZ  R2,TH_DEL1
          RET
;====================================================
;实时温度值与设定报警温度值 TH、TL 比较子程序
;当实际温度大于 TH 的设定值时,显示“H”,继电器关闭。
;当实际温度小于 TH 的设定值时,显示“O”,继电器吸合。
;当实际温度小于 TL 的设定值时,显示“L”。

⌨️ 快捷键说明

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