Un visualizador de reloj de tiempo real y variables de
clima, se utiliza para visualizar el tiempo y fecha en curso con temperatura y
humedad en el ambiente seleccionado.
Este proyecto deliberará la visualización del tiempo
en el formato hh:mm:ss de 24 horas, fecha en un formato de DD:MM:AA,
temperatura en grados celcius [°C] y humedad relativa [%H]. El microcontrolador
utilizado es el Atmega32A que envía los datos a visualizar a 16 display de 7
segmentos Ánodo común. Los 16 displays son encendidos individualmente uno
seguido de otro y cada conjunto de 8 displays son conectados a un chip
decodificador BCD a 7 segmentos (7447) con el propósito de ahorrar puertos
conectados al Atmega, mientras que cada común de los displays son conectados
con un transistor 2N3904 a un puerto del Atmega. Para la hora y fecha se usa
una RTC (DS1307), para la temperatura un termistor (TTC103) y humedad un sensor
HH10D cuya salida es un valor de frecuencia. El programa del microcontrolador dispone
una velocidad de desplazamiento o de barrido entre displays por cada 1ms, así
como los datos a visualizar que vamos de mostrar.
Para
la visualización dispone un una función para configurar la fecha y hora a
través de 3 pulsadores. Lista de materiales
Para este proyecto es muy indispensable disponer de un conjunto de herramientas básicas de un laboratorio de electrónica: un soldador, alambre de estaño, unos alicates de punta de aguja y cables.
Para
el desarrollo de nuestro proyecto dispondremos de los siguientes materiales:
- 1 Atmega32A
- 1 termistor TTC103
- 1 sensor de Humedad HH10D
- 16 displays de 7 segmentos Ánodo común (a su color preferido) 6 displays en par pequeños, 2 individuales pequeños y 2 individuales medianos.
- 2 Decodificadores BCD a 7 segmentos 74LS47.
- 15 resistencias de 330 Ohms.
- 16 resistencias de 1 KOhms
- 5 resistencias de 10 KOhms
- 2 resistencias de 4.7 KOhms
- 2 resistencias de 560 Ohms
- 1 resistencia de 120 Ohms
- 1 resistencia de 220 Ohms
- 1 potenciómetro lineal de 10 KOhms
- 16 transistores 2N3904
- 1 Real Time Clock DS1307
- 1 cristal 32.768KHZ
- 1 batería de botón 3V con su porta-pila
- 2 condensadores electrolíticos de 47uF
- 1 condensador electrolítico de 100uF
- 2 condensadores cerámicos de 0.1uF
- 4 condensadores cerámicos de 10nF
- 1 Led rojo de 3mm
- 3 pulsadores
- 4 jumpers
- 1 regleta de espadines hembra y macho
- 1 regulador de voltaje LM317
- Jack DC para PCB
- PCB doble placa.
Desarrollo
Desplazamiento o Barrido
El barrido de los displays
es básicamente una manera de activar uno por uno en un instante a una
frecuencia elevada.
Un display de 7-segmentos
es una manera de visualizar datos obtenidos por el uC enviados a través de 8
puertos por lo que equivale a utilizar todo un puerto del uC para poder manejar
un solo 7-segmentos.
Pero en esta ocasión nos
encontramos con la necesidad de utilizar más de un display pero a la vez no
disponemos de la cantidad suficiente de puertos para ser utilizados. Por la falta
de puertos es imposible conectar y encender todo un conjunto de 16 dispalys,
para ello se utiliza el método de barrido que consiste en encender y apagar
cada display seguido de otro cada 1ms, entonces no la vemos encenderse y
apagarse, porque la frecuencia de es imperceptible al ojo humano.
Consideramos
encender y apagar en 4 puertos del uC para un conjunto de 8 (displays de tiempo
y temperatura), y otros 4 puertos para un conjunto de 8 (displays de fecha y
humedad). El propósito de esta división es mejorar el rendimiento durante el
proceso de barrido; por ejemplo durante el encendido y apagado del primer y
último display hay que considerar el tiempo que demora e barrer hasta el último
display, en este caso es una frecuencia de
aproximadamente de 8ms sin considerar tiempos muertos del uC.
BCD a 7 segmentos
Uno de los problemas
mencionados anteriormente es el número de puertos limitados del uC, por lo que
se utiliza un chip para decodificar datos BCD de 4 bits a 7 segmentos
correspondiente a cada display,
Cada
conjunto de 8 displays son conectados a un chip decodificador BCD a
7-segmentos, por lo que es necesario el uso de 2 chip 74LS47. El número total
de puertos utilizados para la presentación de datos son de 8 puertos, y para el
barrido de los displays son de 16 puertos uno por display conectado al común,
por lo tanto los puertos utilizados por el uC son de 24 puertos para un total
de 16 displays.
Hora y Fecha
La presentación de hora y
fecha se la realiza mediante un el dispositivo DS1307, Por la simple razón de
trabajar con eventos más precisos, puntuales y exactos a lo largo del tiempo.
Este pequeño dispositivo es uno de los más populares en relojes RTC (Real Time
Clock) por su sencillez de uso y por su confiabilidad a largo plazo. Preparado
para ofrecerte la hora hasta el año 2100 y bisiestos.
Para la lectura de hora y
fecha se usa el bus I2C entre el uC y RTC que brinda hora con minutos y
segundos y calendario que contempla los años bisiestos hasta fin de siglo.
Sensor de Temperatura
Uno de los principales
objetivos de este proyecto es el uso de un sensor de temperatura analógica para
la visualización de temperatura en grados celcius en dos displays.
El sensor utilizado es el
TTC103 de salida de voltaje analógico, por la única razón de disponer este dispositivo,
la opción de utilizar otro sensor es opcional, pero yo dispongo del termistor.
Las características del
termistor son las siguientes:
Características
|
Valor
|
Valor de resistencia
nominal del termistor (NTC) a 25ºC
|
10000 [ohm]
|
Parámetro beta
|
4050 [K]
|
Fórmula utilizada por el
fabricante
|
R(T) = R25 * exp(B/T - B/T25)
|
Para la lectura de los
datos del sensor se utiliza un puerto analógico del uC el cual es ADC7, y para
obtener la temperatura real se utiliza la fórmula propuesta el fabricante en
grados Kelvin, y para obtener en grados celcius como se lo ha propuesto solo se
usa una simple ecuación °C = °K - 273.15.
Sensor de Humedad
Otro de los objetivos de
este proyecto es el uso de un sensor de humedad para la visualización de
humedad relativa en dos displays.
El sensor utilizado es el
HH10D cuya salida es un valor de frecuencia que varía entre los 5 y 10 kHz
dependiendo de la humedad entre el 1 y 99 % respectivamente.
El modulo del HH10D
consiste en un sensor capacitivo tipo CMOS, convertidor de frecuencia y una memoria
EEPROM usada para el almacenamiento de los factores de calibración y para el
cálculo de la humedad. Debido a las características del sensor de humedad de
tipo condensador, el sistema puede responder a los cambios de humedad muy
rápido.
Las características del sensor
de humedad son las siguientes:
Parámetro
|
Mínimo
|
nominal
|
Máximo
|
Rango de humedad
|
1 %
|
99 %
|
|
exactitud
|
-3 %
|
+3 %
|
|
Rango de temperatura
|
-10 °C
|
+60 °C
|
|
Voltaje de operación
|
2.7 V
|
3 V
|
3.3 V
|
estabilidad vs tiempo
|
1 % por año
|
||
Corriente de consumo
|
120 uA
|
150 uA
|
180 uA
|
Rango de frecuencia de
salida
|
5 kHz
|
6.5 kHz
|
10 kHz
|
Para la lectura de humedad
correcta, dos factores de calibración deben ser leídos desde la EEPROM en la
dirección 10 y 12 por un bus i2C para la sensibilidad y compensación respectivamente.
Una vez calibrado el modulo, se mide la frecuencia de salida del sensor,
entonces el valor de humedad correcto puede ser calculada mediante la siguiente
expresión:
HR(%)=(compensacion-Fout)*sens/2^12
La dirección física de la EEPROM
está fijada a 81.
Dirección de la
sensibilidad 10.
Dirección de la
compensación 12.
Para la lectura de los factores de calibración puedes usar otro programa en el mismo circuito del proyecto o como prefieras para saber qué factores corresponden a tu sensor. Para mi sensor son: sens = 377 y compensación = 7792.
Pulsadores
Con el objeto de realizar un reloj con funciones básicas, se incorporó 3 pulsadores con el propósito de igualar la hora o cambiar la fecha.
Con el objeto de realizar un reloj con funciones básicas, se incorporó 3 pulsadores con el propósito de igualar la hora o cambiar la fecha.
El pulsador Menú realiza
la función de cambiar de modo normal a modo minutos, horas, años, meses y días:
- Menu = 0; modo normal
- Menu = 1; modo de igualar minutos
- Menu = 2; modo de igualar horas
- Menu = 3; modo de igualar Años
- Menu = 4; modo de igualar meses
- Menu = 5; modo de igualar días
- Menu = 6; modo de guardar en memoria tiempo y fecha actualizada
Los pulsadores de
disminuir (-) y aumentar (+) realizar la simple función de cambiar los valores
de los datos para obtener los datos deseados o igualados con respecto a un reloj o
calendario actual.
Esquematicos
Esquema
del reloj calendario, temperatura y humedad.
Nota: no existe una librería en Proteus para el
HH10D por lo que se usa un generador de onda cuadrada y se lo conecta con espadines.
Se usa
un Lm317 por la razón de utilizar componentes disponibles a mi alcance, si
prefieres puedes usar un Lm1117 y modificar el esquema para obtener 3.3V.
Diseño de PCB
Diseño de PCB
Diseño de la tarjeta de control para su elaboración en PCB de placa
doble
Placa
superior de la PCB.
Placa
inferior de la PCB.
Diseño de la tarjeta de display y visualización en PCB.
Placa
superior de la PCB.
Placa inferior de la PCB.
Diseño en 3D de las placas PCB
Se fabricarán 2 placas
para evitar realizar una sola grande y para empotrar una sobre otra. Si
prefieres puedes usar componentes superficiales o SMD y modificando el diseño
en PCB.
El programa fue
desarrollado en CodevisionAVR versión 2.05.0
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project : Reloj, Temperatura y Humedad
Version : 1.0
Date :
30/09/2014
Author : Byron
Ganazhapa
Company : UTPL
Comments:
Chip type
: ATmega32A
Program type
: Application
AVR Core Clock frequency: 8,000000 MHz
Memory model
: Small
External RAM size
: 0
Data Stack size
: 512
*****************************************************/
#include <mega32a.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <delay.h>
#include <bcd.h>
// Variables de tiempo y fecha
unsigned char hora;
unsigned char minu;
unsigned char seg;
unsigned char dia;
unsigned char mes;
unsigned char anyo;
unsigned char hora_BCD;
unsigned char minu_BCD;
unsigned char seg_BCD;
unsigned char dia_BCD;
unsigned char mes_BCD;
unsigned char anyo_BCD;
unsigned char dig_2_seg, dig_1_seg;
unsigned char dig_2_min, dig_1_min;
unsigned char dig_2_hora, dig_1_hora;
unsigned char dig_2_dia, dig_1_dia;
unsigned char dig_2_mes, dig_1_mes;
unsigned char dig_2_anyo, dig_1_anyo;
unsigned char get_hora, get_minu, get_seg;
unsigned char get_dia, get_mes, get_anyo;
#define
DISPLAY_1_SEG 0x01
#define
DISPLAY_2_SEG 0x01
#define
DISPLAY_1_MIN 0x01
#define
DISPLAY_2_MIN 0x01
#define
DISPLAY_1_HORA 0x01
#define
DISPLAY_2_HORA 0x01
#define
DISPLAY_1_DIA 0x01
#define
DISPLAY_2_DIA 0x01
#define
DISPLAY_1_MES 0x01
#define
DISPLAY_2_MES 0x01
#define
DISPLAY_1_ANYO 0x01
#define DISPLAY_2_ANYO
0x01
#define
DISPLAY_1_TEMPERATURA 0x01
#define
DISPLAY_2_TEMPERATURA 0x01
#define
DISPLAY_1_HUMEDAD 0x01
#define
DISPLAY_2_HUMEDAD 0x01
int Menu=0;
int dig_1_temp, dig_2_temp;
int dig_1_hum,
dig_2_hum;
// variables para sensor de humedad
unsigned int count
= 0;
float
temp;
float
frecuencia;
float
H = 0.0;
int
Humedad;
// variables para sensor de tempoeratura
float Vin =
5.0; // [V] Voltage de entrada en el divisor de
tension
float Raux =
10000; // [ohm] Valor de la resistencia secundaria del
divisor de tension
float R0 =
10000; // [ohm] Valor de resistencia nominal del
termistor (NTC) a 25ºC
float T0 =
298.15; // [K] (25ºC)
float Vout = 0.0; // [V] Voltage given by the Voltage-Divider
float Rout =
0.0; // [ohm] Resistencia actual del Termistor (NTC)
float beta =
4050.0; // [K] Parametro Beta
float TempK =
0.0; // [K] Temperatura de salida en grados Kelvin
int TempC = 0;
// [ºC] Temperatura de
salida en grados Celsius
float Rinf; // [ohm] Parametros Rinf
long iCont = 0;
// Contador de ciclos, par el calculo de la temperatura media
float cTemp1;
// Variable temporal para
acumular las temperaturas leidas
// variables para ADC
unsigned int adc_data;
#define ADC_VREF_TYPE 0x40 //47
// I2C Bus functions
#asm
.equ
__i2c_port=0x15 ;PORTC
.equ
__sda_bit=1
.equ
__scl_bit=0
#endasm
#include <i2c.h>
// DS1307 Real Time Clock functions
#include <ds1307.h>
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
if(Menu == 1){
// igualar minutos
minu = minu +
1;
delay_ms(100);
if(minu>59) minu = 0;
}
if(Menu == 2){
// igualar horas
hora = hora +
1;
delay_ms(100);
if(hora>24) hora = 0;
}
if(Menu == 3){
// igualar año
anyo = anyo +
1;
delay_ms(100);
if(anyo>99) anyo = 0;
}
if(Menu == 4){
// igualar mes
mes = mes +
1;
delay_ms(100);
if(mes>12)
mes = 0;
}
if(Menu == 5){
// igualar dia
dia = dia +
1;
delay_ms(100);
if(dia>31)
dia = 0;
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
if(Menu == 1){ // igualar minutos
minu = minu - 1;
delay_ms(100);
if((signed
char)minu<0) minu = 59;
}
if(Menu == 2){ // igualar horas
hora = hora -
1;
delay_ms(100);
if((signed
char)hora<0) hora = 23;
}
if(Menu == 3){
// igualar año
anyo = anyo -
1;
delay_ms(100);
if((signed
char)anyo<0) anyo = 99;
}
if(Menu == 4){
// igualar mes
mes = mes -
1;
delay_ms(100);
if((signed
char)mes<0) mes = 12;
}
if(Menu == 5){
// igualar dia
dia = dia -
1;
delay_ms(100);
if((signed
char)dia<0) dia = 31;
}
}
// Timer1 output compare A interrupt service routine
interrupt [TIM1_COMPA] void timer1_compa_isr(void)
{
TCNT1H = 0x00;
TCNT1L = 0x00;
temp = (float)count;
frecuencia = temp*1.02554; //constante de calibración = 1.02354.
Cálculo de humedad
H = (7792-frecuencia)*(0.09204);
Humedad = (int)H;
count = 0;
}
// Analog Comparator interrupt service routine
interrupt [ANA_COMP] void ana_comp_isr(void)
{
count =
count+1; // Cálculo de frecuencia.
}
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input
voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}
// Declare your global variables here
void main(void)
{
// Declare your local variables here
PORTA=0x00;
DDRA=0x7F;
PORTB=0x00;
DDRB=0xF1;
PORTC=0x00;
DDRC=0xFC;
PORTD=0x00;
DDRD=0xF3;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 31,250 kHz
// Mode: CTC top=OCR1A
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: On
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x0C;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1A=(31250-1);
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Falling Edge
// INT1: On
// INT1 Mode: Falling Edge
// INT2: Off
GICR|=0xC0;
MCUCR=0x0A;
MCUCSR=0x00;
GIFR=0xC0;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x10;
// Analog Comparator initialization
// Analog Comparator: On
// Interrupt on Rising Output Edge
// Analog Comparator Input Capture by Timer/Counter 1:
Off
ACSR=0x0B;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 500,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;
// I2C Bus initialization
i2c_init();
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
rtc_get_time(&get_hora,&get_minu,&get_seg);
rtc_get_date(&get_dia,&get_mes,&get_anyo);
delay_ms(100);
hora = get_hora;
minu = get_minu;
seg = get_seg;
dia = get_dia;
mes = get_mes;
anyo = get_anyo;
rtc_set_time(hora,minu,seg);
rtc_set_date(dia,mes,anyo);
// Global enable interrupts
#asm("sei")
while (1){
/*
Menu
= 0; modo normal
Menu = 1;
modo de igualar minutos
Menu = 2;
modo de igualar horas
Menu = 3;
modo de igualar Años
Menu = 4;
modo de igualar meses
Menu = 5;
modo de igualar días
Menu = 6;
modo de guardar en memoria tiempo y fecha actualizada
*/
if (PINB.1
== 1){ // Botón de Menú
Menu =
Menu + 1; // menu en modo de igualar
hora y fecha
delay_ms(500); // retrazo para
evitar rebotes
}
if (Menu
== 6){
rtc_set_time(hora,minu,seg); // menu en modo de grabar en memoria del
DS1307 el tiempo y fecha actualizada.
rtc_set_date(dia,mes,anyo);
delay_ms(1000);
Menu =
0;
}
PORTD.6
= DISPLAY_2_TEMPERATURA & 0x00;
PORTB.0
= DISPLAY_2_HUMEDAD & 0x00;
if(Menu
== 0){ // obtener el tiempo y fecha en modo normal
rtc_get_time(&hora,&minu,&seg);
rtc_get_date(&dia,&mes,&anyo);
}
cTemp1=0;
if (iCont<=50000){
Rinf=R0*exp(-beta/T0); // = 0.0126079
adc_data=read_adc(7);
// leo el canal ADC 7
//
Cálculo del valor de la resistencia termistor (NTC) actual (a través de Vout)
Vout
= Vin*(adc_data)/1023.0;
Rout = (Raux*Vout/(Vin-Vout));
// Calculo de la temperatura
en grados Kelvin
TempK=log(Rout/Rinf);
TempK=(beta/TempK);
//
Calculo de la temperatura en grados Celsius
TempC=TempK-273.15;
//
Almacenamos la temperatura (grados Celsuis) actual para despues obtener la
media
cTemp1 = cTemp1 + TempC;
delay_us(10);
iCont ++;
}
else{
//
Calculamos la temperatura media
TempC = (int)(cTemp1/iCont);
delay_us(10);
iCont=0;
}
//
Convierto los digitos a BCD y los divido en dos partes de 4 bits para cada
display.
seg_BCD = bin2bcd(seg); dig_2_seg
= (seg_BCD&0xF0)>>4;
dig_1_seg = seg_BCD&0x0F;
minu_BCD
= bin2bcd(minu); dig_2_min
= (minu_BCD&0xF0)>>4;
dig_1_min = minu_BCD&0x0F;
hora_BCD = bin2bcd(hora); dig_2_hora =
(hora_BCD&0xF0)>>4; dig_1_hora
= hora_BCD&0x0F;
TempC = bin2bcd(TempC);
dig_2_temp = (TempC&0xF0)>>4;
dig_1_temp = TempC&0x0F;
dia_BCD = bin2bcd(dia); dig_2_dia
= dia_BCD&0xF0;
dig_1_dia =
(dia_BCD&0x0F)<<4;
mes_BCD = bin2bcd(mes); dig_2_mes
= mes_BCD&0xF0;
dig_1_mes =
(mes_BCD&0x0F)<<4;
anyo_BCD
= bin2bcd(anyo); dig_2_anyo = anyo_BCD&0xF0; dig_1_anyo = (anyo_BCD&0x0F)<<4;
Humedad = bin2bcd(H); dig_2_hum
= Humedad&0xF0;
dig_1_hum =
(Humedad&0x0F)<<4;
// Realizo
la miltiplexación de displays.
PORTA = dig_1_seg;
PORTB = dig_1_anyo;
PORTA.4
= DISPLAY_1_SEG;
PORTC.5
= DISPLAY_1_ANYO;
delay_ms(1);
PORTA.4
= DISPLAY_1_SEG & 0x00;
PORTC.5
= DISPLAY_1_ANYO & 0x00;
PORTA = dig_2_seg;
PORTB = dig_2_anyo;
PORTA.5
= DISPLAY_2_SEG;
PORTC.6
= DISPLAY_2_ANYO;
delay_ms(1);
PORTA.5
= DISPLAY_2_SEG & 0x00;
PORTC.6
= DISPLAY_2_ANYO & 0x00;
PORTA = dig_1_min;
PORTB = dig_1_mes;
PORTA.6
= DISPLAY_1_MIN;
PORTC.7
= DISPLAY_1_MES;
delay_ms(1);
PORTA.6
= DISPLAY_1_MIN & 0x00;
PORTC.7
= DISPLAY_1_MES & 0x00;
PORTA = dig_2_min;
PORTB = dig_2_mes;
PORTC.2
= DISPLAY_2_MIN;
PORTD.0
= DISPLAY_2_MES;
delay_ms(1);
PORTC.2
= DISPLAY_2_MIN & 0x00;
PORTD.0
= DISPLAY_2_MES & 0x00;
PORTA = dig_1_hora;
PORTB = dig_1_dia;
PORTC.3
= DISPLAY_1_HORA;
PORTD.1
= DISPLAY_1_DIA;
delay_ms(1);
PORTC.3
= DISPLAY_1_HORA & 0x00;
PORTD.1
= DISPLAY_1_DIA & 0x00;
PORTA = dig_2_hora;
PORTB = dig_2_dia;
PORTC.4
= DISPLAY_2_HORA;
PORTD.4
= DISPLAY_2_DIA;
delay_ms(1);
PORTC.4
= DISPLAY_2_HORA & 0x00;
PORTD.4
= DISPLAY_2_DIA & 0x00;
PORTA = dig_1_temp;
PORTB = dig_1_hum;
PORTD.5
= DISPLAY_1_TEMPERATURA;
PORTD.7
= DISPLAY_1_HUMEDAD;
delay_ms(1);
PORTD.5
= DISPLAY_1_TEMPERATURA & 0x00;
PORTD.7
= DISPLAY_1_HUMEDAD & 0x00;
PORTA = dig_2_temp;
PORTB = dig_2_hum;
PORTD.6
= DISPLAY_2_TEMPERATURA;
PORTB.0
= DISPLAY_2_HUMEDAD;
delay_ms(1);
}
}
Imágenes del proyecto concluido
Descargas
Programa en CodeVisionAVR y HEX.
http://www.mediafire.com/download/a9e6eatwnqi7x1v/Reloj.rar
Esquemático y diseño PCB En Proteus V 7.8
http://www.mediafire.com/download/932qfzyk535yd93/Esquematico+y+PCB.rar
Si no funciona con la librería DS1307 actual del programa CVAVR puedes usar estas librerías adjuntas, solo tienes que pegarlas en la dirección que se instalo el programa.
http://www.mediafire.com/download/6xtr88ms56og8x8/Librerias+DS1307.rar