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

📄 多点测温.asm

📁 用DS18B20实现多点和单点测温
💻 ASM
字号:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        LU  EQU 40H
        LU1 EQU 30H
        LU2 EQU 38H      ;存放第二个1820数据序列号地址
        LATCH EQU P1.7   ;595放数
        DAT BIT P1.6     ;18B20的数据端
        SHU EQU P1.5     ;595数据输入
        CP  EQU P1.2     ;595时钟输入
        TH EQU 100       ;高温报警点100
        TL EQU 0         ;低温报警点0
        WDG8  DATA 23H   ;温度高8位
        WDD8  DATA 24H   ;温度低8位
        WDXS1 DATA 43H   ;用三位温度显示
        WDXS2 DATA 44H
        WDXS3 DATA 45H
        POINT BIT   7FH  ;小数点标志位,该位为1表示有小数点
        K1 BIT P3.1
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ORG 0000H
        LJMP START
        ORG 0030H
START:  LCALL CRAM
        CLR LATCH
        MOV DPTR,#TAB        
         ;此处写入ROM1序号
         MOV 30H,#28H
         MOV 31H,#80H
         MOV 32H,#0A4H
         MOV 33H,#6EH
         MOV 34H,#00H
         MOV 35H,#00H
         MOV 36H,#00H
         MOV 37H,#5DH
         ;ROM2序号
         MOV 38H,#28H
         MOV 39H,#3AH
         MOV 3AH,#0F6H
         MOV 3BH,#78H
         MOV 3CH,#01H
         MOV 3DH,#00H
         MOV 3EH,#00H
         MOV 3FH,#19H



XSS:    MOV 70H,#004H
XS:     LCALL INT       ;初始化
        LCALL DISPLAY   ;显示
        LCALL RESET
        MOV A,#055H     ;Match ROM  1
        LCALL WRITE
        MOV LU,#01H
        MOV R0,#LU1      ;R0保存序列号的初始地址
        MOV R7,#08H
LOOP:   MOV A,@R0
        LCALL WRITE
        INC R0
        DJNZ R7,LOOP
        LCALL READT
        LCALL SJZH_1820
        LCALL DISPLAY   ;显示
        LCALL DELAY
        DJNZ  70H,XS
        MOV 70H,#04H
XS1:    LCALL INT       ;初始化
        LCALL DISPLAY   ;显示
        LCALL RESET
        MOV A,#055H     ;Match ROM  1
        LCALL WRITE
        MOV LU,#02H
        MOV R0,#LU2      ;R0保存序列号的初始地址
        MOV R7,#08H
LOOP1:   MOV A,@R0
        LCALL WRITE
        INC R0
        DJNZ R7,LOOP1
        LCALL READT
        LCALL SJZH_1820
        LCALL DISPLAY   ;显示
        LCALL DELAY
        DJNZ  70H,XS1
        LJMP XSS




        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT:    LCALL RESET     ;初始化
        MOV A,#0CCH     ;跳过ROM
        LCALL WRITE
        MOV A,#4EH      ;写暂存存储器
        LCALL WRITE
        MOV A,#TH       ;高温报警点
        LCALL WRITE
        MOV A,#TL       ;低温报警点
        LCALL WRITE
        MOV A,#7FH      ;取12位精度
        LCALL WRITE

        LCALL RESET ;调用初使化子程序
        MOV A,#0CCH
        LCALL WRITE ;送入跳过ROM命令
        MOV A, #44H
        LCALL WRITE ;送入温度转换命令
        RET
;;;;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;;;;
SJZH_1820: CLR POINT    ;;清温度小数点标志位
        MOV A,WDG8
        JNB ACC.3,WDZS  ;;判断正负
WDFU:                   ;;温度负
        MOV A,#00H
        SUBB A,WDD8     ;;先减低8位
        MOV WDD8,A
        MOV A,#00H
        SUBB A,WDG8
        MOV WDG8,A
        MOV WDXS1,#0AH  ;存放"-"号代码的位置在表的第十一个
        MOV A,WDG8
        ANL A,#07H
        SWAP A
        MOV WDG8,A
        MOV A,WDD8
        ANL A,#0F0H
        SWAP A
        ORL A,WDG8
        MOV WDG8,A
        CLR C
        CJNE A,#10,WD_NEXT
WD_NEXT:JNC WD_WUXIAOSHU
        SETB POINT
        MOV WDXS2,WDG8 ;;有小数部分时显示"-8.2"
;;小数部分
        MOV A,WDD8  ;;温度的低8字节
        ANL A,#0FH    ;;小数部分乖10除16,取商
        MOV B,#10
        MUL AB        ;;BA
        MOV B,#16
        DIV AB         ;;商A余B
        MOV WDXS3,A
        RET
WD_WUXIAOSHU:       ;温度无小数部分
        MOV B,#10H
        DIV AB
        MOV WDXS2,A
        MOV WDXS3,B
        RET

WDZS:                  ;;温度为正数
        MOV A,WDG8
        ANL A,#07H
        SWAP A
        MOV WDG8,A
        MOV A,WDD8
        ANL A,#0F0H
        SWAP A
        ORL A,WDG8
        MOV WDG8,A
        MOV B,#100
        DIV AB
        JNZ BAIDU  ;;A不为0则上百度的温度
        SETB POINT  ;置有小数点标志位
        MOV A,B
        MOV B,#10
        DIV AB
        MOV WDXS1,A
        MOV WDXS2,B
;;;;计算小数部分
        MOV A,WDD8  ;;温度的低8字节
        ANL A,#0FH    ;;小数部分乖10除16,取商
        MOV B,#10
        MUL AB        ;;BA
        MOV B,#16
        DIV AB         ;;商A余B
        MOV WDXS3,A
        RET
BAIDU:  MOV WDXS1,#01H
        MOV A,B
        MOV B,#10H
        DIV AB
        MOV WDXS2,A
        MOV WDXS3,B
        RET
;;;;;;;;;;;;;;;;;;;显示;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISPLAY:MOV A,LU
        MOVC A,@A+DPTR
        LCALL FS
        MOV A,WDXS1
        CJNE A,#00H,ZZE    ;温度第一位为0时显示为黑
        MOV A,#0FFH
        AJMP ZZZ
ZZE:    MOVC A,@A+DPTR
ZZZ:    LCALL FS
        MOV A,WDXS2         ;温度第二位在100以上,-10以下不带小数点,其它情况都带点
        MOVC A,@A+DPTR
        JNB POINT,ZZZZ
        CLR ACC.7      ;小数点为ACC。7,共阳数码管
ZZZZ:   LCALL FS
        MOV A,WDXS3
        MOVC A,@A+DPTR
        LCALL FS
        CLR LATCH
        NOP
        SETB LATCH
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
FS:     MOV R3,#08H                    ;发一位数码管
    Y8C:RRC A
        CLR CP          
        MOV SHU,C        
        SETB CP
        DJNZ R3,Y8C      ;移8次
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READT:  MOV A,#0BEH
        LCALL WRITE ;送入读温度暂存器命令
        LCALL READ
        MOV 24H,A ;读出温度值低字节存入24H
        LCALL READ
        MOV 23H,A ;读出温度值高字节存入23H
        LCALL RESET
        RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ :  MOV R6,#08H
   RD1: CLR DAT
        MOV R5,#6
        NOP
        SETB DAT
        DJNZ R5,$   ;延时12us
        MOV C,DAT
        RRC A
        MOV R4,#30  ;延时60us
        DJNZ R4,$
        DJNZ R6,RD1
        SETB DAT
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRITE:  MOV R6,#8
   WT1: SETB DAT
        MOV R5,#8
        RRC A
        CLR DAT
        DJNZ R5,$    ;延时16us
        MOV DAT,C
        MOV R4,#30   ;延时60us
        DJNZ R4,$
        DJNZ R6,WT1  ;移位8次
        SETB DAT
        RET

        ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET:  CLR DAT
        MOV R7,#250
        DJNZ R7,$     ;保持低电平500us
        SETB DAT
        MOV R7,#30
  RE0:  JNB DAT,RE1
        DJNZ R7,RE0   ;释放等待16~60us
        LJMP RE2
  RE1:  SETB 00H      ; 置标志位,表示DS1820存在
        LJMP RE3
  RE2:  CLR 00H       ; 清标志位,表示DS1820不存在
        LJMP RE4
  RE3:  MOV R7,#240
        DJNZ R7,$
  RE4:  RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRAM:   MOV R7,#60H     ;清内存
        MOV A,#00H
        MOV R1,#23H
 CRAM1: MOV @R1,A
        INC R1
        DJNZ R7,CRAM1
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:  MOV 7DH,#4      ;每秒发一次数据
   DL3: MOV 7FH,#0E0H
   DL1: MOV 7EH,#00H
   DL2: DJNZ 7EH,DL2
        DJNZ 7FH,DL1
        DJNZ 7DH,DL3
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:  ;0-9
DB   081H,0CFH,092H,086H,0CCH,0A4H,0A0H,08FH,080H,084H
; "-"
DB   0FEH
  ;A,b,C,d,E,F
DB	 088H,0e0H,0B1H,0C2H,0B0H,0B8H

⌨️ 快捷键说明

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