La hora actual es:

 



Autor: Almudena Soblechero García

Profesor de apoyo: Juan Muñoz

( 800X600)

(




RELOJ DIGITAL CON ALARMA


INTRODUCCIÓN

ESQUEMÁTICO

LISTA DE PRECIOS

POGRAMACION DEL PIC 16F84

BIBLIOGRAFÍA

PÁGINAS DE INTERÉS

SUGERENCIAS





INTRODUCCIÓN



La intención de este proyecto es realizar una reloj digital con alarma, a través de un pic programado en lenguaje ensamblador. El reloj constará de cuatro displays ,donde se visualicen las horas y de cuatro botones. El botón de set alarm permitirá poner la alarma con ayuda de los botones up, down y el botón de set time será el encargado de poner a punto la hora con ayuda de los botones up,down.

Hemos elegido un pic16F84 porque es reprogramable y permitiendo modificar el programa del pic.

El programa ensamblador lo tenemos que transformar a código máquinas a través de un compilador universal (Superpro), luego poner el pic en el zócalo para que el programador programe el pic.

Si quieres ver manuales sobre programación en ensamblador en html o en java script, o incluso bajarte algún programa como los que se han utilizado en esta pagina ve a la sección de paginas de interés allí encontrarás las direcciones donde puedes hallar todas estas cosas. Además si queréis saber cómo se hace un diseño en una placa de cobre también podéis encontrarlo en la zona de paginas de interés.



ESQUEMÁTICO



 Download del esquemático

LISTA DE PRECIOS

Nombre

Nº de unidades

Encapsulado

Precio Pesetas

Precio Euros

Transistor BC107

5

TO1 8

48.30

48.30

0.29

0.29

CI 4511

1

DIL16

48

48

0,29

0,29

PIC16F84

1

CON40

641

641

3,85

3,85

Resistencias (10k)

8

0204V

3

24

0,02

0,16

Resistencias (180)

7

0204V

3

21

0,02

0,14

Display 7-seg

4

7SEG-13

110

440

0,66

2,64

Interruptores

4

DT6

42

168

0,25

1,01

Connector 40

1

CON40

19

19

0,11

0,11

Zumbador

1

AL11P

186

186

1,12

1,12

Zocalo de 18 pines

1

CON40

46

46

0,28

0,28

Placa de inserción

2


985

1670

5,92

10,04

Crital de cuarzo

1


65

65

0,39

0,39

Precio total

Pesetas

3376.3

Euros

20.29


Download

Display 7-seg PIC 16F84 BC107 CI 4511




PROGRAMACIÓN DEL PIC 16F84

Este programa tiene continuas mejoras por eso siempre estará en construcción si quereis COGER EL PROGRAMA pinchad en el gift de obras

;#############################################################
; Fichero : Amini.asm
; Autor : Almudena Soblechero Garc¡a.
; Profesor: Juan Mu¤oz Barbo.
; Fecha: Marzo de 2002.
; Version:0.0
; Sistema RAD-MICROS.
; Placa Microcontroladora: micro-p1684.
; Placa de Aplicaciones: apli-miniclock.
; Placa de programacion: Programador Universal Superpro II/P. ( XELTEK )
; Bus: bus-40.
; Codigo para: PIC16C84 y PIC16F84
; Clock: 4MHz , XT. -> Ciclo = 1 uS.
; Reset: Power On Reset.
; Watch dog: Inhabilitado.
; Proteccion de codigo: Inhabilitado.
; Ficheros requeridos: H16f84a.inc
; Funcion : Genera RELOJ DIGITAL con BCD to 7 segment con alarma.
;#############################################################
;#################### CABEZERAS ##############################
LIST p=PIC16F84A ; Directiva para definir micro.
#include <H16f84a.inc> ; Fichero standard de cabezera.

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC
;#################### DEFINICIONES ###########################

w_temp EQU 0x0C ; Variable para guardar W.
status_temp EQU 0x0D ; Variable para guardar STATUS.
con0 EQU 0x0E ; Variable de temporizacion.
con1 EQU 0x0F ; Variable de temporizacion.
con2 EQU 0x10 ; Variable de temporizacion.
u_s_t EQU 0x11 ; Unidades de segundo de tiempo.
d_s_t EQU 0x12 ; Decenas de segundo de tiempo.
u_m_t EQU 0x13 ; Unidades de minuto de tiempo.
d_m_t EQU 0x14 ; Decenas de minuto de tiempo.
u_h_t EQU 0x15 ; Unidades de hora de tiempo.
d_h_t EQU 0x16 ; Decenas de hora de tiempo.
u_s_a EQU 0x17 ; Unidades de segundo de alarma.
d_s_a EQU 0x18 ; Decenas de segundo de alarma.
u_m_a EQU 0x19 ; Unidades de minuto de alarma.
d_m_a EQU 0x1A ; Decenas de minuto de alarma.
u_h_a EQU 0x1B ; Unidades de hora de alarma.
d_h_a EQU 0x1C ; Decenas de hora de alarma.

;################ COMIENZO DEL PROGRAMA #####################

ORG 0x00 ; Vector de Reset.
GOTO inicio ; Programa Principal.

;########## TRATAMIENTO DE INTERRUPCIONES ####################

ORG 0x04 ; Vector de interrupcion.
MOVWF w_temp ; Guarda W.
MOVF STATUS,W
MOVWF status_temp ; Guarda STATUS.

DECFSZ con0,F ; Salta si tiempo = 1 seg.
GOTO salir
MOVLW 0x3D ; Variable para temporizar.
MOVWF con0 ; con0 x divisor x TMR0 = 1 segundo.

; Tratamos unidades de segundos de tiempo.
INCF u_s_t,F
MOVF u_s_t,W
SUBLW 0x0A ; 10 - (u_s_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_s_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_s_t ; 0 --> u_s_t
; Tratamos decenas de segundos de tiempo.
INCF d_s_t,F
MOVF d_s_t,W
SUBLW 0x06 ; 6 - (d_s_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_s_t) = 6
GOTO salir
MOVLW 0x00
MOVWF d_s_t ; 0 --> d_s_t
; Tratamos unidades de minutos de tiempo.
INCF u_m_t,F
MOVF u_m_t,W
SUBLW 0x0A ; 10 - (u_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_m_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_m_t ; 0 --> u_m_t
; Tratamos decenas de minutos de tiempo.
INCF d_m_t,F
MOVF d_m_t,W
SUBLW 0x06 ; 6 - (d_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_m_t) = 6
GOTO salir
MOVLW 0x00
MOVWF d_m_t ; 0 --> d_m_t

; Tratamos unidades de horas de tiempo.
INCF u_h_t,F
MOVF u_h_t,W ; Pueden ser las 24 horas ?
SUBLW 0x04 ; 4 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 4
GOTO uh_t_no_4
GOTO uh_t_si_4
uh_t_no_4 MOVF u_h_t,W ; No son las 24 horas
SUBLW 0x0A ; 10 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 10
GOTO salir
MOVLW 0x00
MOVWF u_h_t ; 0 --> u_h_t
; Tratamos decenas de horas de tiempo.
INCF d_h_t,F
GOTO salir
uh_t_si_4 MOVF d_h_t,W ; Son las 24 horas ?
SUBLW 0x02 ; 2 - (d_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_h_t) = 2
GOTO salir
MOVLW 0x00 ; Son las 24 horas --> 00 horas.
MOVWF u_h_t ; 0 --> u_h_t
MOVWF d_h_t ; 0 --> d_h_t
; Comprobamos las unidades de minuto.
MOVF u_m_a,W ; Movemos al registro
XORWF u_m_t,W ; Comprobamos con una xor si son iguales umt y uma
BTFSS STATUS,Z ; Si Z=1 --> sigue (u_m_a = u_m_t)
GOTO salir
; Comprobamos las decenas de minuto.
MOVF d_m_a,W ; Movemos al registro
XORWF d_m_t,W ; Hacemos la comprobacion
BTFSS STATUS,Z ; Si Z=1 --> sigue (d_m_a = d_m_t)
GOTO salir
; Comprobamos las unidades de hora
MOVF u_h_a,W ; Movemos al registro
XORWF u_h_t,W ; Son u_h_t y u_h_a iguales?
BTFSS STATUS,Z ; Si Z=1 --> sigue (u_h_t = u_h_a)
GOTO salir
; Comprobamos las decenas de hora
MOVF d_h_a,W ; Movemos al registro
XORWF d_h_t,W ; Son d_h_t y d_h_a iguales?
BTFSS STATUS,Z ; Si Z=1--> Call a Zumba (d_h_t = d_h_a)
GOTO salir
CALL zumba
salir MOVF status_temp,W
MOVWF STATUS ; Recupera STATUS.
SWAPF w_temp,F
SWAPF w_temp,W ; Recupera W.
BCF INTCON,T0IF ; Bajamos Bandera T0IF.
RETFIE ; Retorno de interrupcion.
;########## FIN DE TRATAMIENTO DE INTERRUPCIONES #############
;################ PROGRAMA PRINCIPAL #########################
inicio BSF STATUS,RP0 ; Banco 1
MOVLW B'10000101' ; Divisor = 64
MOVWF OPTION_REG ; Configuramos TMR0
MOVLW B'11110000'
MOVWF TRISB ; Configuramos I/O PORTB se pulsan interruptores
MOVLW B'00000000'
MOVWF TRISA ; Configuramos I/O PORTA

BCF STATUS,RP0 ; Banco 0
CLRF PORTB
CLRF PORTA
MOVLW 0x3D ; Variable para temporizar.
MOVWF con0 ; con0 x divisor x TMR0 = 1 segundo.
CLRF TMR0 ; TMR0 = 0
CLRF u_s_t ; u_s_t = 0
CLRF d_s_t ; d_s_t = 0
CLRF u_m_t ; u_m_t = 0
CLRF d_m_t ; d_m_t = 0
CLRF u_h_t ; u_h_t = 0
CLRF d_h_t ; d_h_t = 0
MOVLW B'10100000' ; Habilitamos Interrupciones TOIE.
MOVWF INTCON

bucle CALL display_t ; Visualiza en los display la hora
BTFSC PORTB,6 ; Se pulsa set reloj
GOTO sigue
GOTO reloj
sigue BTFSC PORTB,7 ; Se pulsa set alarma
GOTO bucle
GOTO alarma

reloj BTFSS PORTB,5
CALL mas_h_t ; Se programa mas_h_t.
BTFSS PORTB,4
CALL mas_m_t ; Se programa mas_m_t.
GOTO bucle ; Hace un retorno al bucle

alarma BTFSS PORTB,5
CALL mas_h_a ; Se programa mas_h_a.
BTFSS PORTB,4
CALL mas_m_a ; Se programa mas_m_a.
CALL display_a ; Visualiza en los displays la alarma
BTFSS PORTB,7 ; Se sigue pulsando alarma?
GOTO alarma
GOTO bucle
;############### FIN DE PROGRAMA PRINCIPAL ##################

;#################### RUTINAS ###############################

;************************************************************
; RUTINA: display_t
; Funcion: Visualiza el tiempo en los displays de 7 segmentos.
; Entrada: u_m_t, d_m_t, u_h_t, d_h_t
; Salida: nada.
; Variables utilizadas: nada.
;************************************************************
display_t MOVF u_m_t,W ; Visualizo unidades de minutos de tiempo.
MOVWF PORTA
BSF PORTB,0
CALL delay
BCF PORTB,0

MOVF d_m_t,W ; Visualizo decenas de minutos de tiempo.
MOVWF PORTA
BSF PORTB,1
CALL delay
BCF PORTB,1

MOVF u_h_t,W ; Visualizo unidades de horas de tiempo.
MOVWF PORTA
BSF PORTB,2
CALL delay
BCF PORTB,2

MOVF d_h_t,W ; Visualizo decenas de horas de tiempo.
MOVWF PORTA
BSF PORTB,3
CALL delay
BCF PORTB,3
RETURN
;************************************************************
; FIN DE RUTINA: display_t
;************************************************************

;************************************************************
; RUTINA: display_a
; Funcion: Visualiza la alrma en los displays de 7 segmentos.
; Entrada: u_m_a, d_m_a, u_h_a, d_h_a
; Salida: nada.
; Variables utilizadas: nada.
;************************************************************
display_a MOVF u_m_a,W ; Visualizo unidades de minutos de alarma.
MOVWF PORTA
BSF PORTB,0
CALL delay
BCF PORTB,0

MOVF d_m_a,W ; Visualizo decenas de minutos de alarma.
MOVWF PORTA
BSF PORTB,1
CALL delay
BCF PORTB,1

MOVF u_h_a,W ; Visualizo unidades de horas de alarma.
MOVWF PORTA
BSF PORTB,2
CALL delay
BCF PORTB,2

MOVF d_h_a,W ; Visualizo decenas de horas de alarma.
MOVWF PORTA
BSF PORTB,3
CALL delay
BCF PORTB,3
RETURN
;************************************************************
; FIN DE RUTINA: display_a
;************************************************************

;************************************************************
; RUTINA: mas_h_t
; Funcion: Modifica HORAS al pulsar H+.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_h_t
; Tratamos unidades de horas.
INCF u_h_t,F
MOVF u_h_t,W ; Pueden ser las 24 horas ?
SUBLW 0x04 ; 4 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 4
GOTO uh_t_no_4h
GOTO uh_t_si_4h
uh_t_no_4h MOVF u_h_t,W ; No son las 24 horas
SUBLW 0x0A ; 10 - (u_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_h_t) = 10
GOTO salh_t
MOVLW 0x00
MOVWF u_h_t ; 0 --> u_h_t
; Tratamos decenas de horas.
INCF d_h_t,F
GOTO salh_t
uh_t_si_4h MOVF d_h_t,W ; Son las 24 horas ?
SUBLW 0x02 ; 2 - (d_h_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_h_t) = 2
GOTO salh_t
MOVLW 0x00 ; Son las 24 horas --> 00 horas.
MOVWF u_h_t ; 0 --> u_h_t
MOVWF d_h_t ; 0 --> d_h_t
salh_t CALL delay_r ; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_h_t
;************************************************************

;************************************************************
; RUTINA: mas_m_t
; Funcion: Modifica MINUTOS al pulsar M+.
; Entrada: nada
; Salida: nada
; Variables utilizadas: nada
;************************************************************
mas_m_t
; Tratamos unidades de minutos.
INCF u_m_t,F
MOVF u_m_t,W
SUBLW 0x0A ; 10 - (u_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (u_m_t) = 10
GOTO salm_t
MOVLW 0x00
MOVWF u_m_t ; 0 --> u_m_t
; Tratamos decenas de minutos.
INCF d_m_t,F
MOVF d_m_t,W
SUBLW 0x06 ; 6 - (d_m_t) --> W
BTFSS STATUS,Z ; Si Z=1 => (d_m_t) = 6
GOTO salm_t
MOVLW 0x00
MOVWF d_m_t ; 0 --> d_m_t
salm_t CALL delay_r ; Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA: mas_m_t
;************************************************************

;************************************************************
;RUTINA:mas_h_a
;Funcion:Programa las horas de la alarma
;Entrada:nada
;Salida:
;Variables utilizadas:nada
;************************************************************
mas_h_a
;Tratamos unidades de hora de alarma
INCF u_h_a,F
MOVF u_h_a,W ;Pueden ser las 24 horas de alarma?
SUBLW 0x04 ;4-(u_h_a) -->W
BTFSS STATUS,Z ;Si Z=1 => (u_h_a) =4
GOTO uh_a_no_4h
GOTO uh_a_si_4h
uh_a_no_4h MOVF u_h_a,W ;No son las 24 horas
SUBLW 0x0A ;10-(u_h_a) -->W
BTFSS STATUS,Z ;Si Z=>1 (u_h_a) = 10
GOTO salh_a
MOVLW 0x00
MOVWF u_h_a ;0 --> u_h_a
;Tratamos decenas de hora de alarma
INCF d_h_a,F
GOTO salh_a
uh_a_si_4h MOVF d_h_a,W ;Son las 24 horas de alarma?
SUBLW 0x02 ;2- (d_h_a) --> W
BTFSS STATUS,Z ;Si Z=1 => (d_h_a) =2
GOTO salh_a
MOVLW 0x00 ;Son las 24 horas de alarma-->00 horas alarma.
MOVWF u_h_a ;0 --> u_h_a
MOVWF d_h_a ;0 --> d_h_a
salh_a CALL delay_r ;Eliminamos rebotes del PULSADOR.
RETURN
;************************************************************
; FIN DE RUTINA:mas_h_a
;************************************************************

;************************************************************
; RUTINA: mas_m_a
; Funcion: Programa minutos de hora de alarma
; Entrada: nada
; Salida: nada
; Varialbes utilizadas: nada
;************************************************************
mas_m_a
; Tratamos unidades de minuto de alarma
INCF u_m_a,F
MOVF u_m_a,W
SUBLW 0x0A ;10 -(u_m_a) -->W
BTFSS STATUS,Z ;Si Z=1 => (u_m_a)=10
GOTO salm_a
MOVLW 0x00
MOVWF u_m_a ;0 --> u_m_a
; Tratamos decenas de minutos de alarma
INCF d_m_a,F
MOVF d_m_a,W
SUBLW 0x06 ;6 -(d_m_a) --> W
BTFSS STATUS,Z ;Si Z=1 => (d_m_a) =6
GOTO salm_a
MOVLW 0x00
MOVWF d_m_a ;0--> d_m_a
salm_a CALL delay_r ;Eliminamos rebotes del PULSADOR.
;************************************************************
; FIN DE RUTINA:mas_m_a
;************************************************************

;************************************************************
; RUTINA:zumba
; Funcion: Produce un sonido cuando alarma coincide con tiempo
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
zumba BSF PORTA,4 ; Activamos el zumbador
CALL delay
CALL delay
BCF PORTA,4
RETURN
;************************************************************
; FIN DE RUTINA:Zumba
;************************************************************

;************************************************************
; RUTINA: delay
; Funcion: Produce un retardo para displays.
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
delay CLRF con1
MOVLW 0x05
MOVWF con2

loop DECFSZ con1,F
GOTO loop
DECFSZ con2,F
GOTO loop
RETURN
;************************************************************
; FIN DE RUTINA: delay
;************************************************************

;************************************************************
; RUTINA: delay_r
; Funcion: Produce un retardo para evitar rebotes en PULSADORES.
; Entrada: nada
; Salida: nada
; Variables utilizadas: con1, con2
;************************************************************
delay_r CLRF con1
MOVLW 0x0F
MOVWF con2

loop_r DECFSZ con1,F
GOTO loop_r
DECFSZ con2,F
GOTO loop_r
RETURN
;************************************************************
; FIN DE RUTINA: delay_r
;************************************************************

;################## FIN DE RUTINAS ##########################
;################## FIN DE PROGRAMA ########################
END ; Fin de programa.








BIBLIOGRAFÍA (INFORMACIÓN)



-El esquemático proporcionado por el tutor (Juan Muñoz)

-Los documentos PDF encontrados en un buscador (ver paginas de interés)

- El precio de los componentes en la lista de pedidos de la tienda

- El esquemático realizado con el eagle 3.5

- Apuntes para realizar una página web en lafalcu(ver páginas web)






PÁGINAS DE INTERÉS



www.google.com

www.ondaradio.com

www.spoerle.com

www.maplin.co.uk

www.bibliomidi.net

www.lafacul.com

www.cadsoft.de --> manual del eagle

Si queréis saber el proceso de fabricación de una placa pinchad en el siguiente archivo es un explicación realizada a través de ORCAD -CAPTURE que es otro programa de diseño de circuitos.

explicación