51 microcontrolador tubo digital de 6 dígitos muestra la hora
Reloj de tubo digital de seis dígitos con microcontrolador C51
Utiliza un punto de tubo digital para separar horas, minutos y segundos
Utiliza tres botones para configurar la hora: p>
Tecla SET: configuración de hora-gt; configuración de minutos-gt; configuración final, el tubo digital de dos dígitos que indica la hora parpadea cuando se configura la hora y el tubo digital de dos dígitos que indica los minutos parpadea cuando se configura la hora. los minutos están configurados
Tecla CAMBIAR: cambia el valor en el estado de configuración de la hora y el estado de configuración de los minutos
Tecla SET S: establece el segundo en cero
Lenguaje C código:
// main.c
#include lt;REGX52.Hgt;
typedef unsigned int UINT;
typedef unsigned char UCHAR;
# define KEY P2
#define KEYMASK 0x07
sbit LE1 = P2^6 //Definir puerto de control de bits
sbit LE2 = P2^7; // Definir puerto de control de segmento
UCHAR KeyPressDown = 0x00;
UCHAR KeyRelease = 0x00
UCHAR LastKey = 0x00;
MODO UCHAR;
UCHAR externo
UCHAR externo
SS; >bit externo T_CYCLE;
extern void T0_Init(void); //Inicializa el temporizador, la función está definida en Timer.c
Código UCHAR NUM[] = {0xc0, 0xf9 , 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
retraso nulo(UINT t) //Retraso t ciclo de reloj
{
while (t--);
}
void H_Increase(void) //Aumentar la hora en 1
{
if(HHlt;23) HH;
else
{
HH = 0;
}
}
void M_Increase(void) //El minuto aumenta en 1
{
if(MMlt;59) MM;
else
{
MM = 0;
H_Increase();
}
} p>
void S_Increase(void) //Aumentar en 1 por segundo
{
if(SSlt;59) SS ;
else p>
{
SS = 0;
M_Increase();
}
}
void display(UCHAR SEG, UCHAR Digi) //Muestra un tubo digital, SEG = 0-9 números, Digi = bits 0-6
{
LE2 = 1;
P0 = (0x01lt;lt;Digi);
LE2 = 0;
>P0 = 0x00;
LE1 = 1;
P0 = NUM[SEG];
si (Digi==1||Digi==3) P0 amp; = 0x7f; //Mostrar delimitador
retraso(50);
P0 = 0xff;
LE1 = 0;
}
void main(void)
{
P0 = 0xff;
LE1 = 0;
LE2 = 0;
T0_Init();
mientras(1)
{
si(MODO != 1 | | T_CYCLE)
{
display(HH/10, 0); //Muestra los diez dígitos de la hora
display(HH10, 1); / Mostrar dígitos de la hora
}
if(MODE != 2 || T_CYCLE)
{
display(MM/10 , 2); //Muestra decenas de dígitos de minutos
display(MM10, 3); //Muestra un solo dígito de minutos
}
display(SS / 10, 4); //Mostrar dígitos de decenas de segundos
display(SS10, 5); //Mostrar dígitos de unidades de segundos
}
}
void key_Process(void) //Manejador de claves
{
UCHAR CurrKey;
KEY |= KEYMASK //Will The IO la clave correspondiente se establece en el estado de entrada
CurrKey = (~KEY) KEYMASK
KeyPressDown = (~LastKey) amp; >KeyRelease = LastKey amp; (~CurrKey);
LastKey = CurrKey;
cambiar(KeyRelease)
{
caso 1 :
si(MODO == 2) MODO = 0;
si no MODO
romper
caso 2:
p>
if(MODE == 1) H_Increase();
if(MODE == 2) M_Increase();
romper;
caso 4:
SS = 0;
romper;
predeterminado:
}
} p>
//Timer.c
#include lt;reg52.hgt;
typedef unsigned int UINT;
typedef unsigned char UCHAR ;
UCHAR HH = 14; //Valor inicial de horas
UCHAR MM = 2; //Valor inicial de minutos
UCHAR SS = 55; /Valor inicial de segundos
UINT u_10ms = 0; //Cuenta de 10ms
bit T_CYCLE = 0;
p>
key_Process nulo externo(void);
void externo S_Increase(void);
void T0_Init(void)
{
TMOD amp;= 0xf0;
TMOD |= 0x01;
//Asigna el valor inicial al temporizador, el tiempo de temporización es de 10 ms.
TH0 = 0xd8;
TL0 = 0xf0
TR0 = 1;
IE = 0x82; >}
void T0_INTSrv(void) interrupción 1
{
//El temporizador reinicia el tiempo.
TH0 = 0xd8;
TL0 = 0xf0
u_10ms
si (u_10ms20==0) // 200 ms
{
T_CYCLE = ! T_CYCLE; //Ciclo de flash
}
if (u_10msgt; 99) // 1000 ms = 1 segundo
{
u_10ms = 0;
S_Increase();
}
key_Process(); //Procesamiento del botón SET
}
Circuito de simulación Proreus: