Red de conocimiento informático - Material del sitio web - El calendario perpetuo basado en el microcontrolador AT89C51 sólo necesita mostrar la hora sin añadir nada más.

El calendario perpetuo basado en el microcontrolador AT89C51 sólo necesita mostrar la hora sin añadir nada más.

#include lt;reg51.hgt;

#include lt;intrins.hgt;

#define uint unsigned int

# definir uchar unsigned char

sbit LCD_RS=P2^0;

sbit LCD_RW=P2^1;

sbit LCD_EN=P2^2;

bit SPK=P3^0;

sbit clave1=P1^0;

sbit clave2=P1^1;

sbit clave3=P1^ 2;

sbit key4=P1^3;

uchar Display_Buffer[16]=" ";

uchar Count, hora=12, min=12, sec=12;

indicador de bits, H_or_M;

uchar display[]="Esto es colck";

void _delay_ms(uint x)

{

uchar i;

mientras(x--)

{

for(i=0; ilt ; 120; yo );

}

}

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

*Nombre de la función: LCD_Write_Command

*Entrada: uchar cmd

*Salida: Ninguna

*Función: Escriba instrucciones en LCD1602

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

void LCD_Write_Command(uchar cmd )

{

LCD_RS=0; //De acuerdo con las regulaciones, cuando RS y R/W son bajos al mismo tiempo, se pueden escribir instrucciones

LCD_RW=0;

LCD_EN=0 ; //EN está configurado en nivel bajo

P0=cmd; //Envía datos al puerto P2, es decir, escribe instrucciones o direcciones

LCD_EN=1; //EN está configurado en nivel alto

_delay_ms(1); //Ligero retraso para dar tiempo de respuesta al hardware

LCD_EN=0 ; //Cuando EN salta del nivel alto al nivel bajo, el módulo LCD comienza a ejecutar el comando

}

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

*Nombre de función: LCD_Write_Data

*Entrada: uchar dat

*Salida: Ninguna

*Función: escribir datos en LCD1602

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

anular LCD_

Write_Data(uchar dat)

{

LCD_RS=1; //Cuando RS es de nivel alto y RW es de nivel bajo, se pueden escribir datos

LCD_RW = 0;

LCD_EN=0; //EN está configurado en nivel bajo

P0=dat; //Envía los datos al puerto P0, es decir, escribe los datos en el Módulo LCD

LCD_EN=1; //EN está configurado en nivel alto

_delay_ms(1); //Ligero retraso para darle tiempo de reacción al hardware

LCD_EN=0; // Cuando EN salta del nivel alto al nivel bajo, el módulo LCD comienza a ejecutar el comando

}

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

*Nombre de función: Init_LCD

*Entrada: Ninguna

*Salida: Ninguna

*Función: Inicializar LCD1602

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

void Init_LCD( void)

{

LCD_Write_Command(0x38); //Configuración del modo de visualización: pantalla de 16 × 2, matriz de puntos de 5 × 7, interfaz de datos de 8 bits

_delay_ms(1);

LCD_Write_Command(0x06); //Configuración del modo de visualización: el cursor se mueve hacia la derecha, el carácter no se mueve

_delay_ms(1);

LCD_Write_Command(0x0c); //Configuración del modo de visualización: visualización encendida, sin cursor, el cursor no parpadea

_delay_ms(1);

LCD_Write_Command(0x01) ; //Comando borrar pantalla, borra el contenido de la pantalla anterior

_delay_ms(1);

}

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

*Nombre de función: LCD_POS

*Entrada: uchar pos

*Salida: Ninguna

*Función: Posición de visualización de caracteres

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

nulo LCD_POS(uchar pos)

{

LCD_Write_Command(0x80|pos ); //El método para determinar la posición de visualización es "código de dirección 80H x"

}

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

*Nombre de función: Show_String

*Entrada: uchar *str

*Salida: Ninguna

*Función: LCD1602 Mostrar funciones de procesamiento de cadenas

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

p>

void Show_String(uchar *str)

{

while(*str!='\0')// Siempre que no esté escrita la marca de final, continúa escribiendo

LCD_Write_Data(*str); //Escribe constantes de caracteres en la pantalla LCD y señala el siguiente carácter

}

canción vacía (void)

}

p >

{

uchar i, j, k

for(i=0; ilt; 200; i )

{

SPK=~SPK;

for(k=0;klt;50;k);

for(j=0;jlt;50;j);

p>

}

}

/////lcd1602 LCD //////

void Display_Time(uchar Hora, uchar Min , uchar Sec)

{

Display_Buffer[0]=Hour/10 '0' //El décimo dígito de la hora

Display_Buffer[ 1]=Hour10 ' 0'; //El dígito de la hora

Display_Buffer[2]=':'; //Display: número

Display_Buffer[3]=Min/10 ' 0'; // Muestra las decenas del minuto

Display_Buffer[4]=Min10 '0'; //Muestra las unidades del minuto

Display_Buffer[5]= ':'; //Mostrar: número

Display_Buffer[6]=Sec/10 '0' //Mostrar las decenas del segundo

Display_Buffer[7]=Sec10 '0'; //Muestra el dígito de las unidades del segundo

LCD_POS(0x40); //Se muestra en la fila 1 de la pantalla LCD, columna 0

Show_String(Display_Buffer);

}

//// /Procesamiento de claves//////

void Set_time(void)

{

flag=0;

if(key1 ==0||key2==0||key3==0)//Si se presiona alguna tecla entre la tecla1, la tecla2 y la tecla3, es verdadera

{

TR0= 0; //El temporizador 0 se detiene

flag=1; //El indicador del botón es verdadero

}

while(flag)//Determinar cuál tecla está presionada

{

if(key1==0)//Determinar si la tecla1 está presionada

{

while(! key1); //Esperando liberación

H_or_M=!H_or_M //Selecciona si deseas modificar la hora o el minuto

}

else if(key2==0) //Determina si se presiona la tecla2

{

while(!key2); //Espera a que se suelte

if(H_or_M)//Si H_OR_M es verdadero, entonces modifica la hora

{

if( hora==24)//Si hora=24, luego hora=0

hora=0; // Agrega 1 a la hora

}

else//En caso contrario modifica el minuto

{

if( min==60)//Si el minuto es igual a 60, entonces el minuto es igual a 0

min=0;

Agregar 1

}

}

else if(key3==0)//Determinar si se presiona la tecla 3

{< / p>

while(!key3); //Esperando lanzamiento

if(H_or_M)//Si H_OR_M es verdadero, modifica la hora

{

if(--hour==0xff) //La hora se reduce en 1. Si la hora es igual a -1, entonces la hora es igual a 23

hora=23;

}

else//En caso contrario modificar el minuto

{

if(--min==0xff)//Minuto menos 1, si el minuto es igual a -1, entonces el minuto es igual a 59

min=59;

}

}

else if(key4==0)//Determinar si se presiona la tecla4

{

while(!key4); //esperar a que se suelte

flag=0; ; //marca clave borrada

TR0= 1; //Se inicia el temporizador 0

}

Display_Time(hora, min, seg); , M, S valores a la pantalla LCD

}

}

void timer0_init(void)//Inicialización del temporizador 0

{

TMOD=0x01; //Dispositivo de temporización 0, modo 1

ET0=1; //

EA=1; /p>

TR0=1; //Inicia el temporizador 0

TH0=(65535-50000)/256; //Instala el valor inicial alto de 8 bits

TL0 =(65535-50000)256; //Instala el valor inicial bajo de 8 bits

}

void main(void)//función principal

{

//P0=0xff;

P1=0xff; //Inicialización del puerto

P3=0xff;

Init_LCD(); //Inicialización de la pantalla LCD

timer0_init(); // Inicialización del dispositivo de sincronización 0

LCD_POS(0); //Se muestra en la primera fila y en la columna 0 de la pantalla LCD

Show_String(display);

while(1)/ /Bucle infinito

{

Display_Time(hora, min, seg); mostrar tiempo

//_delay_ms(500); //Retraso

Set_time(); //Ajuste de tiempo

}

}

void timer0() interrupción 1//Interrupción del temporizador 0

{

TH0=(65535-50000)/256 //Reinstalar los 8 bits altos; del temporizador 0

TL0=(65535-50000)256 ;//Recargar los 8 bits inferiores del temporizador 0

Contar ;//Aumentar el conteo en 1

if (Count==20)//Si COUNT es igual a 20

{

Count=0; //Conteo borrado a cero

seg. ; //Segundo más 1

if(sec==60)//Juicio ¿El segundo es igual a 60?

{

sec=0; /borrar el segundo a cero

min; //aumentar el minuto en 1

if (min==60)//Determinar si el minuto es igual a 60

{

min=0; //Si es igual a 60, lo ponemos a cero

Minutos

hora; //Suma 1 a la hora

if(hora==24)//Juzga si la hora es igual a 24

{

hora=0; //Si la hora es igual a 24, borre horas, minutos, segundos

min=0;

sec=0;

}

canción();

}

}

}

}