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

📄 lcd读取序列号.asm

📁 这是我自己编写的关于18B20序列号的读取程序!并在LCD上进行显示。可直接使用
💻 ASM
字号:
       RS  EQU  P2.5
       RW  EQU  P2.6
       E   EQU  P2.7
       LCD EQU  P1
TEMPER_L  EQU   31H             ;保存读出温度的低字节
TEMPER_H  EQU   30H             ;保存读出温度的高字节
FLAG    BIT     20H             ;标志位
DAT     BIT     P2.4            ;DS18B20数据线

;------------------------------主函数开始-----------------------------
        ORG     0000H
MAIN:
         MOV  LCD,#01H
         ACALL  ENABLE
         MOV  LCD,#38H
         ACALL  ENABLE
         MOV  LCD,#0FH
         ACALL  ENABLE
         MOV  LCD,#06H
         ACALL  ENABLE
;###############################################################         
;###############################################################         
START:                                ;                     ####
LCALL Set_18B20  ;调用初使化子程序    ;  这段是             ####
MOV A,#033H                           ;        不           ####
LCALL WRITE_1820  ;送入读ROM 命令     ;          是         ####
LCALL READ                            ;            你       ####
                                       ;             要     ####
MOV 50H,A                              ;               找   ####
LCALL READ                             ;            的程序  ####
                                       ;                    ####
MOV 51H,A                              ;                    ####
LCALL READ                             ;      ?             ####
MOV 52H,A                              ;                    ####
LCALL READ                             ;                    ####
MOV 53H,A                              ;                    ####
LCALL READ                            ;                     ####
MOV 54H,A                              ;                    ####
LCALL READ                             ;                    ####
MOV 55H,A                               ;                   ####
LCALL READ                               ;                  ####
MOV 56H,A                                 ;                 ####
LCALL READ                                 ;                ####
MOV 57H,A                                   ;               ####
;###############################################################
;###############################################################
MOV  R0,#50H
MOV  R7,#80H
DIPSP:  ACALL  CHAIZI
         MOV  DPTR,#TAB
         MOV  A,7FH
         MOVC  A,@A+DPTR
          MOV  LCD,R7
          ACALL  ENABLE
        ;  MOV   A,@R0
          ACALL  WRITE
          ACALL  BUSY
          
          MOV  DPTR,#TAB
         MOV  A,7EH
         MOVC  A,@A+DPTR  
          MOV  LCD,R7
          ACALL  ENABLE
      ;    MOV   A,@R0
          ACALL  WRITE
          ACALL  BUSY
          INC   R7
          INC  R0
          CJNE  R0,#58H,DIPSP
          SJMP  $                  
       
        AJMP    START
 CHAIZI:MOV   A,@R0
         MOV  B,A
         ANL  A,#0FH
         MOV  7FH,A
         MOV  A,B
         SWAP A
         ANL  A,#0FH
         MOV  7EH,A
         RET    

;-----------------------DS18B20的温度转换子程序-----------------------
GET_TEMPER:
        LCALL   Set_18B20
        MOV     A,#0CCH         ;跳过ROM匹配
        LCALL   WRITE_1820
        MOV     A,#44H          ;发出温度转换命令
        LCALL   WRITE_1820
        LCALL   DELAY; DISPLAY         ;用显示温度(持续1s左右)来等待AD转换结束,12位的话要转换750ms
        LCALL   Set_18B20       ;准备读温度前先初始化
        MOV     A,#0CCH         ;跳过ROM匹配
        LCALL   WRITE_1820
        MOV     A,#0BEH         ;发出读温度命令
        LCALL   WRITE_1820
        LCALL   READ_1820
        RET

;--------------------------DS18B20初始化程序--------------------------
Set_18B20:
        SETB    DAT
        NOP
        CLR     DAT
        MOV     R2,#250         ;主机发出延时500微秒的复位低脉冲
        DJNZ    R2,$
        SETB    DAT             ;然后拉高数据线
        MOV     R2,#30
        DJNZ    R2,$            ;延时60us等待DS18B20回应
        JNB     DAT,INIT1
        JMP     Set_18B20       ;超时而没有响应,重新初始化
INIT1:  MOV     R2,#120
        DJNZ    R2,$            ;延时240us
        JB      DAT,INIT2       ;数据变高,初始化成功
        JMP     Set_18B20
INIT2:  MOV     R2,#240
        DJNZ    R2,$
        RET

;-----------------写DS18B20的子程序(有具体的时序要求)-----------------
WRITE_1820:
        MOV     R2,#8           ;一共8位数据
WR0:    CLR     DAT
        MOV     R3,#6
        DJNZ    R3,$
        RRC     A
        MOV     DAT,C
        MOV     R3,#20
        DJNZ    R3,$
        SETB    DAT
        NOP
        NOP
        DJNZ    R2,WR0
        SETB    DAT
        RET
 READ:
        CLR A
MOV B,#8  ;连续读8 个bit

CLR C
RE1: SETB DAT
LCALL DELAY2us
        CLR DAT  ;读前总线保持为低
LCALL DELAY2us
SETB DAT  ;开始读总线释放
LCALL DELAY6us  ;持续8us

LCALL DELAY3us
LCALL DELAY6us  ; LCALL DELAY6us  ;持续8us持续8us
MOV C,DAT  ;从ds1820 总线读得一个bit
        RRC A   ;把读得的位值环移给 A
        MOV R1,#10
LOOP6:  LCALL DELAY6us

  DJNZ R1,LOOP6 ;持续60us
DJNZ B,RE1  ;读下一个bit
SETB DAT  ;重新释放ds1820 总线
RET


;------读DAT的程序,从DAT中读出两个字节的温度数据--------------------------
READ_1820:
        MOV     R4,#2           ;将温度高位和低位从DAT中读出
        MOV     R1,#TEMPER_L    ;低位存入31H(TEMPER_L)
RE0:    MOV     R2,#8
RE11:    SETB    DAT
        NOP
        NOP
        CLR     DAT
        NOP
        NOP
        SETB    DAT
        MOV     R3,#4
        DJNZ    R3,$
        MOV     C,DAT
        RRC     A
        MOV     R3,#30
        DJNZ    R3,$
        DJNZ    R2,RE11
        MOV     @R1,A
        DEC     R1              ;高位存入30H(TEMPER_H)
        DJNZ    R4,RE0
        RET
          MOV  LCD,#80H
          ACALL  ENABLE
          MOV   A,#'R'
          ACALL  WRITE
          ACALL  BUSY
    WRITE:   ACALL BUSY             
               CLR E                              
               SETB RS                        
               CLR RW                         
               SETB E                          
               MOV LCD,A                      
               CLR E                            
               RET    
ENABLE:  CLR  RS
         CLR  RW
         CLR  E
         ACALL  BUSY
         SETB  E
         RET
BUSY:    MOV  LCD,#0FFH
         CLR RS
         SETB  RW
         CLR  E
         NOP
         SETB  E
         JB  P1.7,BUSY   
         RET
         DELAY:  MOV    R7,#0FFH
DE1:    MOV    R6,#0FFH
DE2:    MOV    R5,#2
        DJNZ   R5,$
        DJNZ   R6,DE2
        DJNZ   R7,DE1
        RET
DELAY2us:NOP
         NOP
         RET
DELAY3us:NOP
         NOP
         NOP
         RET
DELAY6us:NOP
         NOP
         NOP
         NOP
         NOP
         NOP
         RET
 TAB:        
 DB 30H,30H,32H,33H,34H,35H,36H,37H,38H,39H,41H,42H,43H,44H,45H                                
        END

⌨️ 快捷键说明

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