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

📄 temp.asm

📁 一款采用DS18B20的温度采集汇编程序
💻 ASM
字号:
;  本程序采用DS18B20实现温度的采集。本系统中晶振采用12M,数据线为DQ,本程序没有对负温度进行
;  处理。采用3位数码进行显示,精度为1C度.
 ; DQ EQU P3.2
 ;DQ EQU P1.0 (89C51)
DQ   EQU P1.7
ST_LED  EQU  P1.6
STATUS_LED EQU P3.7
FAMILYCODE     DATA 30H
SERIAL1        DATA 31H
SERIAL2        DATA 32H
SERIAL3        DATA 33H
SERIAL4        DATA 34H
SERIAL5        DATA 35H
SERIAL6        DATA 36H
CRCCODE        DATA 37H
TEMPL          DATA 38H
TEMPH          DATA 39H
TEMP0          DATA 40H
TEMP1          DATA 41H
TEMP2          DATA 42H
ORG 0000H
        AJMP MAIN
ORG 0050H
MAIN:

        MOV SP,#60H
        MOV R7,#5
        CLEAR:           ;清数码显示
        MOV DPTR,#LED
        MOV A,#0
        MOVC A,@A+DPTR
        MOV SBUF,A
        JBC TI,$
        DJNZ R7,CLEAR
        
        LCALL GET_TEMP
        CLR STATUS_LED
        LCALL CONV_DEFINITION
        MORE:
        LCALL GET_TEMP
        CPL STATUS_LED
        LCALL CONV_DEFINITION
        LCALL HBCD
        LCALL SEND
        MOV R2,#2
        BBBB:
        
        MOV R6,#0
        AAAA:
        MOV R4,#0
        DJNZ R4,$
        DJNZ R6,AAAA
       ; DJNZ R2,BBBB

        AJMP MORE

 SEND:
        MOV DPTR,#LED
        MOV R0,#TEMP0
        MOV A,@R0
        ANL A,#0FH
        MOVC A,@A+DPTR
        MOV SBUF,A
        JNB TI,$
        CLR TI
        INC R0
        MOV A,@R0
        ANL A,#0F0H
        SWAP A
        MOVC A,@A+DPTR

        MOV SBUF,A
        JNB TI,$
        CLR TI

        MOV A,@R0
        ANL A,#0FH
        MOVC A,@A+DPTR
        MOV SBUF,A
        JNB TI,$
        CLR TI
        SETB ST_LED
        NOP
        NOP
        CLR ST_LED
        RET


GET_TEMP:
        PUSH PSW
        MOV PSW,#00001000B;      ;设置工作寄存器当前所在的区域
        CLR EA                   ;使用ds1820一定要禁止任何中断产生
        LCALL INIT_DS18B20
        MOV A,#0CCH
        LCALL WRITE
        MOV A,#0B8H
        LCALL WRITE

        LCALL INIT_DS18B20       ;调用初使化子程序
        MOV A,#0CCH
        LCALL WRITE              ;送入跳过ROM命令
        MOV A, #44H
        LCALL WRITE              ;送入温度转换命令
        LCALL INIT_DS18B20       ;温度转换完全,再次初使化ds1820
        MOV A,#0CCH
        LCALL WRITE              ;送入跳过ROM命令
        MOV A,#0BEH
        LCALL WRITE              ;送入读温度暂存器命令
        LCALL READ
        MOV TEMPL,A                 ;读出温度值低字节存入TEMPL
        LCALL READ
        MOV TEMPH,A                 ;读出谩度值高字节存入TEMPH
        SETB EA
        POP PSW
        RET

INIT_DS18B20:                    ;初始化ds1820子程序
        CLR EA
     L0:CLR DQ                   ;ds1820总线为低复位电平
        MOV R2,#200
     L1:CLR DQ
        DJNZ R2,L1              ;总线复位电平保持400us
        SETB DQ                 ;释放ds1820总线
        MOV R2,#30
     L4:DJNZ R2,L4              ;释放ds1820总线保持60us
        CLR C                   ;清存在信号(存在C=0,不存在C=1)
        ORL C,DQ
        JC L0                   ;存在吗?不存在则重新来
        MOV R6,#80
     L5:ORL C,DQ
        JC L3
        DJNZ R6,L5
        SJMP L0
     L3:MOV R2,#240
     L2:DJNZ R2,L2
        RET

WRITE:                           ;向ds1820写操作命令子程序
        CLR EA
        MOV R3,#8                ;写入ds1820的bit数,一个字节8个bit
    WR1:SETB DQ
        MOV R4,#8
        RRC A                    ;把一个字节data(A)分成8个bit环移给 C
        CLR DQ                   ;开始写入ds1820总线要处于复位(低)状态
    WR2:DJNZ R4,WR2              ;ds1820总线复位保持16us
        MOV DQ,C                 ;写入一个bit
        MOV R4,#20
    WR3:DJNZ R4,WR3              ;等待40us
        DJNZ R3,WR1              ;写入下一个bit
        SETB DQ                  ;重新释放ds1820总线
        RET

READ:
        CLR EA
        MOV R6,#8               ;连续读8个bit
    RE1:CLR DQ                  ;读前总线保持为低
        MOV R4,#4
        NOP
        SETB DQ                ;开始读,总线释放
    RE2:DJNZ R4,RE2            ;持续8us
        MOV C,DQ               ;从ds1820总线读得一个bit
        RRC A                  ;把读得的位值环移给 A
        MOV R5,#30
    RE3:DJNZ R5,RE3            ;持续60us
        DJNZ R6,RE1            ;读下一个bit
        SETB DQ                ;重新释放ds1820总线
        RET

;功能:单字节十六进制整数转换成单字节BCD码整数

;入口条件:待转换的单字节十六进制整数在累加器A中。
;出口信息:转换后的BCD码整数(十位和个位)仍在累加器A中,百位在R3中。

;影响资源:PSW、A、B、R3    堆栈需求:  2字节

HBCD:
        MOV    A, TEMPL
	MOV	B,#100	 ;  分离出百位,存放在R3中
	DIV	AB
	MOV	R3,A
	MOV	A,#10	 ; 余数继续分离十位和个位
	XCH	A,B
	DIV	AB
	SWAP	A
	ORL	A,B	 ; 将十位和个位拼装成BCD码
        MOV     TEMP1,A
        MOV     TEMP0,R3
	RET

;功能:双字节十六进制整数转换成双字节BCD码整数

;入口条件:待转换的双字节十六进制整数在R6、R7中,R6为高字节,R7为低字节。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中,R3为高位,R5为低位。
;影响资源:PSW、A、R2~R7    堆栈需求:  2字节
BINBCD:
        PUSH PSW
        MOV PSW,#00010000B
        MOV R6,TEMPH
        MOV R7,TEMPL
HB2:	CLR	A	; BCD码初始化
	MOV	R3,A
	MOV	R4,A
	MOV	R5,A
	MOV	R2,#10H	; 转换双字节十六进制整数
HB3:	MOV	A,R7	;

⌨️ 快捷键说明

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