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

📄 ds1820.asm

📁 数字温度传感器DS18B20的汇编程序
💻 ASM
字号:
;DS18B20   data->   20H-28H
           DQ       EQU         P1.0
	   DISPCENTI  EQU     32H           ;温度BCD 百分之一位 地址
DISPTENTH  EQU     33H           ;温度BCD 十分之一位 地址
DISP1      EQU     34H           ;温度BCD 个位 地址
DISP10     EQU     35H           ;温度BCD 十位 地址
CLK     EQU     P2.1            ;MAX7219 CLK
LOAD    EQU     P2.2            ;MAX7219 LOAD
DIN2    EQU     P2.3            ;MAX7219 DIN
PULSE   EQU     P2.7
           ORG      0000H
	   LJMP     MAIN
           ORG      0013H
           LJMP     INTER1
           ORG      0030H       ;FOSC=12MHZ

MAIN:  CLR PULSE
;       SETB IT1
;       SETB EX1
;       CLR  IE1
;       SETB EA
       LCALL GET_TEMPER
       LJMP MAIN

GET_TEMPER:      LCALL    RESET       ;reset 1820
           LCALL    SKIP_ROM     ;"CCH"
           LCALL    CONVERT     ;"44H"
           LCALL    DELAY1s     ;1S
           LCALL    RESET       ;reset 1820
           LCALL    SKIP_ROM    ;"CCH"
           LCALL    READ_SCRTCH ;READ CONVERT T DATA 9BYTES
           LCALL    MATH
           LCALL    DISPLAY
;           LJMP     MAIN
           RET

;--------- ROM FUNCTION COMMANDS --------
SKIP_ROM:                        ;Skip ROM [CCh]
           MOV      A,#0CCH
           LCALL    WRBYTE
           RET

;--------- MEMORY COMMAND FUNCTIONS --------
READ_SCRTCH:                   ;Read Scratchpad [BEh]
           MOV      R0,#20H    ;9BYTES DATA =>20H-28H
           MOV      A,#0BEH
           LCALL    RD9BYTE
           RET

CONVERT:                       ;Convert T [44h]
           MOV      A,#44H
           LCALL    WRBYTE
           RET

;-------------------------------------------------------------------
RESET:     MOV      R6,#10H    ;RESET 1820
           CLR      DQ
           LCALL    DELAY_600
           SETB     DQ
           LCALL    DELAY_60
LOOP:      JNB      DQ,RSTEND
           LCALL    DELAY_15
           DJNZ     R6,LOOP
           SJMP     RESET
RSTEND:    JNB      DQ,$
           RET

;-------------------------------------------------------------------
RD9BYTE:
           LCALL    WRBYTE
           LCALL    DELAY_15
           MOV      R6,#2    ;READ 9BYTES DATA
RD_LOP:    MOV      R5,#8
RT_LOP:    SETB     DQ
           LCALL    DELAY_45 ;H 45US
           CLR      DQ       ;L 2US
           NOP
           SETB     DQ       ;H 15US
           LCALL    DELAY_15
           MOV      C,DQ
           RRC      A
           LCALL    DELAY_45
           DJNZ     R5,RT_LOP
           MOV      @R0,A
           INC      R0
           DJNZ     R6,RD_LOP
           RET

;--------------------------------------------------------------------
WRBYTE:    MOV      R6,#8   ;WRITR 1 BYTE
WB_LOP:    CLR      DQ
           LCALL    DELAY_15
           RRC      A
           MOV      DQ,C
           LCALL    DELAY_45
           SETB     DQ
           LCALL    DELAY_15
           DJNZ     R6,WB_LOP
           RET

DELAY_60:  MOV      R7,#30
           DJNZ     R7,$
	   RET

DELAY_45:  MOV      R7,#28
           DJNZ     R7,$
	   RET
DELAY_30:  LCALL    DELAY_15
DELAY_15:  MOV      R7,#2
           DJNZ     R7,$
           RET
DELAY_600: MOV      R7,#250
           DJNZ     R7,$
           RET

DELAY1s:   MOV R7,#0AH
W1:        MOV R6,#0C8H
W2:        MOV R5,#0FAH
W3:        DJNZ R5,W3
	   DJNZ R6,W2
	   DJNZ R7,W1
	   RET

;--------------------------------------------------------------------
MATH:
        MOV     R0,20H      ;R0中存入温度低字节
	MOV     R1,21H      ;R1中存入温度高字节
	CLR     C
	MOV     R2,#04H
RM:     MOV     A,R1            ;将整数温度移动到R0中进行BCD转换
        RRC     A
	MOV     R1,A
	MOV     A,R0
	RRC     A
	MOV     R0,A
	CLR     C
        DJNZ    R2,RM
	LCALL   B2BCD
LM:     MOV     A,20H      ;将温度小数位移动到36H处进行BCD转换      
	SWAP    A
	ANL     A,#0F0H
	MOV     36H,A
	LCALL   BMDBCD
	RET

;------转换整数温度为BCD码------
B2BCD:  MOV     A,R0
        MOV     B,#64H           ;除以100
	DIV     AB
;	MOV     R5,A             ;温度百位BCD码,一般情况下没有用处
        MOV     39H,A
        MOV     A,#0AH           ;除以10
	XCH     A,B      
	DIV     AB
	MOV     DISP10,A
	MOV     A,B
	ORL     A,#80H
	MOV     DISP1,A
	RET

;------转换小数温度为BCD码------
BMDBCD:  
        MOV R0,36H              ;二进制小数存储地址
        MOV R7,#01H              ;二进制字节数
        MOV R6,#02H              ;压缩BCD占用字节数
        MOV R1,#37H              ;压缩BCD码低字节地址

        MOV A,R0
        MOV R4,A
        MOV A,R1
        MOV R5,A
        MOV A,R6
        MOV R3,A
        CLR A
CLBCD:
        MOV @R1,A
        INC R1
        DJNZ R3,CLBCD
        MOV A,R6
        RL A
        MOV R3,A
LP0:    MOV A,R4
        MOV R0,A
        MOV A,R7
        MOV R2,A
        MOV R1,#00H
        CLR C
LP1:    MOV A,@R0
        MOV B,#0AH
        PUSH PSW
        MUL AB
        POP PSW
        ADDC A,R1
        MOV @R0,A
        MOV R1,B
        INC R0
        DJNZ R2,LP1
        MOV A,R1
        ADDC A,#00H
        MOV R1,A
        MOV A,R6
        MOV R2,A
        MOV A,R5
        MOV R0,A
LP2:    MOV A,@R0
        SWAP A
        MOV @R0,A
        XCH A,R1
        XCHD A,@R0
        INC R0
        DJNZ R2,LP2
        DJNZ R3,LP0
        MOV A,R5
        MOV R1,A
        MOV R2,38H                ;R2中为小数压缩BCD高字节
        MOV R3,37H                ;R3中为小数压缩BCD低字节
;------压缩BCD转换为一般BCD------	
	MOV A,R2
	SWAP A
	ANL A,#0FH
	MOV DISPTENTH,A
	MOV A,R2
	ANL A,#0FH
	MOV DISPCENTI,A
        RET

;-------------------------------------------------------------
DISPLAY:
        MOV	R0,#00H
	MOV	R1,#0CH
	LCALL	SENDMAX7219	;关断寄存器0CH	D0位送0,处于关断状态
	LCALL	YAN	        ;延时
	MOV	R0,#00H
	MOV	R1,#0FH
	LCALL	SENDMAX7219	;测试寄存器0FH送0,处于正常显示态
	MOV	R0,#0FH
	MOV	R1,#09H
	LCALL	SENDMAX7219	;译码控制寄存器09H送0FH,0-7位处于译码态
	MOV	R0,#03H
	MOV	R1,#0BH
	LCALL	SENDMAX7219	;扫描数量(界限)寄存器0BH送07H,表示
	MOV	R0,#08H
	MOV	R1,#0AH
	LCALL	SENDMAX7219	;亮度控制寄存器0AH送08H,处于半亮态
	MOV	R0,#01H
	MOV	R1,#0CH
	LCALL	SENDMAX7219	;关断寄存器0CH	D0位送1,退出关断状态
	MOV	R0,DISP10
	MOV	R1,#01H
	LCALL	SENDMAX7219	  ;给第1位数码管送数字
	MOV	R0,DISP1
	MOV	R1,#02H
	LCALL	SENDMAX7219	  ;给第2位数码管送数字
	MOV	R0,DISPTENTH
	MOV	R1,#03H
	LCALL	SENDMAX7219	  ;给第3位数码管送数字
	MOV	R0,DISPCENTI
	MOV	R1,#04H
	LCALL	SENDMAX7219	  ;给第4位数码管送数字	
	RET

;------设置MAX7219子程序------
SENDMAX7219:	MOV	R2,#08H	  ;移位数目八位
	MOV	A,R1	          ;取出要送的数
LOOP1:	RLC	A
	MOV	DIN2,C
	CLR	CLK	          ;时钟拉低
	NOP
	NOP
	NOP
	NOP
	NOP	
	SETB	CLK	          ;时钟变高,单位读入
	DJNZ	R2,LOOP1	  ;八位未完,继续循环
	MOV	A,R0	          ;取出要送的数
	MOV	R2,#08H	          ;移位数目八位
LOOP2:	RLC	A
	MOV	DIN2,C
	CLR	CLK	          ;时钟拉低
	NOP
	NOP
	NOP
	NOP
	NOP	
	SETB	CLK	          ;时钟变高
	DJNZ	R2,LOOP2	  ;八位未完,继续循环
	CLR	LOAD	          ;LOAD拉低
	NOP
	NOP
	NOP
	NOP	
	SETB	LOAD	          ;LOAD变高,全部16位读入
	RET

;------延时450us------
YAN:	MOV	R0,#0E0H
YY:	DJNZ	R0,YY
	RET

INTER1: LCALL GET_TEMPER
;        LCALL DISPLAY
        RETI

        END

⌨️ 快捷键说明

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