get_temp.asm

来自「单片机温度测量程序」· 汇编 代码 · 共 86 行

ASM
86
字号
;|--------------------------------------------------------------|
;|      获取单个ds1820转化的温度值的应用程序,P1.0接ds1820       |
;|--------------------------------------------------------------|
        ORG 0000H
        AJMP MAIN
        ORG 0020H
MAIN:
        MOV SP,#60H
        LCALL GET_TEMP
        SJMP $

GET_TEMP:
        CLR PSW.4
        SETB PSW.3      ;设置工作寄存器当前所在的区域
        CLR EA          ;使用ds1820一定要禁止任何中断产生
        LCALL INT       ;调用初使化子程序
        MOV A,#0CCH
        LCALL WRITE     ;送入跳过ROM命令
        MOV A, #44H
        LCALL WRITE     ;送入温度转换命令
        LCALL INT       ;温度转换完全,再次初使化ds1820
        MOV A,#0CCH
        LCALL WRITE     ;送入跳过ROM命令
        MOV A,#0BEH
        LCALL WRITE     ;送入读温度暂存器命令
        LCALL READ
        MOV R7,A        ;读出温度值低字节存入R7
        LCALL READ
        MOV R6,A        ;读出谩度值高字节存入R6
        SETB EA
        RET

INT:                    ;初始化ds1820子程序
        CLR EA
     L0:CLR P1.0        ;ds1820总线为低复位电平
        MOV R2,#200
     L1:CLR P1.0
        DJNZ R2,L1      ;总线复位电平保持400us
        SETB P1.0       ;释放ds1820总线
        MOV R2,#30
     L4:DJNZ R2,L4      ;释放ds1820总线保持60us
        CLR C           ;清存在信号(存在C=0,不存在C=1)
        ORL C,P1.0
        JC L0           ;存在吗?不存在则重新来
        MOV R6,#80
     L5:ORL C,P1.0
        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 P1.0
        MOV R4,#8
        RRC A           ;把一个字节data(A)分成8个bit环移给 C
        CLR P1.0        ;开始写入ds1820总线要处于复位(低)状态
    WR2:DJNZ R4,WR2     ;ds1820总线复位保持16us
        MOV P1.0,C      ;写入一个bit
        MOV R4,#20
    WR3:DJNZ R4,WR3     ;等待40us
        DJNZ R3,WR1     ;写入下一个bit
        SETB P1.0       ;重新释放ds1820总线
        RET

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

        END

⌨️ 快捷键说明

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