Red de conocimiento informático - Conocimiento informático - ¿Cómo leer los datos del reloj en DS1302?

¿Cómo leer los datos del reloj en DS1302?

#include lt;REG51.Hgt;

#include lt;intrins.hgt;

//#include "LCD1602.h"

//#include "DS1302.h"

#define uint unsigned int

#define uchar unsigned char

sbit DS1302_CLK = P1^7; //Pin de línea de reloj de tiempo real

sbit DS1302_IO = P1^6; //Pin de línea de datos de reloj de tiempo real

sbit DS1302_RST = P1^5; Pin de línea de reinicio del reloj de tiempo

sbit wireless_1 = P3^0;

sbit wireless_2 = P3^1;

sbit wireless_3 = P3^2;

sbit inalámbrico_4 = P3^3;

sbit ACC0 = ACC^0;

sbit ACC7 = ACC^7;

char hide_sec, hide_min , hide_hour, hide_day, hide_week, hide_month, hide_year; // Cuenta de segundos, minutos, horas por día, mes y años parpadeando

sbit Set = P2^0 //Tecla de cambio de modo

p>

sbit Up = P2^1; //Botón de suma

sbit Down = P2^2; //Botón de resta

sbit out = P2^3; Salir del modo de ajuste inmediatamente Botón

char done, count, temp, flag, up_flag, down_flag;

uchar TempBuffer[5], Week_value[2];

/*** ********Subrutina de parte del reloj DS1302******************/

typedef struct __SYSTEMTIME__

{

char sin firmar Segundo

char sin firmar Minuto

char sin firmar Hora

char sin firmar

día de caracteres sin firmar;

mes de caracteres sin firmar;

año de caracteres sin firmar

cadena de fechas [11]; > unsigned char TimeString[9];

}SYSTEMTIME; //Tipo de hora definido

SYSTEMTIME CurrentTime;

#define AM(X) X

#define PM(X) (X 12) // Convertir a formato de 24 horas

#def

ine DS1302_SECOND 0x80 //Registra la ubicación y el tiempo de almacenamiento del chip del reloj

#define DS1302_MINUTE 0x82

#define DS1302_HOUR 0x84

#define DS1302_WEEK 0x8A

#define DS1302_DAY 0x86

#define DS1302_MONTH 0x88

#define DS1302_YEAR 0x8C

void DS1302InputByte(unsigned char d) //Reloj en tiempo real escribe un byte (función interna)

{

unsigned char i

ACC = d

for(i=8; igt ;0; i--)

{

DS1302_IO = ACC0; //Equivalente a RRC en ensamblaje

DS1302_CLK = 1;

DS1302_CLK = 0;

ACC = ACC gt;

}

}

carácter sin firmar DS1302OutputByte(void ) //El reloj en tiempo real lee un byte (función interna)

{

unsigned char i;

for(i=8; igt; 0; i--)

{

ACC = ACC gt; //Equivalente a RRC en ensamblaje

ACC7 = DS1302_IO

DS1302_CLK = 1;

DS1302_CLK = 0;

}

retorno(ACC);

void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: dirección DS1302, ucData: datos a escribir

{

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr); // Dirección, comando

DS1302InputByte(ucDa); 1Byte de datos

DS1302_CLK = 1;

DS1302_RST = 0;

}

carácter sin firmar Read1302(car ucAddr sin firmar) // Leer los datos de una determinada dirección de DS1302

{

unsigned char ucData;

DS1302_RST = 0;

DS1302_CLK = 0;

DS1302_RST = 1;

DS1302InputByte(ucAddr|0x01); // Dirección, comando

ucData = DS1302OutputByte(); // Leer datos de 1 byte

DS1302_CLK = 1;

DS1302_RST = 0

return(ucData

}

void DS1302_GetTime(SYSTEMTIME *Time) //Obtiene los datos del reloj del chip de reloj en una matriz estructural personalizada

{

unsigned char ReadValue;

ReadValue = Read1302(DS1302_SECOND);

Tiempo-gt; Segundo = ((ReadValueamp; 0x70)gt; gt; 4)*10 (ReadValueamp; 0x0F); = Read1302(DS1302_MINUTE);

Tiempo-gt; Minuto = ((ReadValueamp; 0x70)gt; gt; 4)*10 (ReadValueamp;

ReadValue = Read1302( DS1302_HOUR);

Hora-gt;Hora = ((ReadValueamp;0x70)gt;gt;4)*10 (ReadValueamp;0x0F);

ReadValue = Read1302(DS1302_DAY);

Hora-gt; Día = ((ReadValueamp; 0x70)gt; gt; 4)*10 (ReadValueamp; 0x0F);

ReadValue = Read1302(DS1302_WEEK); >

Tiempo-gt; Semana = ((ReadValueamp; 0x70)gt; gt; 4)*10 (ReadValueamp; 0x0F);

ReadValue = Read1302(DS1302_MONTH); > Tiempo-gt;Mes = ((ReadValueamp;0x70)gt;gt;4)*10 (ReadValueamp;0x0F);

ReadValue = Read1302(DS1302_YEAR);

Tiempo- gt; Año = ((ReadValueamp; 0x70)gt; gt; 4)*10 (ReadValueamp; 0x0F);

}

void DateToStr(SYSTEMTIME *Time) //Cambiar el time Los datos de año, mes, día y semana se convierten en cadenas de visualización LCD y se colocan en la matriz DateString[]

{ if(hide_yearlt; 2) //Las declaraciones if y else aquí son todas de juicio bits parpadean, lt;2 muestra datos, gt;2 no se muestra y la cadena de salida es 2007/07/22

p>

{

Hora-gt; FechaString[0] = '2';

Hora-gt;

Hora-gt; FechaCadena[2] = Hora-gt; Año10 '0'; p> p>

}

else

{

Hora-gt; DateString[0] = ' '; Hora-gt; FechaCadena[1] = ' ';

Hora-gt; FechaCadena[2] = ' ';

p>

}

Hora-gt;DateString[4] = '/';

if(hide_monthlt;2)

{

Hora-gt; Fecha-gt[5] = Hora-gt; Mes/10 '0';

Hora-gt; ; Mes10 '0';

}

else

{

Hora-gt; /p>

Hora -gt; FechaString[6] = ' ';

}

Hora-gt;

if(hide_daylt; 2)

{

Hora-gt;DateString[8] = Hora-gt;Día/10 '0';

Hora-gt;DateString[ 9] = Hora-gt; Día10 '0'

}

else

{

Hora-gt; FechaCadena[8] = ' ';

Hora-gt; FechaCadena[9] = ' '; 2)

{

valor_semana[0] = Time-gt; Semana10 '0'; // Los datos de la semana se colocan por separado en la matriz valor_semana[] y se almacenan por separado. del año, mes y día, porque etc. Se mostrará al final

}

else

{

valor_semana [0] = ' ';

}

valor_semana[1] = '\0';

Cadena de fecha[10] = '\ 0'; //Agrega '\0' al final de la cadena, determina el carácter final

}

void TimeToStr(SYS)

TEMTIME *Time) //Convierte datos de horas, minutos y segundos en caracteres LCD y los coloca en la matriz TimeString[];

{ if(hide_hourlt; 2)

{

Time-gt; TimeString[0] = Time-gt; Hora/10 '0';

}

else

{

Time-gt; TimeString[0] = ' '; Hora -gt; Cadena de tiempo[1] = ' ';

}

Cadena de tiempo[2] = ':'; 2)

{

Hora-gt; Hora-gt; Minuto/10 '0'; [ 4] = Tiempo-gt; Minuto10 '0'

}

else

{

Tiempo-gt[; 3 ] = ' ';

Hora-gt; TimeString[4] = ' ';

}

Hora-gt; : ';

if(hide_seclt; 2)

{

Time-gt; TimeString[6] = Time-gt; ;

Tiempo-gt; TimeString[7] = Tiempo-gt; Segundo10 '0';

Hora-gt; Hora-cadena[6] = ' ';

Hora-gt[7] = ' ';

Time-gt; DateString[8] = '\0';

}

void Initial_DS1302(void) //Inicialización del chip del reloj

{

unsigned char Second="Read1302"(DS1302_SECOND);

if(Secondamp; 0x80) //Determina si el chip del reloj está apagado

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x8c, 0x07); //La siguiente hora y fecha de inicialización de escritura: 07/07/25. Hora: 23:59:55

Escribir1302(0x88, 0x07

Escribir1302(0x86, 0x25);

Escribir1302(0x8a, 0x07);

Escribir1302(0x84, 0x23

Escribir1302(0x82, 0x59);

Escribir1302(0x80, 0x55); > Write1302(0x8e, 0x80); //Prohibir escritura

}

}

void Upkey()//Teclas ascendentes

{

Arriba=1;

if(Arriba==0||wireless_2==1)

{

mdelay( 8 );

switch(count)

{caso 1:

temp="Read1302"(DS1302_SECOND); //Leer segundos

temp="temp" 1; //Aumentar el número de segundos en 1

up_flag=1; //Actualizar indicador después del ajuste de datos

if((tempamp;0x7f)gt ; 0x59) // Más de 59 segundos, borrar

temp="0";

pausa

caso 2:

temp="Read1302"(DS1302_MINUTE); //Lee la partitura

temp="temp" 1; //Agrega 1 a la partitura

up_flag=1;

if(tempgt;0x59) //Si supera los 59 puntos, límpielo a cero

temp="0";

break;

caso 3:

temp="Read1302"(DS1302_HOUR); //Lee la hora

temp="temp" 1 //Agrega 1 a la hora

up_flag=1;

if(tempgt; 0x23) //Si supera las 23 horas, bórralo a cero

temp="0"; > break;

caso 4:

temp="Read1302"(DS1302_WEEK); //Leer el número de semana

temp="temp" 1; /Suma 1 al número de semana

<

p> up_flag=1;

if(tempgt; 0x7)

temp="1";

descanso

caso 5; :

temp="Read1302"(DS1302_DAY); //Lee el número de días

temp="temp" 1 //Agrega 1 al número de días

up_flag= 1;

if(tempgt;0x31)

temp="1";

romper;

caso 6:

temp="Read1302"(DS1302_MONTH); //Leer el número de meses

temp="temp" 1 //Suma 1 al número de meses

up_flag=1;

if(tempgt; 0x12)

temp="1";

descanso

caso 7:

temp="Read1302"(DS1302_YEAR); //Lee el número de años

temp="temp" 1 //Suma 1 al número de años

up_flag=1;

if(tempgt; 0x85)

temp="0";

break; >

predeterminado: romper;

}

mientras(Arriba==0

mientras(inalámbrico_2==1);

}

}

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

void Downkey()//tecla descendente

{

Abajo=1;

if(Abajo==0||wireless_3==1)

{

mdelay(8);

cambiar(cuenta)

{caso 1:

temp="Read1302"(DS1302_SECOND); //Leer segundos

temp="temp-1" //Restar segundos de 1

down_flag=1; //Actualizar indicador después del ajuste de datos

if(temp==0x7f) //Si es menos de 0 segundos, devuelve 59 segundos

temp="0x59" ;

descanso;

caso 2:

temp="Read1302"(DS1302_MINUTE); //Leer partitura

temp= " temp-1"; //Puntuación menos 1

down_flag=1;

if(temp==-1)

temp="0x59"; / /Menos de 0 segundos, devuelve 59 segundos

descanso

caso 3:

temp="Read1302"(DS1302_HOUR); /p>

temp="temp-1"; //Disminuye la hora en 1

down_flag=1

if(temp==-1)

temp="0x23";

break;

caso 4:

temp="Read1302"(DS1302_WEEK); de la semana Número

temp="temp-1"; //Disminuye el número de semanas en 1

down_flag=1

if(temp= =0)

temp="0x7";

descanso

caso 5:

temp="Read1302"(DS1302_DAY) ; //Leer Número de días

temp="temp-1"; //Número de días menos 1

down_flag=1;

if(

temp==0)

temp="31";

descanso

caso 6:

temp="Read1302"( DS1302_MONTH); //Leer el número de meses

temp="temp-1"; //Restar el número de meses en 1

down_flag=1;

if( temp==0)

temp="12";

descanso

caso 7:

temp= "Read1302"( DS1302_YEAR); //Leer el número de años

temp="temp-1"; //Restar el número de años en 1

down_flag=1;

if(temp= =-1)

temp="0x85";

romper

predeterminado: romper

}

mientras(Abajo==0);

mientras(inalámbrico_3==1);

}

}

void Setkey ()//Botón de selección de modo

{

Set=1;

if(Set==0| |wireless_4==1)

{

mdelay(8);

count="count" 1; //Presione la tecla Set una vez, el conteo aumentará en 1

done=" 1"; //Ingrese al modo de ajuste

while(Set==0);

while(wireless_4==1);

}

}

void keydone()//Ejecución de la función clave

{ uchar Second;

if (flag==0) //Apagar el reloj, detener el cronometraje

{ Write1302(0x8e, 0x00); //Escritura permitida

temp="Read1302"(0x80);

Write1302(0x80, temp |0x80);

Write1302(0x8e, 0x80); //Prohibir escritura

flag="1";

}

Establecer clave();

//Botón de cambio de modo de escaneo

switch(count)

{caso 1: hacer //count=1, ajustar segundos

{

outkey(); //Buscar el botón emergente

Upkey(); //Buscar el botón más

Downkey(); botón

if(up_flag==1||down_flag==1) //Actualización de datos, reescribir datos nuevos

{

Write1302(0x8e, 0x00) ; //Permitir escritura

Write1302(0x80, temp|0x80); //Escribir nuevos segundos

Write1302(0x8e, 0x80); //Prohibir escritura

> up_flag=0;

down_flag=0;

}

hide_sec; //Recuento de bits flash

if(hide_secgt; 3 )

hide_sec=0;

show_time(); //Datos de pantalla LCD

} while(count==2);

caso 2: hacer //count=2, ajustar puntos

{

hide_sec=0

outkey(); p> Tecla arriba();

Tecla abajo()

if(tempgt;0x60)

temp="0"; if(up_flag==1||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x82 , temp); //Escribir nueva partitura

Write1302(0x8e, 0x80); //Prohibir escritura

up_flag=0

down_flag=

p>

}

hide_min

if(hide_mingt; 3)

hide_min=0

show_time();

} while(count==3); break;

caso 3: hacer //count=3, ajustar la hora

{

hide_min=0;

tecla de salida();

tecla arriba();

tecla abajo(); > if(up_flag==1||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302( 0x84) , temp); //Escribir nuevas horas

Write1302(0x8e, 0x80); //Prohibir escritura

up_flag=0;

down_flag=0; /p>

}

hide_hour

if(hide_hourgt; 3)

hide_hour=0

show_time(); ;

} while(count==4); break;

caso 4: hacer //count=4, ajustar el día de la semana

{

hide_hour=0;

tecla de salida();

tecla arriba();

tecla abajo(); > if(up_flag==1||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302 (0x8a) , temp); //Escribe el nuevo número de semana

Write1302(0x8e, 0x80); //Prohibido escribir

up_flag=0;

down_flag=0

}

hide_week

if(hide_weekgt; 3)

hide_week=0; ();

} while(count==5); break;

caso 5: do //count=5, día de ajuste

{

hide_week=0;

tecla de salida();

tecla arriba();

tecla abajo(); (up_flag==1||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x86, temp ); /

/Escribir nuevo número de día

Write1302(0x8e, 0x80); //Escribir está prohibido

up_flag=0

down_flag=0;

}

hide_day;

if(hide_daygt;3)

hide_day=0;

show_time();

p>

} while(count==6); break;

caso 6: hacer //count=6, ajustar mes

{

hide_day=0;

tecla de salida();

tecla arriba();

tecla abajo()

if(up_flag== 1; ||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x88, temp); el nuevo número de mes

Write1302(0x8e, 0x80); //Prohibir escritura

up_flag=0

down_flag=0;

p>

}

hide_month;

if(hide_monthgt;3)

hide_month=0;

show_time(); p>

} while(count==7); break;

caso 7: hacer //count=7, ajustar año

{

hide_month=0;

tecla de salida();

tecla arriba();

tecla abajo()

if(up_flag= =1; ||down_flag==1)

{

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x8c, temp); el nuevo número de años

Write1302(0x8e, 0x80); //Prohibir la escritura

up_flag=0

down_flag=0;

p >

}

hide_year

if(hide_yeargt; 3)

hide_year=0

show_time;

();

} while(count==8); break;

caso 8: count="0"; //count8, salir del modo de ajuste y devolver el estado de visualización predeterminado

Second="Read1302"(DS1302_SECOND);

Write1302(0x8e, 0x00); //Escritura permitida

Write1302(0x80, Secondamp ; 0x7f);

Write1302(0x8E, 0x80); //Escribir está prohibido

done="0"; 7, active la interrupción, establezca la posición del indicador en 0 y salga

predeterminado:

}

}