Red de conocimiento informático - Conocimiento de la instalación - Utilice el lenguaje C para escribir un programa de reloj electrónico para el microcontrolador 89C51, con hora, minutos, segundos y diagrama de circuito.

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)

{ 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

********************************************* ****************************** ****/

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

<. p>Valor de retorno: Ninguno

p>

************************************ ************ *******************************/

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?*/

}