Está en la página 1de 11

Termometro Digital DS1620 con Atmel

AT89cXX

A continuación se muestra la lectura de un sensor de temperatura digital como es el DS1620 de Dallas


Semiconductores, a través de un microcontrolador ATMEL AT89CXX, dicho microcontrolador
desplegara la lectura del sensor de temperatura a través de 3 displays de 7 segmentes.

DIAGRAMA DEL CIRCUITO

El circuito que ves a continuación debe de ser modificado, se le deben de adicionar buffer o algún otro
dispositivo (como veas conveniente) para poder amplificar la corriente en los displays, pues directos al
micro tienen muy poca luminosidad.
Este sensor de temperatura se lee serialmente a través de su bus I2C, esto puedes verlo en el
manual, u hoja de especificación del dispositivo, además puede ser programado como termistor, es
decir darle valores de temperatura baja alta y media, de acuerdo a los niveles programados y a su
lectura de temperatura se pondrán en estado alto o bajo las salidas del DS1620 asignadas para tal
efecto.
Puedes usar 3 displays o cuatro como ves en la figura, no existe ningún problema, además puedes
cambiar el valor del cristal, yo lo hice funcionar con uno de 4 de 12 y de 16.
CÓDIGO FUENTE DEL PROGRAMA

Este codigo es bastante simple nada complicado y de mucha ayuda para la realizacion de otros
proyectos ademas que en el mismo pogras ver la utilizacion de los comandos de ajuste adecimal muy
buenos.

Programa:

;* Control de un sensor de temperatura ds1620

;* Descripción:

;*

;* Se controla un ds1620 através de un at89c52 leyendo de el y mostrando

;* El resultado leído en una Terminal virtual hacia el puerto serial del

;* Microcontrolador, y los resultados a 4 display


;*

;* Autor:

;* Raul Alejandro Quispe Larico

;* cel 72097633 - lapaz bolivia

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

; esta es la conexión de pines entre el ds1620 y el at89c52

displays equ p0

dq equ p3.2

clk equ p3.3

rst equ p3.4

t equ 3ah

auxa equ 3bh

n_hex equ 3ch

nh equ 3dh

signo equ 3eh

;------------------- --------------------

; reset ; vector de interrupcion del reset

org 000h ; localidad de interrupcion reset

ajmp start ; saltar a inicio

;----------------------------------------

; interrupciones (no usadas)

;------------------- --------------------
org 03h ; interrupcion externa 0

reti

org 0bh ; interrupcion del timer 0

reti

org 13h ; interupcion externa 1

reti

org 1bh ; interrupcion del timer 1

reti

org 23h ; interrupcion del puerto serial

reti

org 25h ; localidad donde se inicia el resto del programa

;----------------------------------------

; inicio del programa principal

;----------------------------------------

org 30h

start:

setb clk ; pone a 1 el ck del ds1620

acall configure ; configura el ds1620

acall delay ; esperar 10 ms para configuracion de escritura

loop:

acall start_convert ; inicia el comando de convercion de temperatura

acall delay ; esperar 1 segundo

acall read_temperature ; inicia la lectura de temperatura

mov a,r1 ; primer byte leydo

call a_dec ; convercion a decimal

call mostrar_display ; mostrando en el display


ajmp loop

;----------------------------------------

; ESCRITURA EN EL DS1620

; esta rutina escribe datos en el DS1620

;----------------------------------------

write1620:

mov r0, #08h ; contador de bits

nextbitwrite:

clr clk

rrc a

mov dq, c

setb clk

djnz r0, nextbitwrite

ret

;----------------------------------------

; LECTURA DEL DS1620

;----------------------------------------

read1620:

mov r0, #09h ; contador de lectura de datos del DS1620

setb dq

nextbitread:

clr clk

mov c, dq

setb clk

rrc a
djnz r0, nextbitread

clr dq

ret

;----------------------------------------

; CONFIGURACION DEL DS1620

;----------------------------------------

configure:

setb rst

mov a, #0ch

acall write1620

mov a, #00001010b ; cpu = 1, 1shot = 0, thf = 0, tlf = 0

acall write1620

clr rst

ret

;----------------------------------------

; inicio de conversión

;----------------------------------------

start_convert:

setb rst

mov a, #0eeh

acall write1620

clr rst

ret

;----------------------------------------

; LECTURA DE TEMPERATURA

;----------------------------------------

read_temperature:
setb rst

mov a, #0aah ; transmitir comando lectura

acall write1620

acall read1620 ; leer primer byte

mov r1, a ; guarda primer byte

acall read1620 ; leer segundo byte

mov r2, a ; guardar el segundo byte

clr rst ; final de la transferencia

ret

;---------------------------------------

; convercion de hexadecimal a decimal

; -----------------------------------

; la convercion es de un numero hexadecimal de 1 byte en el acumulador a

; a un numero de datos decimales de 2 bytes en el mismo a = low y b = high

;---------------------------------------

a_dec:

mov signo,#0

jnb acc.7,es_posi

es_nega:

mov signo,#0ffh

mov auxa,a ; guardo el negativo

setb c
clr a

subb a,auxa

addc a,#0 ; ahora a es positivo

es_posi:

mov n_hex,a

mov a,#99h

mov auxa,a

mov b,#0ffh

mov nh,#0ffh ; nl es el resultado high

lazo:

mov a,auxa

add a,#1

da a

jnc salto

inc nh ; incrementando el nhigh

salto:

inc b

mov auxa,a

mov a,b

cjne a,n_hex,lazo

mov b,nh ; detectando el signo

mov a,signo

cjne a,#0ffh,sin_signo

con_signo:

mov a,b ; agregando el signo negativo


orl a,#040h

mov b,a

sin_signo:

mov a,auxa

ret

;----------------------------------------

; mostrar el display

;----------------------------------------

mostrar_display:

mov auxa,a

anl a,#0fh

call buscar_numero ; encuentra el numero del display en aca

mov displays,a

clr p2.3

acall delay

setb p2.3

mov a,auxa

swap a

anl a,#0fh

call buscar_numero ; encuentra el numero del display en aca

mov displays,a

clr p2.2

acall delay
setb p2.2

mov a,b ; la parte alta del decimal

mov auxa,a

anl a,#0fh

call buscar_numero ; encuentra el numero del display en ac a

mov displays,a

clr p2.1

acall delay

setb p2.1

mov a,b ; en la parte alta de b esta el signo

anl a,#0f0h

mov displays,a

clr p2.0

acall delay

setb p2.0

ret

;------------------------------------------

; busca numero (retardo)

;------------------------------------------

buscar_numero:

mov dptr,#tabla_display
movc a,@a+dptr

ret

;------------------------------------------

; delay (retardo)

;------------------------------------------

delay:

mov t,#0ffh

buc: nop

djnz t,buc

ret

;------------------------------------------

; tabla del display

; esta es la secuencia de datos que genera los

; numeros para catodo comun

;------------------------------------------

tabla_display:

; 0 1 2 3 4 5 6 7 8 9

db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh

end

Para cualquier consulta escriba a raualejandroql@yahoo.es y visite nuestro FORO-


Microcontroladores para poder intercambiar opiniones y dudas al respecto.