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

📄 ds18b20-smg.asm

📁 DS18B02是温度测量片
💻 ASM
📖 第 1 页 / 共 2 页
字号:
          JC  CHULI1            ;借位标志位C=1,转
          MOV  A,TEMP_ZH
          SUBB  A,TEMP_TL       ;减数>被减数,则
          JC  CHULI2            ;借位标志位C=1,转
          JNB  FLAG2,T_COMP1    ;FLAG2=0,显示标记字符
          MOV  74H,#0AH         ;熄灭符
          LCALL  DISP1
          JMP  T_COMP2
T_COMP1:  MOV  74H,#00H
          LCALL  DISP1          ;显示"O"
T_COMP2:  CLR   RELAY           ;继电器吸合
          CLR  TR0              ;关闭中断
          RET
;---------------------------------------------
;超温处理
;---------------------------------------------
CHULI1:
          SETB  RELAY           ;继电器关闭
          JNB  FLAG2,CHULI10
          MOV  74H,#0AH         ;熄灭符
          LCALL  DISP1
          JMP  CHULI11
CHULI10:  MOV  74H,#0DH         
          LCALL  DISP1          ;显示"H"
          ;CALL  BEEP_BL        ;蜂鸣器响
CHULI11:
          CLR  TR0              ;关闭中断
          RET
;---------------------------------------------
;欠温处理
;---------------------------------------------
CHULI2:                         ;欠温处理
          JNB  FLAG2,CHULI20
          MOV  74H,#0AH         ;熄灭符
          LCALL  DISP1
          JMP  CHULI21
CHULI20:  MOV  74H,#0CH         
          LCALL  DISP1          ;显示"L"
          ;CALL  BEEP_BL        ;蜂鸣器响
CHULI21:  CLR  TR0              ;关闭中断
          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        ;温度报警值拷贝回暂存器
        CALL  WRITE
        RET

;*****************************************************
;  处理温度 BCD 码子程序
;****************************************************
CONVTEMP:      MOV  A,TEMPH       ;判温度是否零下
               ANL  A,#80H
               JZ  TEMPC1         ;温度零上转
               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          ;TEMPHC HI =符号位
               MOV  TEMPHC,#0BH
               SJMP  TEMPC11

TEMPC1:        MOV  TEMPHC,#0AH     ;
TEMPC11:       MOV  A,TEMPHC
               SWAP  A
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH             ;乘0.0625
               MOV  DPTR,#TEMPDOTTAB
               MOVC  A,@A+DPTR
               MOV  TEMPLC,A            ;TEMPLC  LOW=小数部分 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
               ANL  A,#0F0H
               SWAP  A
               ORL  A,TEMPHC            ;TEMPHC LOW = 十位数 BCD
               MOV  TEMPHC,A
               MOV  A,TEMPL
               ANL  A,#0FH
               SWAP  A                  ;TEMPLC HI = 个位数 BCD
               ORL  A,TEMPLC
               MOV  TEMPLC,A
               MOV  A,R7
               JZ  TEMPC12
               ANL  A,#0FH
               SWAP  A
               MOV  R7,A
               MOV  A,TEMPHC            ;TEMPHC HI = 百位数 BCD
               ANL  A,#0FH
               ORL  A,R7
               MOV  TEMPHC,A
TEMPC12:       RET
;-----------------------------------------------------------
;  小数部分码表
;-----------------------------------------------------------
TEMPDOTTAB:  DB   00H,01H,01H,02H,03H,03H,04H,04H,05H,06H
             DB   06H,07H,08H,08H,09H,09H

;===========================================================

;显示区 BCD 码温度值刷新子程序

;===========================================================

DISPBCD:      MOV  A,TEMPLC
              ANL  A,#0FH
              MOV  70H,A                 ;小数位
              MOV  A,TEMPLC
              SWAP  A
              ANL  A,#0FH
              MOV  71H,A                 ;个位
              MOV  A,TEMPHC
              ANL  A,#0FH
              MOV  72H,A                 ;十位
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,A                 ;百位
              MOV  A,TEMPHC
              ANL  A,#0F0H
              CJNE  A,#010H,DISPBCD0
              SJMP  DISPBCD2

DISPBCD0:     MOV  A,TEMPHC
              ANL  A,#0FH
              JNZ  DISPBCD2               ;十位数是0
              MOV  A,TEMPHC
              SWAP  A
              ANL  A,#0FH
              MOV  73H,#0AH               ;符号位不显示
              MOV  72H,A                  ;十位数显示符号
DISPBCD2:     RET

;***************************************************************

;     温度显示子程序

;***************************************************************
;显示数据在70H - 73H 单元内,用4位共阳数码管显示,P0口输出段码数据,
;P2 口作扫描控制,每个 LED 数码管亮 2MS 时间再逐位循环。

DISP1:       MOV  R1,#70H             ;指向显示数据首址
             MOV  R5,#7FH            ;扫描控制字初值
PLAY:        MOV  P0,#0FFH
             MOV  A,R5                ;扫描字放入A
             MOV  P2,A
             MOV  A,@R1               ;取显示数据到A
             MOV  DPTR,#TAB           ;取段码表地址
             MOVC  A,@A+DPTR          ;查显示数据对应段码
             MOV  P0,A                ;段码放入P0口
             MOV  A,R5
             JB   ACC.6,LOOP5         ;小数点处理
             CLR  P0.7
LOOP5:       LCALL  DL_MS              ;显示2MS
             INC  R1                   ;指向下一个地址
             MOV  A,R5                 ;放回 R5 内
             JNB  ACC.3,ENDOUT        ;ACC.3=0时一次显示结束
             RR  A                    ;A 中数据循环左移
             MOV  R5,A                ;放入 R5 中
             AJMP  PLAY               ;跳回 PLAY 循环
ENDOUT:      MOV  P0,#0FFH            ;一次显示结束,P0口复位
             MOV  P2,#0FFH            ;P2口复位
             RET

TAB:
 DB  0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
;   “0"  “1" “2" “3" “4"“5"“6"“7"“8"“9"“灭" “-" “L”“H"

DL_MS:      MOV  R6,#0AH         ;2MS延时程序,LED 显示程序用
DL1:        MOV  R7,#64H
DL2:        DJNZ  R7,DL2
            DJNZ  R6,DL1
            RET

;******************************************************
;单字节十六进制转 BCD
;******************************************************
HEX2BCD1:   MOV  B,#064H          
            DIV  AB               
            MOV  R7,A             
            MOV  A,#0AH
            XCH  A,B
            DIV  AB               
            SWAP  A
            ORL  A,B
            RET
;===============================================
;报警值 TH、TL 数据转换
;===============================================
ALERT_TL:
             MOV  79H,#0CH
             MOV  78H,#0BH
             MOV  A,TEMP_TL
             MOV  R0,#77H
             MOV  B,#064H
             DIV  AB
             CJNE  A,#01H,ALERT_TL1
             MOV  @R0,A
             JMP  ALERT_TL2
ALERT_TL1:   MOV  A,#0BH           ;显示“-”
             MOV  @R0,A
ALERT_TL2:   MOV  A,#0AH
             XCH  A,B
             DIV  AB
             DEC  R0
             MOV  @R0,A
             MOV  7DH,A
             DEC  R0
             MOV  @R0,B
             MOV  7EH,B
             RET
;-----------------------------------------------
ALERT_TH:
             MOV  79H,#0DH
             MOV  78H,#0BH
             MOV  A,TEMP_TH
             MOV  R0,#77H
             MOV  B,#064H
             DIV  AB
             CJNE  A,#01H,ALERT_TH1
             MOV  @R0,A
             JMP  ALERT_TH2
ALERT_TH1:   MOV  A,#0BH             ;显示“-”
             MOV  @R0,A
ALERT_TH2:   MOV  A,#0AH
             XCH  A,B
             DIV  AB
             DEC  R0
             MOV  @R0,A
             MOV  7DH,A
             DEC  R0
             MOV  @R0,B
             MOV  7EH,B
             RET
;===============================================
;报警值显示子程序
;===============================================
ALERT_PLAY:
             MOV  R1,#75H             ;指向显示数据首址
             MOV  R5,#7FH            ;扫描控制字初值
A_PLAY:      MOV  P0,#0FFH
             MOV  A,R5                ;扫描字放入A
             MOV  P2,A
             MOV  A,@R1               ;取显示数据到A
             MOV  DPTR,#ALERT_TAB     ;取段码表地址
             MOVC  A,@A+DPTR          ;查显示数据对应段码
             MOV  P0,A                ;段码放入P0口
             LCALL  DL_MS1            ;显示2MS
             INC  R1                  ;指向下一个地址
             MOV  A,R5
             JNB  ACC.3,ENDOUT1
             RR  A                    ;A 中数据循环左移
             MOV  R5,A                ;放入 R5 中
             AJMP  A_PLAY             ;跳回 PLAY 循环
ENDOUT1:     MOV  P0,#0FFH            ;一次显示结束,P0口复位
             MOV  P2,#0FFH            ;P2口复位
             RET

ALERT_TAB:
 DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0BFH,0C7H,89H
;共阳段码表 “0"  “1" “2" “3" “4"“5"“6"“7"“8"“9"“灭" “-"

DL_MS1:      MOV  R6,#0AH         ;2MS延时程序,LED 显示程序用
ADL1:        MOV  R7,#64H
ADL2:        DJNZ  R7,ADL2
             DJNZ  R6,ADL1
             RET
;===============================================
;蜂鸣器响一声子程序
;P3.7=0,蜂鸣器响
;===============================================
BEEP_BL:
         MOV  R6,#100
 BL2:    CALL  DEX1
         CPL  BEEP        ;对 P3.7 取反
         DJNZ  R6,BL2
         MOV  R5,#10
         CALL  DELAY
         RET
 DEX1:   MOV  R7,#180
 DE2:    NOP
         DJNZ  R7,DE2
         RET
DELAY:                    ;(R5)*延时10MS
         MOV  R6,#50
 DEL1:   MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,DEL1
         DJNZ  R5,DELAY
         RET
;==================================================
         END

⌨️ 快捷键说明

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