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

📄 单点测温.asm

📁 用DS18B20实现多点和单点测温
💻 ASM
字号:
        LATCH EQU P1.7   ;595放数
        SHU EQU P1.5     ;595数据输入
        CP  EQU P1.2     ;595时钟输入
        DAT_1820 BIT P1.6 ;18B20的数据端
        TH EQU 100       ;高温报警点100
        TL EQU 0         ;低温报警点0
        WDG8  DATA 30H    ;温度高8位
        WDD8  DATA 31H    ;温度低8位
        WDXS1 DATA 33H   ;;用三位温度显示
        WDXS2 DATA 34H
        WDXS3 DATA 35H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;要注意的问题,此程序用了两个0~9的表格,即,先是不带带的0~9,后面是带小数点的0~9
;;表格的最后面,即第21个数据为"-"号,负号,在零下时候使用
;;计算过程中用到了 WDG8,WDD8,WDXS1,WDXS2,WDXS3,A,B,R0,R4,R5,R6,R7和延时里面的单元
;;端口用了一个18B20的一个数据端口,和595的放数端口,显示为三位显示
;;显示格式例如:-10度,-2.5度,05.5度,22.3度,100度
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
        ORG 0000H
        LJMP START
        ORG 0030H
START:  LCALL CRAM
        CLR LATCH
        MOV DPTR,#TAB
        LCALL INT_1820       ;初始化
        LCALL DISPLAY   ;显示
LOOP:   LCALL READT_1820     ;读温度
        LCALL SJZH_1820
        LCALL DISPLAY   ;显示
        LCALL DELAY
        LCALL INT_1820       ;初始化
        LJMP LOOP
;;;;;;;;;;;;;;;;;;;数据转换;;;;;;;;;;;;;;;;;;
SJZH_1820:
        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,#15H  ;存放"-"号代码的位置在表的第二十一个,即15H
        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

        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则上百度的温度
        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 DPTR,#TAB
        MOV A,WDXS1
        MOVC A,@A+DPTR
        LCALL FS
        MOV A,WDXS1
        MOVC A,@A+DPTR
        LCALL FS
        MOV A,WDXS2
        MOVC A,@A+DPTR
        CLR ACC.7
        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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INT_1820:
        LCALL RESET_1820     ;初始化
        MOV A,#0CCH     ;跳过ROM
        LCALL WRITE_1820
        MOV A,#4EH
        LCALL WRITE_1820
        MOV A,#TH       ;高温报警点
        LCALL WRITE_1820
        MOV A,#TL       ;低温报警点
        LCALL WRITE_1820
        MOV A,#7FH      ;取12位精度
        LCALL WRITE_1820
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CRAM:   MOV R7,#60H     ;清内存
        MOV A,#00H
        MOV R0,#23H
 CRAM1: MOV @R0,A
        INC R0
        DJNZ R7,CRAM1
        RET

READT_1820:
        LCALL RESET_1820 ;调用初使化子程序
        MOV A,#0CCH
        LCALL WRITE_1820 ;送入跳过ROM命令
        MOV A, #44H
        LCALL WRITE_1820 ;送入温度转换命令
        LCALL RESET_1820  ;温度转换完全,再次初使化ds1820
        MOV A,#0CCH
        LCALL WRITE_1820 ;送入跳过ROM命令
        MOV A,#0BEH
        LCALL WRITE_1820 ;送入读温度暂存器命令
        LCALL READ_1820
        MOV WDD8,A ;读出温度值低字节存入24H
        LCALL READ_1820
        MOV WDG8,A ;读出温度值高字节存入23H
        LCALL RESET_1820
        RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WRITE_1820:  MOV R6,#8
   WT1: SETB DAT_1820
        MOV R5,#8
        RRC A
        CLR DAT_1820
        DJNZ R5,$    ;延时16us
        MOV DAT_1820,C
        MOV R4,#30   ;延时60us
        DJNZ R4,$
        DJNZ R6,WT1  ;移位8次
        SETB DAT_1820
        RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READ_1820:  MOV R6,#08H
   RD1: CLR DAT_1820
        MOV R5,#6
        NOP
        SETB DAT_1820
        DJNZ R5,$   ;延时12us
        MOV C,DAT_1820
        RRC A
        MOV R4,#30  ;延时60us
        DJNZ R4,$
        DJNZ R6,RD1
        SETB DAT_1820
        RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
RESET_1820:  CLR DAT_1820
        MOV R7,#250
        DJNZ R7,$     ;保持低电平500us
        SETB DAT_1820
        MOV R7,#30
  RE0:  JNB DAT_1820,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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:  MOV 7DH,#8      ;每秒发一次数据
   DL3: MOV 7FH,#00H
   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
  ;A,b,C,d,E,F
DB	 088H,0e0H,0B1H,0C2H,0B0H,0B8H
END

⌨️ 快捷键说明

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