¿Tienes un programa en lenguaje C para implementar un reloj electrónico basado en el microcontrolador 51? Utilice una pantalla LED como pantalla, preferiblemente con función de despertador... ¡Gracias!
#include
//Definición*** código de fuente de ánodo 0123456789-
dispcode de código de caracteres sin firmar []={0xc0, 0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};
tiempo de carácter sin firmar[]={0,0,0,0}; //Se usa para almacenar la hora
unsigned char date[]={0,0,0,0}; //Se usa para almacenar la fecha
unsigned char year[]={0 ,0,0,0};// Se usa para almacenar el año
unsigned charweek[]={0};// Se usa para almacenar la semana
SYSTEMTIME time1; / En una estructura llamada SYSTEMTIME time1 se define en el archivo ds1302.h Aquí definimos un nombre de variable
//La estructura SYSTEMTIME se usa para almacenar el tiempo
retraso vacío (carácter sin firmar). i ) //subrutina de retraso
{
carácter sin signo j
mientras((i--)!= 0)
{
for(j=123;j>0;j--);
}
}
unsigned char button_time( n,x,y) //subrutina de ajuste del reloj
unsigned char n,x,y;
{
if(P1_7==0)< / p>
{
retraso(50);
si(P1_7==0)
{
n++; /p>
if(n==x)
n=0;
while(P1_7==0); // Espera a que se suelte la tecla p>
}
}
if(P1_5==0)
{
retraso(50); p>
si(P1_5==0)
{
si(n==0)
n=y;
else
n--;
mientras(P1_5==0);
}
}
Return n;
}
unsigned char button_date(n,x,y) //Subrutina de ajuste de fecha
unsigned char n,x,y;
p>{
if(P1_7==0)
{
retraso(50);
si(P1_7 ==0)
{
n++;
si(n==x)
n= 1;
mientras(P1_7==0);
}
}
si(P1_5==0)
{
retraso(50);
si(P1_5==0)
{
si(n==1 )
> n=y;
<p> else
n--;
mientras(P1_5==0);
}
}
return n;
}
unsigned char button_year(n,x,y) //subrutina de ajuste de año
unsigned char n,x,y;
{
si(P1_7==0)
{
retraso(50);
si (P1_7==0)
{
n++;
si(n= =x)
n=2; p>
mientras(P1_7==0);
}
}
si(P1_5==0)
{
demora(50);
si(P1_5==0)
{
si (n==2)
n=y;
else
n--;
mientras(P1_5==0);
}
return n;
}
void display(minuto10, minuto1,hora10,hora1) //Mostrar subrutina
unsigned char minuto10,minuto1,hora10,hora1;
{
P2=0xfe;
P0=dispcode[minuto10] //Mostrar décimas El número de minutos
delay(1);
P2=0xfd;
P0=dispcode[minuto1] //Mostrar una fracción de minuto
retraso(1);
P2=0xfb;
P0=dispcode[hora10]; //Se muestra como decenas de dígitos
retraso(1);
P2=0xf7;
P0=dispcode[hora1];/Dígitos decimales al mostrar
retraso(1);
}
visualización nula1(semana1)
visualización nula1(semana1)
carácter sin firmar semana1;
{
P2=0xef;
P0=dispcode[semana1]
retraso(1
}
void main()
<); p>{bandera de carácter unsigned,aa=2,bb=0;
Initial_DS1302();//inicializa el chip de reloj DS1302,
p>while(1)
{
DS1302_GetTime(&time1); //leer el parámetro de tiempo
time[3]=(time1. Minute)%10; //Ingrese los datos de un solo dígito del minuto en el tiempo[3]
time[2]=(time1.Minute)/10 //Ingrese los datos de decenas de dígitos del minuto en el tiempo [ 2]
time[1]=(time1.Hour)%10; //almacena el dígito de la hora dat
a into time[1]
time[0]=(time1.Hour)/10; //almacena los datos decimales de la hora en time[0]
date[3]= (hora1.Día)%10;
fecha[2]=(hora1.
fecha[1]=(hora1.Mes)%10;
fecha[0]=(hora1.Mes)/10;
año[1]=(hora1.Año)%10;
año[0]=(hora1.) / Semana);
semana[0]=(hora1.)Semana);
display1(semana[0]); //Mostrar la semana
if (P1_4==0) //Si presiona el inicio de la hora durante un segundo, el reloj comienza a mostrar la hora normalmente, luego muestra la fecha nuevamente y luego muestra el año nuevamente.
{
retraso(50);
si(P1_4==0)
{
bandera++ ;
if(bandera>2)
{
bandera=0;
}
}
while(P1_4==0);
}
if(P1_6==0) // Si presiona el botón de configuración de hora una vez, la fecha comience a mostrarse Presione nuevamente para comenzar a mostrar el año, presione nuevamente para ingresar al modo de ajuste de año, fecha, semana y hora
{
retardo(50);
if(P1_6 ==0)
{
bandera++;
if(flag>8)
{
bandera =0;
}
}
mientras(P1_6==0);
}
cambiar (bandera)
{
caso 0: visualización (hora[0], hora[1], hora[2], hora[3]) ; //Llama a la visualización de la subfunción, muestra los datos almacenados en la matriz de tiempo
break;
case 1:display(date[0],date[1],date[ 2],date[3]) ; //Llama a la subfunción display para mostrar los datos almacenados en la matriz de fechas
break;
caso 2: display(aa,bb ,año[0],año[1] ); // Llama a la subfunción de visualización para mostrar los datos almacenados en el tiempo
break;
case 2:display(aa, bb,year[0],year[1] ); // Llama a la subfunción display para mostrar los datos almacenados en la matriz año
break;
case 3:time1 .year=button_year(time1.year,2099,2098) ; // Ajustar el año
DS1302_ SetTime(0x8c,time1.Year);
display(aa,bb,year) [0],año[1]);
break;
case 4:time1.Month=button_date(time1.Month,13,12); //Ajustar el mes
DS1302_SetTime(0x88,time1.Month);
descanso;
caso 8:time1.Minute=button_time(time1.Minute,60,59); /ajustar minutos
DS1302_SetTime(0x82,time1 .Minute);
mostrar (10,10,time[2],time[3]);
romper;
}
}
}
}