¿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)
{ p >
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
{ p>
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:
}
}