Monografias.com > Computación > Programación
Descargar Imprimir Comentar Ver trabajos relacionados

Reloj con ds1307 tiempo real con pic




Enviado por JUAN CARLOS LIZCANO



    Monografias.com

    ///////////////////// PROGRAMA QUE UTILZA EL I.C. DS1307 PARA GENERAR LA //////////////////////////

    //////////HORA EN TIEMPO REAL A TRAVES DE UNA LCD DE 2 POR 16 CARACTERES POR MEDIO DE UN PIC/////

    #include /// libreria para el manejo del pic16f873a

    #use delay(clock=8000000) /// declara la frecuencia del cristal a 8 MHZ

    #fuses HS,NOWDT,noPUT,NOLVP,NOBROWNOUT,NOWRT,NOPROTECT

    #include

    #include //libreria para la lcd de 2×16,(la de 4×16 es la libreria llamada lcd.c)

    #use fast_io(A)

    #use fast_io(B)

    #byte portc = 7 /// se definen direcciones de memoria

    #byte porta = 5

    #byte portb = 6

    // variables utilizadas en el programa…

    int sec;

    int min;

    int hrs;

    int day;

    int month;

    int yr;

    int dow;

    int datosec=1;

    int datomin;

    int datohrs;

    int datoday=1;

    int datomonth=1;

    int datoyr=14;

    int datodow=0;

    int horap;

    int horap1;

    void funcion_controldow(void){ //FUNCION CONTROL DIA DE LA SEMANA

    if(dow>7){

    dow=1;}

    }

    void funcion_fecha4(void){ //FUNCION DIA DE LA SEMANA

    volver7:

    if((bit_test(porta,5)==0)&&(bit_test(porta,0)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el dia de la semana d/s.reloj detenido

    dow++;

    funcion_controldow();

    delay_ms(100);

    switch (dow){

    case 1:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"LUN.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 2:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MAR.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 3:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MIE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 4:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"JUE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 5:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"VIE.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 6:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"SAB.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    case 7:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"DOM.");

    lcd_gotoxy(1,2);

    printf(lcd_putc,"D/S+ ");

    delay_ms(700);

    break;

    default:break;

    }

    goto volver7;

    }

    }

    void funcion_alarma(void){ //FUNCION ALARMA DE LA HORA EN PUNTO

    if((min==0)&&(sec==0)){

    lcd_putc( "f" );

    lcd_gotoxy(1,1);

    printf(lcd_putc," Hora * Exacta " ); ///se despliegan los datos en pantalla y suena la alarma de aprox.1seg.

    lcd_gotoxy(1,2);

    printf(lcd_putc," Systeltronik@. ");

    output_high(pin_b3);

    }

    else

    output_low(pin_b3);}

    void funcion_control1(void){//control para la fecha

    if(day>31){

    day=1;}

    if(month>12){

    month=1;}

    if(yr>49){

    yr=12;}

    }

    void funcion_fecha1(void){ //FUNCION FECHA

    volver3:

    if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar la fecha.dia.reloj detenido

    day++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Dia+ ");

    delay_ms(450);

    goto volver3;

    }

    }

    void funcion_fecha2(void){

    volver4:

    if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Mes.reloj detenido

    month++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Mes+ ");

    delay_ms(450);

    goto volver4;

    }

    }

    void funcion_fecha3(void){

    volver5:

    if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Year.reloj detenido

    yr++;

    funcion_control1();

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);

    lcd_gotoxy(1,2);

    printf(lcd_putc,"yrs+ ");

    delay_ms(250);

    goto volver5;

    }

    }

    void funcion_control(void){

    if(hrs>23){

    hrs=0;}

    if(min>59){

    min=0;}

    if(sec>59){

    sec=0;}

    }

    void funcion_reloj1(void) { //FUNCION HORA

    volver:

    if((bit_test(porta,0)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.hora.reloj detenido

    hrs++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Hrs+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(450);

    goto volver;

    }

    }

    void funcion_reloj2(void) {

    volver1:

    if((bit_test(porta,1)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,0)==1)&&(bit_test(porta,2)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.Minutos.reloj detenido

    min++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Min+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(450);

    goto volver1;

    }

    }

    void funcion_reloj3(void) {

    volver2:

    if((bit_test(porta,2)==0)&&(bit_test(porta,5)==1)&&(bit_test(porta,1)==1)&&(bit_test(porta,0)==1)){//si se cumplen estas condiciones en los swiches se puede alterar el reloj.segundos.reloj detenido

    sec++;

    funcion_control();

    lcd_gotoxy(1,2);

    printf(lcd_putc,"Seg+ %02d:%02d:%02d ",hrs,min,sec);

    delay_ms(350);

    goto volver2;

    }

    }

    void formato_12h24h(void){ //FUNCION MOSTRAR DATOS EN FORMATO 12H O 24H

    if((bit_test(porta,3)==1)&&(bit_test(porta,5)==0)&&(bit_test(porta,4)==1)){//si se cumplen estas condiciones en los swiches se puede alternar exibir la hora en formato 12h o 24h.No se detiene el reloj

    if(hrs==0){

    datohrs=hrs+12;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d AM ",datohrs,min,sec);

    }

    else{

    if(datohrs>12){

    datohrs=datohrs-12;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}

    else{

    if(hrs<12){

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d AM ",hrs,min,sec); }

    else{

    if(hrs==12){

    datohrs=hrs;

    lcd_gotoxy(1,2);

    printf(lcd_putc,"12h. %02d:%02d:%02d PM ",datohrs,min,sec);}

    }

    }

    }

    }

    else{

    lcd_gotoxy(1,2);

    printf(lcd_putc,"24h. %02d:%02d:%02d ",hrs,min,sec); }

    }

    ///////////////////////////////////////////////////////////////////////////////////

    ////////////////////// PROGRAMA PPAL//////////////////////////////////////////

    ///////////////////////////////////////////////////////////////////////////////////

    void main()

    {

    ds1307_init(); ///INICIO ds1307

    ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha DEL DS1307

    ds1307_get_time(hrs,min,sec); /// se obtiene la hora DEL DS 1307

    datohrs=hrs;

    datomin=min;

    datosec=sec;

    datoday=day;

    datomonth=month;

    datoyr=yr;

    datodow=dow;

    set_tris_a(0b11111111);

    set_tris_b(0x00);

    port_b_pullups(true);

    lcd_init(); //INICIO DE LA LCD 2X16

    programado:

    ds1307_set_date_time(day,month,yr,dow,hrs,min,sec); /// se escribe en el DS1307 el tiempo configurado

    while(1)

    {

    delay_ms(100);

    ds1307_get_date(day,month,yr,dow); /// se obtiene la fecha para mostrar

    ds1307_get_time(hrs,min,sec); /// se obtiene la hora para mostrar

    datohrs=hrs;

    datomin=min;

    datosec=sec;

    formato_12h24h();

    switch (dow){ //RUTINA QUE MUESTRA EL DIA DE LA SEMANA de acuerdo al dato dow

    case 1:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"LUN. ");

    break;

    case 2:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MAR. ");

    break;

    case 3:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"MIE. ");

    break;

    case 4:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"JUE. ");

    break;

    case 5:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"VIE. ");

    break;

    case 6:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"SAB. ");

    break;

    case 7:

    lcd_gotoxy(1,1);

    printf(lcd_putc,"DOM. ");

    break;

    default:break;

    }

    lcd_gotoxy(6,1);

    printf(lcd_putc,"%02d/%02d/20%02d ",day,month,yr);// se muestra en pantalla la fecha actualizada

    datoday=day;

    datomonth=month;

    datoyr=yr;

    datodow=dow;

    funcion_alarma();

    if((bit_test(porta,3)==0)&&(bit_test(porta,4)==1)&&(bit_test(porta,5)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos del reloj.se detiene el reloj

    horap++;

    output_low(pin_c1);

    output_high(pin_c0);

    delay_ms(100);

    switch (horap){

    case 1:

    funcion_reloj1();

    goto programado;

    break;

    case 2:

    funcion_reloj2();

    goto programado;

    break;

    case 3:

    funcion_reloj3();

    goto programado;

    break;

    case 4:

    horap=0;

    break;

    default:break;

    }

    }

    else{

    if((bit_test(porta,4)==0)&&(bit_test(porta,3)==1)){ //si se cumplen estas condiciones en los swiches se puede alterar los datos de la fecha.se detiene el reloj

    horap1++;

    output_low(pin_c0);

    output_high(pin_c1);

    delay_ms(100);

    switch (horap1){

    case 1:

    funcion_fecha1();

    goto programado;

    break;

    case 2:

    funcion_fecha2();

    goto programado;

    break;

    case 3:

    funcion_fecha3();

    goto programado;

    break;

    case 4:

    funcion_fecha4();

    goto programado;

    break;

    case 5:

    horap1=0;

    break;

    default:break;

    }

    }

    }

    output_low(pin_c0);// se apaga el led indicador de entrada de datos para el reloj y el reloj corre normal…

    output_low(pin_c1);// se apaga el led indicador de entrada de datos para la fecha y el reloj corre normal…

    }

    }

    ESTE ES UNA VISTA DEL PROGRAMA PROBADO EN ISIS PROTEUS:

    Monografias.com

     

     

     

    Autor:

    Juan Carlos Lizcano

     

    Nota al lector: es posible que esta página no contenga todos los componentes del trabajo original (pies de página, avanzadas formulas matemáticas, esquemas o tablas complejas, etc.). Recuerde que para ver el trabajo en su versión original completa, puede descargarlo desde el menú superior.

    Todos los documentos disponibles en este sitio expresan los puntos de vista de sus respectivos autores y no de Monografias.com. El objetivo de Monografias.com es poner el conocimiento a disposición de toda su comunidad. Queda bajo la responsabilidad de cada lector el eventual uso que se le de a esta información. Asimismo, es obligatoria la cita del autor del contenido y de Monografias.com como fuentes de información.

    Categorias
    Newsletter