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

📄 551.asm

📁 基于DS18B20温度传感器的设计程序 要求为:第一
💻 ASM
字号:
;基于DS18B20温度传感器的设计程序
ORG 0000H
    SJMP    START

ORG 0030H
START:  
    MOV    SP,#60H       ;初始化
    MOV    P0,#0FFH
    MOV    P1,#0FFH
    MOV    P2,#0FFH
    MOV    P3,#0FFH 
MAIN:
    LCALL GET_TEMPER     ;调用读温度子程序
    LCALL DISP           ;调用数码管显示子程序
    AJMP  MAIN           ;重复循环

;------ 读DS18B20传感器的温度值 ------
GET_TEMPER:
    SETB    P2.7
    LCALL   RST18B20     ;复位DS18B20
    JB      00H,DSS2
    RET
DSS2:   
    MOV     A,#0CCH      ;跳过ROM匹配
    LCALL   WR18B20
    MOV     A,#44H       ;向DS18B20发出温度转换命令
    LCALL   WR18B20
    LCALL   RST18B20     ;准备读温度前先复位DS18B20
    MOV     A,#0CCH      ;跳过ROM匹配
    LCALL   WR18B20
    MOV     A,#0BEH      ;向DS18B20发出读温度命令
    LCALL   WR18B20
    LCALL   RE18B20      ;读出温度数据
    RET

;------ DS18B20复位初始化程序 ------
RST18B20:
    SETB    P2.7  
    NOP
    CLR     P2.7
    MOV     R0,#06BH     ;主机发出复位低脉冲
    MOV     R1,#03H
DSR1:
    DJNZ    R0,DSR1 
    MOV     R0,#6BH
    DJNZ    R1,DSR1
    SETB    P2.7         ;拉高数据线
    NOP 
    NOP
    NOP
    MOV     R0,#25H
DSR2:   
    JNB     P2.7,DSR3    ;等待DS18B20回应
    DJNZ    R0,DSR2
    LJMP    DSR4
DSR3:  
    SETB    00H          ;置标志位,表示DS1820存在
    LJMP    DSR5
DSR4:   
    CLR     00H          ;清标志位,表示DS1820不存在
    LJMP    DSR7
DSR5:   
    MOV     R0,#06BH
DSR6:   
    DJNZ    R0,DSR6      ;延时一段时间
DSR7:   
    SETB    P2.7   
    RET

;------ 写DS18B20的子程序 ------
WR18B20:
    MOV     R2,#8
    CLR     C

WR1:    
    CLR     P2.7

    MOV     R3,#6        ;delay
    DJNZ    R3,$

    RRC     A
    MOV      P2.7,C

    MOV     R3,#23       ;delay
    DJNZ    R3,$

    SETB    P2.7
    NOP
    DJNZ    R2,WR1

    SETB    P2.7
    RET

;------ 从DS18B20中读温度数据程序 ------
RE18B20:
    MOV     R4,#2
    MOV     R1,#2FH

;***********************************

RE00:   
    MOV     R2,#8
RE01:   
    CLR     C
    SETB    P2.7
    NOP
    NOP
    CLR     P2.7
    NOP
    NOP
    NOP
    SETB    P2.7

    MOV     R3,#09       ;delay
RE10:   
    DJNZ    R3,RE10

    MOV     C, P2.7

    MOV     R3,#23       ;delay
RE20:  
    DJNZ    R3,RE20

    RRC     A
    DJNZ    R2,RE01

;------------温度处理子程序----------

    MOV     @R1,A
    DEC     R1
    DJNZ    R4,RE00
    RET

DISP:     
    MOV     A,2EH            ;
    ANL     A,#80H           ;
    JZ      TEMPC1           ; 判断温度是否在零下?

    CLR     C                ; 温度值补码变成原码
    MOV     A,2FH            ;
    CPL     A
    ADD     A,#01H           ;
    MOV     2FH,A            ;
    MOV     A, 2EH           ; 
    CPL     A                ;
    ADDC    A,#00H           ;
    MOV     2EH,A  
    
    MOV     33H,#0BH         ; 置"-"标志
    SJMP    TEMPC11          ;
TEMPC1:  
    MOV     33H,#0AH         ; 置"+"标志
;---------将待显示数据送缓冲区------------
TEMPC11:
    MOV	    A,2FH            ;得到小数位
    ANL     A,#0FH
    MOV	    B,#10
    MUL	    AB
    MOV	    B,#16
    DIV	    AB
    MOV	    30H,A
	
    MOV	    A,2FH            ;得到整数位
    SWAP    A
    ANL	    A,#0FH
    MOV	    2FH,A
	
    MOV	    A,2EH
    SWAP    A
    ANL	    A,#0F0H
	
    ORL     A,2FH
    MOV     B,A
	
    SUBB    A,#100           ;判断一下是否大于100
    JNC     DISP_ERR         ;大于100转出错显示
	
    MOV     A,B
    MOV     B,#10
    DIV     AB
    MOV     32H,A            ;得到十位
    MOV     31H,B            ;得到个位

;-------------显示程序------------------ 

DISPLAY: 
    MOV     R0,#30H
    MOV     R2,#22H
    MOV	    A,R2
    MOV     R1,#04H

LOOP:	 
    MOV     A,@R0
    MOV     DPTR,#NUMTAB
    MOVC    A,@A+DPTR
         
    MOV     P1,A
    MOV     A,R2
    CJNE    A,#44H,NEXT
    CLR     P1.7
	 
NEXT:	  
    LCALL   DELAY
    MOV     P3,A
    RL      A
    MOV     R2,A
    INC     R0
    DJNZ    R1,LOOP
;----------------点灯子程序---------------    
    CLR     P2.0
    CLR     P2.1
    CLR     C
    MOV     A,32H
    SUBB    A,#5            ;判断是否大于50
    JC      SETGREEN        ;小于50转绿灯亮
  
    SETB    P2.0            ;大于50红灯亮
    RET

SETGREEN:
    SETB    P2.1
    RET

;---------------出错显示子程序------------

DISP_ERR:
    MOV	    30H, #0DH
    MOV	    31H, #0DH
    MOV	    32H, #0CH
    MOV     33H, #0AH
    LCALL   DISPLAY
    RET

;---------------延时子程序---------------  
   
DELAY:  
    MOV     R6 ,#5
L1:        
    MOV     R7,#200
    DJNZ    R7,$
    DJNZ    R6,L1  
    RET

;--------- 七段数码管显示器字型码表 -------------

NUMTAB:   
    DB     0C0H,0F9H,0A4H,0B0H, 99H,92H,82H,0F8H,80H,90H, 0FFH, 0BFH,86H,0CEH  ;共阳极

;   DB      22H,0FAH, 31H, 25H,0ACH,64H,60H, 2FH,20H,24H, 0FFH, 0FDH,79H, 31H  ;共阴极
;          "0"  "1"  "2"  "3"  "4"  "5" "6"  "7" "8" "9" "不亮" "-"  "E"  "R" 
	
END

⌨️ 快捷键说明

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