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

📄 18b20温度时间显示键盘设置1113.asm

📁 DS18B20的技术资料
💻 ASM
📖 第 1 页 / 共 2 页
字号:

        ;年设置
        mov 4dh,#3ch
        MOV A,#85H              ;DDRAM第1行首地址
        ACALL WRI
        MOV A,#3ch              ;写修改标志
        LCALL WRD
        lcall timeset5          ;年设置
        mov 4dh,#2fh
        MOV A,#85H              ;DDRAM第1行首地址
        ACALL WRI
        MOV A,#2fh              ;清修改标志
        LCALL WRD
        lcall write12c887
        setb ea
        reti
        ;时间设置子程序,按p2.0退出
timeset1:jb p2.2,inctime  ;分减1
        ;jnb p2.2,$
        acall dl3

        jb p2.2,inctime
        mov a,42h
        cjne a,#30h,decminite1  ;判断分是否为零
        mov 42h,#39h
        mov a,43h
        cjne a,#30h,decminite10  ;判断十分位,为0则小时减一
        mov 43h,#35h

       ajmp decdisplay
decminite1:dec 42h
        ajmp decdisplay
decminite10:dec 43h
decdisplay:
           lcall displayline1   ;送液晶显示

           jb p2.0,timeset1
           jnb p2.0,$
           lcall dl1
           ret

inctime:jb p2.3,timeset1back ;分加1
        acall dl3
        jb p2.3,timeset1back
        mov a,42h
        cjne a,#39h,incminite1
        mov 42h,#30h
        mov a,43h
        cjne a,#35h,incminite10
        mov 43h,#30h
        ljmp incdisplay
incminite1:inc 42h
           ajmp incdisplay
incminite10:inc 43h
incdisplay: lcall displayline1
timeset1back:jb p2.0,cintinuetimeset
          jnb p2.0,$
          lcall dl1
timesetback:ret
cintinuetimeset:ljmp timeset1
       ;小时设置子程序
timeset2:jb p2.2,inchour  ;分减1
        acall dl3
        jb p2.2,inchour
        mov a,45h
        cjne a,#30h,dechour1

        mov a,46h
        cjne a,#30h,dechour10
        mov 45h,#33h
        mov 46h,#32h
        ljmp sethourdisplay
dechour1:dec 45h
        ljmp sethourdisplay
dechour10:dec 46h
        mov 45h,#39h
        ljmp sethourdisplay
inchour:jb p2.3,timeset2back ;小时加1
        acall dl3
        jb p2.3,timeset2back
        mov a,45h
        cjne a,#33h,inchour1
        mov a,46h
        cjne a,#30h,inchourcontinue1
        inc 45h
        ljmp sethourdisplay
inchourcontinue1:cjne a,#31h,inchourcontinue2
        inc 45h
        ljmp sethourdisplay
inchourcontinue2:mov 45h,#30h
        mov 46h,#30h
        ljmp sethourdisplay
inchour1:inc 45h

sethourdisplay:lcall displayline1
timeset2back:  jb p2.0,timeset2
        jnb p2.0,$
        lcall dl1
        ret
        ;日设置子程序
timeset3:jb p2.2,incday  ;日减1
        acall dl3
        jb p2.2,incday
        mov a,48h
        cjne a,#30h,decday1
        mov a,49h
        cjne a,#30h,decday10
        mov 48h,#30h
        mov 49h,#33h
        ajmp setdaydisplay
decday1:dec 48h
       ajmp setdaydisplay
decday10:dec 49h
         mov 48h,#39h
       ajmp setdaydisplay
incday: jb p2.3,timeset3back ;日期加1
        acall dl3
        jb p2.3,timeset3back
        mov a,49h
        cjne a,#33h,incdaynext1
        mov 49h,#30h
        mov 48h,#30h
        ajmp setdaydisplay
incdaynext1:mov a,48h
        cjne a,#39h,incday1
        mov 48h,#30h
        inc 49h
        ajmp setdaydisplay
incday1:inc 48h
        ajmp setdaydisplay

setdaydisplay:lcall displayline1
timeset3back:jb p2.0,timeset3
       jnb p2.0,$
       lcall dl1
        ret
        ;月份设置子程序
timeset4:jb p2.2,incmonth  ;月减1
        acall dl3
        jb p2.2,incmonth
        mov a,4bh
        cjne a,#30h,decmonth1
        mov a,4ch
        cjne a,#30h,decmonth10
        mov 4bh,#32h
        mov 4ch,#31h
        ajmp setmonthdisplay
decmonth1:dec 4bh
        ajmp setmonthdisplay
decmonth10:dec 4ch
           mov 4bh,#39h
        ajmp setmonthdisplay
incmonth:jb p2.3,timeset4back ;月加1
        acall dl3
        jb p2.3,timeset4back
        mov a,4ch
        cjne a,#31h,incmonth0
        mov a,4bh
        cjne a,#32h,incmonth1
        mov 4ch,#30h
        mov 4bh,#30h
        ajmp setmonthdisplay
incmonth0:
        mov a,4bh
        cjne a,#39h,incmonth1
        mov 4ch,#31h
        mov 4bh,#30h
        ajmp setmonthdisplay
incmonth1:inc 4bh
        ajmp setmonthdisplay

setmonthdisplay:lcall displayline1
timeset4back:   jb p2.0,timeset4
        jnb p2.0,$
        lcall dl1
         ret
         ;年设置子程序
timeset5:jb p2.2,incyear  ;年减1
        acall dl3
        jb p2.2,incyear
        mov a,4eh
        cjne a,#30h,decyear1
        mov a,4fh
        cjne a,#30h,decyear10
        mov 4eh,#39h
        mov 4fh,#39h
        ajmp setyeardisplay

decyear1:dec 4eh
         ajmp setyeardisplay
decyear10:dec 4fh
         ajmp setyeardisplay
incyear:jb p2.3,timeset5back ;年加1
        acall dl3
        jb p2.3,timeset5back
        mov a,4eh
        cjne a,#39h,incyear1
        mov 4eh,#30h
        mov a,#4fh
        cjne a,#39h,incyear10
        mov 4eh,#30h
        ajmp setyeardisplay
incyear1:inc 4eh
         ajmp setyeardisplay
incyear10:inc 4fh
         ajmp setyeardisplay
setyeardisplay:lcall displayline1
timeset5back:  jb p2.0,timeset5
        jnb p2.0,$
        lcall dl1
         ret

          ;温度报警设置子程序
int1reset:lcall tempsetdisplay
          jb p2.2,int1next0
          dec r1
          jnb p2.2,$
          ajmp int1reset
int1next0:jb p2.3,int1next1
          inc r1
          jnb p2.3,$
          ajmp int1reset
int1next1:jb p2.1,int1reset
          jnb p2.1,$
          ret

tempsetdisplay:
        MOV DPTR,#TEMP_TAB   ;将r1中温度转换成bcd码
        mov a,r1
        MOVC A,@A+DPTR
        mov r2,a
        swap a
        anl a,#0fh
        mov dptr,#asc11
        movc a,@a+dptr
        mov 24h,a
        mov a,r2
        anl a,#0fh
        mov dptr,#asc11
        movc a,@a+dptr
        mov 25h,a
        lcall wriline2
        ret
write12c887: mov dptr,#8f0bh
         mov a,#82h
         movx @dptr,a

         mov a,43h       ;minite
         anl a,#0fh
         swap a
         anl 42h,#0fh
         orl a,42h
         mov dptr,#8f02h
         movx @dptr,a

         mov a,46h      ;hour
         anl a,#0fh
         swap a
         anl 45h,#0fh
         orl a,45h
         mov dptr,#8f04h
         movx @dptr,a

         mov a,49h   ;day
         anl a,#0fh
         swap a
         anl 48h,#0fh
         orl a,48h
         mov dptr,#8f07h
         movx @dptr,a

         mov a,4ch       ;month
         anl a,#0fh
         swap a
         anl 4bh,#0fh
         orl a,4bh
         mov dptr,#8f08h
         movx @dptr,a

         mov a,4fh       ;year
         anl a,#0fh
         swap a
         anl 4eh,#0fh
         orl a,4eh
         mov dptr,#8f09h
         movx @dptr,a

         mov dptr,#8f0bh
         mov a,#12h        ;初始化b
         movx @dptr,a
         ret
;------------------重新写DS18B20暂存存储器设定值
RE_CONFIG:
        LCALL INIT_1820
        JB FLAG1,RE_CONFIG1 ; 若DS18B20存在,转RE_CONFIG1
        LJMP RE_CONFIG
RE_CONFIG1:
        MOV A,#0CCH ; 发SKIP ROM命令
        LCALL WRITE_1820
        MOV A,#4EH ; 发写暂存存储器命令
        LCALL WRITE_1820

        MOV A,TEMPER_L ; TH(报警上限)中写入1820
        LCALL WRITE_1820
        MOV A,TEMPER_H; TL(报警下限)中写入1820
        LCALL WRITE_1820
        MOV A,#7FH ; 选择12位温度分辨率
        LCALL WRITE_1820

;将温度报警值考入e2prom
RE_CONFIG2:LCALL INIT_1820
           JB FLAG1,RE_CONFIG3 ; 若DS18B20存在,转RE_CONFIG1
           LJMP RE_CONFIG2
RE_CONFIG3:
           MOV A,#0CCH ; 发SKIP ROM命令
           LCALL WRITE_1820
           mov a,#48h
           lcall write_1820
           lcall write1820delay
           RET

WRI:
      CLR p2.4
      clr p2.5
      ;MOV A,R3
      MOV P1,A
      SETB p2.6
      ACALL DL1
      CLR p2.6
      RET
WRD:  SETB p2.4
      CLR p2.5
      MOV P1,A
      SETB p2.6
      ACALL DL1
      CLR p2.6
      RET

;------------------延时子程序
DELAY:MOV R7,#00H
MIN:  DJNZ R7,YS500
      RET
YS500:LCALL YS500US
      LJMP MIN
YS500US:MOV R6,#00H
      DJNZ R6,$
      RET
DELAY1:MOV R7,#20H
      DJNZ R7,$
      RET
 ;将报警温度值重新装入1820,延时
write1820delay:
       mov r2,#0ffh
write1820delay1:
       mov r3,#0ffh
       djnz r3,$
       djnz r2,write1820delay1
       ret

DL1:   MOV R2,#0aH
DL2:   MOV R3,#0FFH
       DJNZ R3,$
       DJNZ R2,DL2
       RET
dl3:  mov r2,#0ffh
dl4:  mov r3,#0ffh
      djnz r3,$
      djnz r2,dl4
      ret

TEMP_TAB:
DB 00H,01H,02H,03H,04H,05H,06H,07H
DB 08H,09H,10H,11H,12H,13H,14H,15H
DB 16H,17H,18H,19H,20H,21H,22H,23H
DB 24H,25H,26H,27H,28H,29H,30H,31H
DB 32H,33H,34H,35H,36H,37H,38H,39H
DB 40H,41H,42H,43H,44H,45H,46H,47H
DB 48H,49H,50H,51H,52H,53H,54H,55H
DB 56H,57H,58H,59H,60H,61H,62H,63H
DB 64H,65H,66H,67H,68H,69H,70H,71H
DB 72H,73H,74H,75H,76H,77H,78H,79H
DB 80H,81H,82H,83H,84H,85H,86H,87H
DB 88H,89H,90H,91H,92H,93H,94H,95H
DB 96H,97H,98H,99H

CHATAB:
       DB 54H,45H,4DH,50H,3aH

ASC11 :DB 30H,31H,32H,33H,34H                    ;ASC表0-9
       DB 35H,36H,37H,38H,39H


	      ;***************************************************************************************
;***                 双字节二进制整数转换成BCD码子程序                              ****
;***       把R4R5中的双字节二进制整数转换成5位BCD码放在(R0)指向的5个字节中          ****
;***       入口:R4R5中存放双字节二进制整数,(R0+4)(R0+3)(R0+2)(R0+1)(R0)=XXXXX      ****
;***       出口:5位BCD码放在(R0)指向的内存单元中                                   ****
;***       使用寄存器:A,B,R0,R2,R3,R6,R7,调用程序NDIV                              ****
;***************************************************************************************
IBID:  MOV   B,#5
       MOV   R6,#0
       MOV   R7,#10
IBTL1: MOV   R2,#0
       MOV   R3,#0
       PUSH  B
       LCALL NDIV
       POP   B
       MOV   A,R3
       MOV   @R0,A
       INC   R0
       DJNZ  B,IBTL1
       RET 
;***************************************************************************************
;***     (R2R3R4R5)/(R6R7)=(R4R5),余数在(R2R3)中,若(R2R3)>=(R6R7)则为溢出,置位F0  ****
;***      入口:R2R3R4R5中存放被除数,R6R7中存放除数                                ****
;***      出口:商存放在R4R5中,余数存放在R2R3中                                    ****
;***      使用寄存器:A,R1~R7,C,F0                                                  ****
;***************************************************************************************
NDIV:  MOV  A,R3
       CLR  A
       SUBB A,R7
       MOV  A,R2
       SUBB A,R6
       JNC  NDVE1
       MOV  B,#16
NDVL1: CLR  C
       MOV  A,R5
       RLC  A
       MOV  R5,A
       MOV  A,R4
       RLC  A
       MOV  R4,A
       MOV  A,R3
       RLC  A
       MOV  R3,A
       XCH  A,R2
       RLC  A
       XCH  A,R2
       MOV  F0,C
       CLR  C
       SUBB A,R7
       MOV  R1,A
       MOV  A,R2
       SUBB A,R6
       JB   F0,NDVM1
       JC   NDVD1
NDVM1: MOV  R2,A
       MOV  A,R1
       MOV  R3,A
       INC  R5
NDVD1: DJNZ B,NDVL1
       CLR  F0
       RET
NDVE1: SETB F0
       RET 

      end

⌨️ 快捷键说明

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