Red de conocimiento informático - Computadora portátil - 51 microcontrolador tubo digital de 6 dígitos muestra la hora

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:

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();

}

}

void S_Increase(void) //Aumentar en 1 por segundo

{

if(SSlt;59) SS ;

else

{

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:

}

}

//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: