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

📄 修改.asm

📁 这是我自己编写的1602和18B20的原程序!以通过实验!
💻 ASM
字号:
       RS  EQU  P2.5
       RW  EQU  P2.6
       E   EQU  P2.7
       lcd  equ p1
TEMPER_L   EQU 29H;用于保存读出温度的低8位
TEMPER_H   EQU 28H;用于保存读出温度的高8位
FLAG1      EQU 38H;是否检测到DS18B20标志位
a_bit      equ 20h ;数码管个位数存放内存位置
b_bit      equ 21h ;数码管十位数存放内存位置
     ORG 0000H

START:  SETB  F0
        LCALL   GET_TEMPER      ;调用读温度子程序
       ; MOV   28H,#00H
        ;MOV   29H,#80H
        ANL  28H,#0FH    ;将结果进行转换
        ANL  29H,#0F0H
        MOV  A,28H
        ORL  A,29H
        SWAP A
        MOV  29H,A      ;转换结果的八位数值放在29H中  
        MOV  B,#10     ;将所读出的 数值转换位两位十进制数值
        DIV  AB
        ANL  A,#0FH
        ORL  A,#30H
        MOV  B_BIT,A    ;数码管十位数存放内存位置
        MOV  A,B
        ANL  A,#0FH
        ORL  A,#30H        
        MOV  A_BIT,A    ;数码管个位数存放内存位置
        
         MOV  LCD,#01H       ;LCD初始化
         ACALL  ENABLE
         MOV  LCD,#38H
         ACALL  ENABLE
         MOV  LCD,#0FH
         ACALL  ENABLE
         MOV  LCD,#06H
         ACALL  ENABLE


         MOV  LCD,#80H               ;1602显示  第一行显示
          ACALL  ENABLE
          MOV     A,#31H            ;显示1   
          ACALL  WRITE
          ACALL  BUSY
          
         MOV  LCD,#81H                 
          ACALL  ENABLE                
          MOV   A,#3AH             ;显示 :
          ACALL  WRITE
          ACALL  BUSY
             
         MOV  LCD,#82H                 
          ACALL  ENABLE                
          MOV   A,B_BIT           ;显示高位
          ACALL  WRITE
          ACALL  BUSY
         MOV  LCD,#83H                 
          ACALL  ENABLE                
          MOV   A,A_BIT           ;显示低位
          ACALL  WRITE
          ACALL  BUSY
          
         MOV  LCD,#84H                
          ACALL  ENABLE                
          MOV   A,#0DFH           ;显示℃
          ACALL  WRITE
          ACALL  BUSY
         MOV  LCD,#85H                
          ACALL  ENABLE                
          MOV   A,#43H
          ACALL  WRITE
          ACALL  BUSY
          
          ;这里还却一个判断!通过判断来改变F0值------判断我没写,想让你练练以熟悉程序!

          ;下面这里我给你加入一个标志位F0,来决定是不是因为超过温度显示   >!!℃
          ;你在程序的某个地方做一个判断小程序,来比较当前温度值与设定值的大小
          ;方法:如果现在温度超过所定温度就将F0清零
          ;因为我在开始已经把测量得到的数值放在29H中,你可以将设定温度与29H比较
          ;这个温度的数值你自己定!提示:30℃ --#1EH     5℃--#05H
          ;当29H=#1EH时候       LCD显示30°C

          JB   F0,BAN_START       ;判断是否超过温度   标志位F0
          MOV  LCD,#89H           ;如果超过就会显示你要求的 那部分东西      
          ACALL  ENABLE                
          MOV   A,#29H
          ACALL  WRITE
          ACALL  BUSY
          MOV  LCD,#8AH                
          ACALL  ENABLE                
          MOV   A,#33H
          ACALL  WRITE
          ACALL  BUSY
          MOV  LCD,#8BH                
          ACALL  ENABLE                
          MOV   A,#30H
          ACALL  WRITE
          ACALL  BUSY
         MOV  LCD,#8CH                
          ACALL  ENABLE                
          MOV   A,#0DFH           ;显示℃
          ACALL  WRITE
          ACALL  BUSY
         MOV  LCD,#8DH                
          ACALL  ENABLE                
          MOV   A,#43H
          ACALL  WRITE
          ACALL  BUSY                 
          
                                      
BAN_START:    AJMP START   

; 读出转换后的温度值
GET_TEMPER:
        SETB P3.0
        LCALL INIT_1820;先复位DS18B20
        JB FLAG1,TSS2
        CLR P3.7
        RET ; 判断DS1820是否存在?若DS18B20不存在则返回
TSS2:   setb p3.7;DS18B20已经被检测到!!!!!!!!!!!!!!!!!!指示灯亮
        MOV A,#0CCH ; 跳过ROM匹配
        LCALL WRITE_1820
        MOV A,#44H ; 发出温度转换命令
        LCALL WRITE_1820

        ;这里通过调用显示子程序实现延时一段时间,等待AD转换结束,12位的话750微秒
     ;   LCALL DISPLAY
        MOV   R7,#250
 DE1:   NOP
        NOP
        DJNZ  R7,DE1
        LCALL INIT_1820;准备读温度前先复位
        MOV A,#0CCH ; 跳过ROM匹配
        LCALL WRITE_1820
        MOV A,#0BEH ; 发出读温度命令
        LCALL WRITE_1820
        LCALL READ_18200; 将读出的温度数据保存到35H/36H
        CLR P3.7       ;指示灯灭
        RET
;===================================================
; 这是DS18B20复位初始化子程序
INIT_1820:
        SETB P3.0
        NOP
        CLR P3.0
        ;主机发出延时537微秒的复位低脉冲
        MOV R1,#3
TSR1:   MOV R0,#107
        DJNZ R0,$
        DJNZ R1,TSR1
        SETB P3.0;然后拉高数据线
        NOP
        NOP
        NOP
        MOV R0,#25H
TSR2:   JNB P3.0,TSR3;等待DS18B20回应
        DJNZ R0,TSR2
        LJMP TSR4 ; 延时
TSR3:   SETB FLAG1 ; 置标志位,表示DS1820存在

        setb P3.7;检查到DS18B20就点亮P1.7LED
        
        LJMP TSR5
TSR4:   CLR FLAG1 ; 清标志位,表示DS1820不存在

        CLR P3.7
        
        LJMP TSR7
TSR5:   MOV R0,#117
TSR6:   DJNZ R0,TSR6 ; 时序要求延时一段时间
TSR7:   SETB P3.0
        RET

        ;写DS18B20的子程序(有具体的时序要求)
WRITE_1820:
        MOV R2,#8;一共8位数据
        CLR C
WR1:    CLR P3.0
        MOV R3,#6
        DJNZ R3,$
        RRC A
        MOV P3.0,C
        MOV R3,#23
        DJNZ R3,$
        SETB P3.0
        NOP
        DJNZ R2,WR1
        SETB P3.0
        RET

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

        ; 读DS18B20的程序,从DS18B20中读出两个字节的温度数据
READ_18200:
        MOV R4,#2 ; 将温度高位和低位从DS18B20中读出
        MOV R1,#29H ; 低位存入29H(TEMPER_L),高位存入28H(TEMPER_H)
RE00:   MOV R2,#8;数据一共有8位
RE01:   CLR C
        SETB P3.0
        NOP
        NOP
        CLR P3.0
        NOP
        NOP
        NOP
        SETB P3.0
        MOV R3,#9
RE10:   DJNZ R3,RE10
        MOV C,P3.0
        MOV R3,#23
RE20:   DJNZ R3,RE20
        RRC A
        DJNZ R2,RE01
        MOV @R1,A
        DEC R1
        DJNZ R4,RE00
        RET
        
;这下面就是1602的子程序,你复制就可以!        
        
     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

         END



⌨️ 快捷键说明

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