Utilice el lenguaje C para escribir un programa de reloj electrónico para el microcontrolador 89C51, con hora, minutos, segundos y diagrama de circuito.
#include
#include
/*************** *** ************************************************* **** ***/
sbit T_CLK=P3^5;? //Conexión de pines DS1302
sbit T_IO =P3^6;
sbit T_RST=P3 ^7;
sbit ACC0=ACC^0;? //Bit de almacenamiento de datos de 1 bit
sbit ACC7=ACC^7;
uchar start_time [7] ={0x00,0x10,0x22,0x20,0x05,0x04,0x10};? //Establecer después de la inicialización
uchar Sec;
uchar Cent;
Hora uchar;
Año uchar;
Día uchar;
Semana uchar;
Mes uchar;
/************************************************ ******** *******************/
//Ajusta los elementos correspondientes según la selección
void Set(uchar sel,uchar sel_1) p>
{ uchar dirección,hora; uchar max,min; if(sel==1)? } //Hora if(sel==2)? { dirección=0x82; max=59;min=0;} //Minuto if(sel==3)? } //Mes si(sel==4)? { dirección=0x86; max=31;min=1;} //Día si(sel==5)? {dirección=0x8a; } //Hora del día de la semana=R1302(dirección+1)/ 16*1R1302(dirección+1)%16; //Cambiar al código BCD if (sel_1==1) time++;? >max) tiempo=min;? if(time } >********Programa de lectura y escritura DS1302******************///** ********************** **************************** *********************** * Nombre de función: RTInputByte() Función: Escribe un byte desde el reloj en tiempo real Descripción: escribir datos de 1 byte en DS1302 (función interna) Parámetro de entrada: d datos escritos Valor de retorno: ¿Ninguno? p> ********************************************* ****************************** ****/ void RTInputByte(uchar d) { uchar h; ACC = d; for(h=8 ; h>0; h--) { T_IO = ACC0; /*Equivalente a RRC en ensamblaje */ T_CLK = 1; /p> T_CLK = 0; ACC = ACC >> 1; } } uchar RTOutputByte ( vacío) { uchar h; for(h=8; h>0; h--) { ACC = ACC >>1; /*Equivalente a RRC en ensamblador */ ACC7 = T_IO; T_CLK = 1; T_CLK = 0; } retorno(ACC); } /******* ** ************************************************* * *****************************************/ nulo W1302(uchar ucAddr, uchar ucDa) { T_RST = 0; T_CLK = 0; T_RST = 1; /p> RTInputByte(ucAddr);? /* Dirección, comando*/ RTInputByte(ucDa);? /* Escribir datos de 1Byte*/ T_CLK = 1 ; T_RST = 0; } /************************ * *********************************************** Nombre de la función: R1302() Función: Leer datos de una determinada dirección de DS1302 Descripción: Escriba la dirección primero, luego lea el comando/datos (función interna ) Llamada: RTInputByte(), RTOutputByte() Parámetro de entrada: ucAddr: dirección DS1302 Valor de retorno: ucData: leer datos ************************************************* *** **********************/ uchar R1302(uchar ucAddr) { uchar ucData; T_RST = 0; T_CLK = 0; T_RST = 1; RTInputByte(ucAddr) ; /* Dirección, comando*/ ucData = RTOutputByte(); /* Leer datos de 1Byte*/ T_CLK = 1; T_RST = 0; return(ucData); } /************************ ****** ******************************************* Nombre de la función: Set1302() p> Función: Establecer la hora inicial Descripción: Primero escribe la dirección, luego lee el comando/datos (registra el modo multibyte) Llamada: W1302() Parámetro de entrada: pClock: establece el formato de dirección de datos del reloj como: segundos, minutos, horas, días, meses, semanas, años, 7 bytes (código BCD) 1B 1B 1B 1B 1B
************************************ ************ *******************************/
void Set1302(uchar *pClock)
{
uchar h;
uchar ucAddr = 0x80
W1302(0x8e,0x00; );? /* Comando de control, WP=0, operación de escritura?*/
for(h =7; h>0; h--)
{
W1302(ucAddr,*pClock);? /* Segundos y minutos Día, mes, semana, año*/
pClock++;
ucAddr +=2;
} W1302(0xc0,0x01); W1302(0XC2,0X03);/ /El tiempo de visualización de la conversión automática inicial es de 3 segundos.
W1302(0x8e,0x80);? /* Comando de control, WP=1, ¿protegido contra escritura?*/
}
void Auto_Set1302(uchar *pClock )
{
uchar h;
uchar ucAddr = 0x80; if(((R1302(0x81))&0x80)==0x80) {
W1302(0x8e,0x00);? /* Comando de control, WP=0, operación de escritura?*/
for(h =7; h>0; h--)
{
W1302(ucAddr,*pClock); /* Segundo, minuto, hora, día, mes, semana, año*/
pClock++;
ucAddr + =2;
}
W1302(ucNumRows_adder,0);
W1302(ucNumRows_p_adder,0);
W1302(DISP_TIME_adder, 170); W1302(0xc0,0x01); W1302(0XC2,0X03);// El tiempo de visualización de la conversión automática inicial es de 3 segundos.
W1302(0x8e,0x80);? /* Comando de control, WP=1, ¿protegido contra escritura?*/
?}
}
/******************Leer la hora en DS1302******************/
void du1302()
{ Sec=R1302(0x81);? //Obtener los segundos, minutos, horas, día, mes, semana, año Cent=R1302(0x83); (0x85); Día=R1302 (0x87); Mes=R1302(0x89); //a=R1302(0xc3); //a=a/16 *1a%16;
}
void? write_1302Data (uchar? ucAddr,uchar? Valor)
{? W1302(0x8e,0x00); /* Comando de control, WP=0, ¿operación de escritura?*/
W1302(ucAddr,Value); //Dirección y datos
W1302( 0x8e,0x80);? / * Comando de control, WP=1, ¿protegido contra escritura?*/
}