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

📄 zong.asm

📁 奉上刚做好的测温小制作--基于DS18B20传感器 今个学期刚学了单片机
💻 ASM
📖 第 1 页 / 共 2 页
字号:
            NOP
            SETB P1.6
            MOV R3,#5
            DJNZ R3, $
            MOV C,P1.6
            MOV R3,#20
            DJNZ R3, $
            RRC A
            DJNZ R2,RE31
            MOV @R1,A
            DEC R1        ; 高位存入2EH(TEMPER_H)
            DJNZ R4,RE30
            RET

;-------------------------------------------------------------------
;--------------DS18B204的温度转换子程序,具体时序请参考资料-------------------
T_CONVERSION4:LCALL INIT_18204;先复位DS18B204
             JB FLAG1,T_C04
             RET ; 判断DS18204是否存在?若DS18B204不存在则返回

T_C04:       MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18204
             MOV A,#44H ; 发出温度转换命令
             LCALL WRITE_18204
             LCALL D1S  ;这里等待AD转换结束,12位的话要延时750m秒
             LCALL INIT_18204;准备读温度前先复位
             MOV A,#0CCH ; 跳过ROM匹配
             LCALL WRITE_18204
             MOV A,#0BEH ; 发出读温度命令
             LCALL WRITE_18204
             LCALL READ_18204; 将读出的温度数据保存到2EH(TEMPER_H)和2FH(TEMPER_L)处
             RET

;------DS18B204复位初始化程序-----------------------------------------
INIT_18204: SETB P1.7
            NOP
            CLR P1.7
            MOV R0,#2 ;主机发出延时500微秒的复位低脉冲
INIT40:     MOV R1,#150;;;;;250
            DJNZ R1,$
            DJNZ R0,INIT40

            SETB P1.7;然后拉高数据线
            NOP

            MOV R0, #15
INIT41:     JNB P1.7, INIT43;延时60us等待DS18B20回应
            DJNZ R0, INIT41
            LJMP INIT44 ; 超时而没有响应
INIT43:      SETB FLAG1 ; 置标志位,表示DS1820存在
            LJMP INIT45
INIT44:      CLR FLAG1 ; 清标志位,表示DS1820不存在
            LJMP INIT46
INIT45:      MOV R0, #120
            DJNZ R0, $ ; 延时240us
INIT46:      SETB P1.7
            RET

;---------写DS18B204的子程序(有具体的时序要求)-------------------------------------
WRITE_18204:  MOV R2,#8;一共8位数据
WR40:         CLR P1.7
             MOV R3,#6
             DJNZ R3,$
             RRC A
             MOV P1.7,C
             MOV R3,#20
             DJNZ R3,$
             SETB P1.7
             NOP
             NOP
             DJNZ R2,WR40
             SETB P1.7
             RET

;------读DS18B204的程序,从DS18B204中读出两个字节的温度数据------------------------
READ_18204:  MOV R4,#2 ; 将温度高位和低位从DS18B201中读出
            MOV R1,#TEMPER_L ; 低位存入2FH(TEMPER_L)
RE40:        MOV R2,#8
RE41:        SETB P1.7
            NOP
            NOP
            CLR P1.7
            NOP
            NOP
            SETB P1.7
            MOV R3,#5
            DJNZ R3, $
            MOV C,P1.7
            MOV R3,#20
            DJNZ R3, $
            RRC A
            DJNZ R2,RE41
            MOV @R1,A
            DEC R1        ; 高位存入28H(TEMPER_H)
            DJNZ R4,RE40
            RET

;-----整合读出的两字节温度(关于DS18B20读出的2字节温度格式请参考资料)----------
T_FORMAT:  MOV A, #0FH
           ANL A, TEMPER_L
           MOV T_DF, A       ;获得小数部分(4位)

           MOV A, TEMPER_L
           SWAP A
           MOV TEMPER_L, A

           MOV A, TEMPER_H
           SWAP A
           MOV R0, #TEMPER_L
           XCHD A, @R0

           MOV T_INTEGER, A     ;获得整数部分(1字节)
           RET

;-------液晶显示的子程序(显示前先格式转换)---------------------------------------
DISPLAY:     MOV A, T_INTEGER
             MOV B,#10
             DIV AB
             MOV A_BIT,A ;十位存在A_BIT
             MOV B_BIT,B ;个位存在B_BIT

             MOV A, T_DF
             MOV R0, #C_BIT
             MOV R2, #4
         D0: MOV B, #10
             MUL AB
             MOV B, #16
             DIV AB
             MOV @R0, A    ;从个位小数C_BIT,到十位D_BIT,百位E_BIT,千位F_BIT
             INC R0
             MOV A, B
             DJNZ R2, D0

             ;----二进制到ASCII码转换--------------
             MOV A, #30H
             ORL A_BIT, A
             ORL B_BIT, A
             ORL C_BIT, A
             ORL D_BIT, A
             ORL E_BIT, A
             ORL F_BIT, A
             RET
             ;-------------------------------------

 CHANEL1:    LCALL INITIAL
             MOV A, #10000000B          ; LINE1: DB 'Now is:',00H
             LCALL  WRITE_INSTRUCTION
             MOV  DPTR, #LINE1
             LCALL  PR_STRING
             MOV A, A_BIT
             LCALL  WRITE_LCDDATA
             MOV A, B_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #2EH                ;'.'字符
             LCALL  WRITE_LCDDATA
             MOV A, C_BIT
             LCALL  WRITE_LCDDATA
             MOV A, D_BIT
             LCALL  WRITE_LCDDATA
             MOV A, E_BIT
             LCALL  WRITE_LCDDATA
             MOV A, F_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #0DFH               ;下面两个是摄氏度的数字符号
             LCALL  WRITE_LCDDATA
             MOV A, #63H
             LCALL  WRITE_LCDDATA

             MOV a, #11000000B           ; LINE2: DB 'Design by liang!',00H
             LCALL write_instruction
             MOV  DPTR, #LINE
             LCALL  PR_STRING
             RET
;------------------------------------------------------------------------------

 CHANEL2:    LCALL INITIAL
             MOV A, #10000000B          ; LINE1: DB 'Now is:',00H
             LCALL  WRITE_INSTRUCTION
             MOV  DPTR, #LINE2
             LCALL  PR_STRING
             MOV A, A_BIT
             LCALL  WRITE_LCDDATA
             MOV A, B_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #2EH                ;'.'字符
             LCALL  WRITE_LCDDATA
             MOV A, C_BIT
             LCALL  WRITE_LCDDATA
             MOV A, D_BIT
             LCALL  WRITE_LCDDATA
             MOV A, E_BIT
             LCALL  WRITE_LCDDATA
             MOV A, F_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #0DFH               ;下面两个是摄氏度的数字符号
             LCALL  WRITE_LCDDATA
             MOV A, #63H
             LCALL  WRITE_LCDDATA

             MOV a, #11000000B           ; LINE2: DB 'Design by liang!',00H
             LCALL write_instruction
             MOV  DPTR, #LINE
             LCALL  PR_STRING
             RET
;------------------------------------------------------------------------------

 CHANEL3:    LCALL INITIAL
             MOV A, #10000000B          ; LINE1: DB 'Now is:',00H
             LCALL  WRITE_INSTRUCTION
             MOV  DPTR, #LINE3
             LCALL  PR_STRING
             MOV A, A_BIT
             LCALL  WRITE_LCDDATA
             MOV A, B_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #2EH                ;'.'字符
             LCALL  WRITE_LCDDATA
             MOV A, C_BIT
             LCALL  WRITE_LCDDATA
             MOV A, D_BIT
             LCALL  WRITE_LCDDATA
             MOV A, E_BIT
             LCALL  WRITE_LCDDATA
             MOV A, F_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #0DFH               ;下面两个是摄氏度的数字符号
             LCALL  WRITE_LCDDATA
             MOV A, #63H
             LCALL  WRITE_LCDDATA

             MOV a, #11000000B           ; LINE2: DB 'Design by liang!',00H
             LCALL write_instruction
             MOV  DPTR, #LINE
             LCALL  PR_STRING
             RET
;------------------------------------------------------------------------------

 CHANEL4:    LCALL INITIAL
             MOV A, #10000000B          ; LINE1: DB 'Now is:',00H
             LCALL  WRITE_INSTRUCTION
             MOV  DPTR, #LINE4
             LCALL  PR_STRING
             MOV A, A_BIT
             LCALL  WRITE_LCDDATA
             MOV A, B_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #2EH                ;'.'字符
             LCALL  WRITE_LCDDATA
             MOV A, C_BIT
             LCALL  WRITE_LCDDATA
             MOV A, D_BIT
             LCALL  WRITE_LCDDATA
             MOV A, E_BIT
             LCALL  WRITE_LCDDATA
             MOV A, F_BIT
             LCALL  WRITE_LCDDATA
             MOV A, #0DFH               ;下面两个是摄氏度的数字符号
             LCALL  WRITE_LCDDATA
             MOV A, #63H
             LCALL  WRITE_LCDDATA

             MOV a, #11000000B           ; LINE2: DB 'Design by liang!',00H
             LCALL write_instruction
             MOV  DPTR, #LINE
             LCALL  PR_STRING
             RET
;---液晶屏初始化,具体请参考资料-------------------------------------------------
initial:      MOV  A, #01H
              LCALL WRITE_INSTRUCTION
              MOV  A, #38H
              LCALL WRITE_instruction
              MOV  A, #0FH
              LCALL WRITE_instruction
              MOV  A, #06H
              LCALL WRITE_instruction
              RET

;----写液晶指令的子程序------------------------------------------
WRITE_instruction: MOV P0, A
                   CLR RS ;写入控制命令
                   CLR RW
                   CLR E
                   LCALL DELAY
                   SETB E
                   RET

;----写液晶数据的子程序---------------------------------------------
write_lcddata:  MOV P0, A
                SETB RS ;写入数据
                CLR RW
                CLR E
                LCALL DELAY ;判断液晶模块是否忙?
                SETB E
                RET

;-----写行字符的子程序---------------------------------------------------------------
PR_STRING:  CLR   A
            MOVC  A, @A+DPTR
            JZ    END_PR
            LCALL WRITE_LCDDATA
            INC   DPTR
            LJMP  PR_STRING
END_PR:     RET


;----查看液晶忙碌信号的子程序---------------------------------------------------------
DELAY:  call D1mS
        ;MOV P0,#0FFH ;判断液晶显示器是否忙的子程序
        ;CLR RS
        ;SETB RW
        ;CLR E
        ;NOP
        ;SETB E
        ;JB P0.7,DELAY ;如果P1.7为高电平表示忙就循环等待
        RET

;---1mS延时(按12MHZ算)-----------------------------------------------------------------
D1mS:    MOV R7,#250
LOOP0:   NOP
         NOP
         DJNZ R7,LOOP0
         RET

;----1S延时(按12MHZ算)-----------------------------------------------------------------
D1S:     MOV R6,#4
LOOP2:   MOV R5,#250
LOOP1:   LCALL D1mS
         DJNZ R5,LOOP1
         DJNZ R6,LOOP2
         RET

;--------------------------------------------------------------------------------------
LINE1: DB 'CH1 is:',00H
LINE2: DB 'CH2 is:',00H
LINE3: DB 'CH3 is:',00H
LINE4: DB 'CH4 is:',00H
LINE: DB 'Design by DAJIA!',00H

END

⌨️ 快捷键说明

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