Shodou okolnosti jsem byl v průběhu týdne dvakrát požádán o poskytnutí ovládacích rutin pro teplotní čidlo DS1820 od firmy Dallas. Možná se budou hodit i dalším.

V podstatě se jedná o jednoduchý teploměr zobrazující na LED displeji teplotu naměřenou čidlem DS1820. Schéma jsem již bohužel nenašel, ale z komentářů v programu není problém vše zrekonstruovat. Původně byl teploměr postaven s mikroprocesorem AT89C2051, krystalem 12MHz a dvojitou sedmisegmentovou z produkce bývalé NDR se společnou anodou, které byly spínány PNP tranzistory.

LEDS           EQU     P1
DIGIT0         EQU     P3.2
DIGIT1         EQU     P3.3
SDATA           EQU     P3.1    ; DS1820
                DSEG
dot             EQU     0
dis_buff:       DS      2       ; display buffer
temp:           DS      1       ; Temperature
buff:           DS      9       ; mem buffer 9 byte
                CSEG
                ORG     00h
                acall   initialize
main:           acall   read_temp
                acall   con_data
                acall   scan_dis
                sjmp    main
; scan display 2 digit the input data in display buffer
scan_dis:       mov     a,dis_buff
                mov     LEDS,a
                clr     DIGIT0
                acall   delay
                setb    DIGIT0
                mov     a,dis_buff+1
                mov     LEDS,a
                clr     DIGIT1
                acall   delay
                setb    DIGIT1
                ret
; initialize I/O port and reg.
initialize:     setb    DIGIT0
                setb    DIGIT1
                mov     LEDS,#0ffh    ; clear display
                ret
; delay for scandisplay.
delay:          mov     r2,#200
                djnz    r2,$
                ret
; convert decimal to 7-Segment code
con_data:       mov     dptr,#SEG_TAB   ; segment tabal
                mov     a,temp
                clr     c
                rrc     a
                cpl     c
                mov     dot,c
                mov     b,#10
                div     ab
                movc    a,@a+dptr
                mov     dis_buff,a
                mov     a,b
                movc    a,@a+dptr
                mov     c,dot
                mov     acc.7,c
                mov     dis_buff+1,a
                ret
;(D7 - D0 ) Led g f e d c b a
SEG_TAB: DB     0C0H,0F9H,0A4H,0B0H,099H,092H,082H,0F8H,080H,090H,0FFH,0BFH,086H
               ; 0    1    2    3    4    5    6    7    8     9         -   E
;Read temperature DS1820
read_temp:      mov     a,#0cch         ;Skip ROM command
                acall   write_byte
                mov     a,#044h         ;Initiates temperature conversion
                acall   write_byte
                jnb     SDATA,$         ;Read temperature busy status
                acall   reset_pulse     ;Tx reset pulse
                acall   presence        ;Rx presence pulse
                mov     a,#0cch         ;Skip ROM command
                acall   write_byte
                mov     A,#0beh         ;Read scratchpad command
                acall   write_byte
                acall   read_byte       ;Read EEprom byte 0 (Temperature LSB)
                mov     temp,a
                acall   reset_pulse     ;Tx reset pulse
                acall   presence        ;Rx presence pulse
                ret
;Read scratchpad 1 byte
read_byte:      mov     r3,#8           ;count 8 bit
read1:          clr     SDATA
                nop
                nop
                setb    SDATA
                nop
                nop
                nop
                nop
                mov     c,SDATA
                mov     r2,#15          ;delay 60 uS
                djnz    r2,$
                rrc     a
                djnz    r3,read1
                ret
;write scratchpad 1 byte
write_byte:     mov     r3,#8           ;counter 8 bit
write:          rrc     a
                jc      write1
                clr     SDATA
                mov     r2,#15          ;delay 60 uS
                djnz    r2,$
                setb    SDATA
                nop
                nop
                nop
                nop
                djnz    r3,write
                ret
write1:         clr     SDATA
                nop
                nop
                nop
                nop
                setb    SDATA
                mov     r2,#15            ;delay 60 uS
                djnz    r2,$
                djnz    r3,write
                ret
;transmit reset pulse
reset_pulse:    clr     SDATA
                mov     r2,#250             ;delay 500 uS
                djnz    r2,$
                setb    SDATA
                mov     r2,#10              ;delay 20 uS
                djnz    r2,$
                ret
presence:       jb      SDATA,$             ;Rx presence pulse
                jnb     SDATA,$
                ret
                END