DS18b20 51汇编源程序
2012-06-29
标签: DS18b20


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

        FLAG1 BIT F0   ;DS18B20存在标志位
        DQ BIT P1.7
        TEMPER_L EQU 29H
        TEMPER_H EQU 28H
        A_BIT EQU 35H
        B_BIT EQU 36H
;************程序起始********************

        ORG 0000H
        AJMP MAIN
        ORG 0100H
;**************主程序开始************

MAIN:   
        LCALL INIT_18B20
;LCALL RE_CONFIG

        LCALL GET_TEMPER
        AJMP CHANGE
;**********DS18B20复位程序*****************

INIT_18B20:


        SETB DQ
        NOP
        CLR DQ
        MOV R0,#0FBH
TSR1:   DJNZ R0,TSR1   ;延时
        SETB DQ
        MOV R0,#25H
TSR2:   JNB DQ ,TSR3
        DJNZ R0,TSR2
TSR3:   SETB FLAG1     ;置标志位,表明DS18B20存在
        CLR P2.0       ;二极管指示
        AJMP TSR5
TSR4:   CLR FLAG1
        LJMP TSR7
TSR5:   MOV R0,#06BH
TSR6:   DJNZ R0,TSR6
TSR7:   SETB DQ        ;表明不存在
        RET
;********************设定DS18B20暂存器设定值**************

;RE_CONFIG:

;JB FLAG1,RE_CONFIG1

;RET

;RE_CONFIG1: MOVA,#0CCH;放跳过ROM命令

;LCALL WRITE_18B20

;MOVA,#4EH

;LCALL WRITE_18B20;写暂存器命令

;MOVA,#00H;报警上限中写入00H

;LCALL WRITE_18B20

;MOVA,#00H;报警下限中写入00H

; LCALL WRITE_18B20

;MOVA,#1FH;选择九位温度分辨率

; LCALL WRITE_18B20

; RET

;*****************读转换后的温度值****************

GET_TEMPER:



        SETB DQ
        LCALL INIT_18B20
        JB FLAG1,TSS2
        RET            ;若不存在则返回
TSS2:   MOV A,#0CCH    ;跳过ROM
        LCALL WRITE_18B20
        MOV A,#44H     ;发出温度转换命令
        LCALL WRITE_18B20
        LCALL DISPLAY  ;延时
        LCALL INIT_18B20
        MOV A,#0CCH    ;跳过ROM
        LCALL WRITE_18B20
        MOV A,#0BEH    ;发出读温度换命令
        LCALL WRITE_18B20
        LCALL READ2_18B20      ;读两个字节的温度
        RET
;***************写DS18B20程序************

WRITE_18B20:



        MOV R2,#8
        CLR C
WR1:    
        CLR DQ
        MOV R3,#6
        DJNZ R3,$
        RRC A
        MOV DQ,C
        MOV R3,#23
        DJNZ R3,$
        SETB DQ
        NOP
        DJNZ R2,WR1
        SETB DQ
        RET
;***********读18B20程序,读出两个字节的温度*********

READ2_18B20:



        MOV R4,#2      ;低位存在29 H,高位存在28H
        MOV R1,#29H
RE00:   MOV R2,#8
RE01:   CLR C
        SETB C
        NOP
        NOP
        CLR DQ
        NOP
        NOP
        NOP
        SETB DQ
        MOV R3,#7
        DJNZ R3,$
        MOV C,DQ
        MOV R3,#23
        DJNZ R3,$
        RRC A
        DJNZ R2,RE01
        MOV @R1,A
        DEC R1
        DJNZ R4,RE00
        RET
;************读出的温度进行数据转换**************

CHANGE: MOV A,29H
        MOV C,28H.0    ;将28H中的最低位移入C
        RRC A
        MOV C,28H.1
        RRC A
        MOV C,28H.2
        RRC A
        MOV C,28H.3
        RRC A
        MOV 29H,A
;setbp2.0

        LCALL DISPLAY  ;调用数码管显示子程序
; setb P2.0

        LJMP MAIN
;*******************DISPLAY******

DISPLAY:mov a,29H      ;将29H中的十六进制数转换成10进制
        mov b,#10      ;10进制/10=10进制
        div ab
        mov b_bit,a    ;十位在a
        mov a_bit,b    ;个位在b
        mov dptr,#TAB  ;指定查表启始地址
        mov r0,#4
dpl1:   mov r1,#250    ;显示1000次
dplop:  mov a,a_bit    ;取个位数
        MOVC A,@A+DPTR ;查个位数的7段代码
        mov p0,a       ;送出个位的7段代码
        clr p2.5       ;开个位显示
        acall d1ms     ;显示1ms
        setb p2.5
        mov a,b_bit    ;取十位数
        MOVC A,@A+DPTR ;查十位数的7段代码
        mov p0,a       ;送出十位的7段代码
        clr p2.4       ;开十位显示
        acall d1ms     ;显示1ms
        setb p2.4
        djnz r1,dplop  ;100次没完循环
        djnz r0,dpl1   ;4个100次没完循环
        ret
;***********************************

D1MS:   MOV R7,#80     ;1MS延时(按12MHZ算)
        DJNZ R7,$
        RET
;*************************

TAB:    DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H


可能会用到的工具/仪表
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号