Red de conocimiento informático - Conocimiento del nombre de dominio - Estoy buscando urgentemente un programa de montaje para un reloj electrónico digital multifuncional basado en el microcontrolador AT89C51. ¡Pueden venir expertos! ~

Estoy buscando urgentemente un programa de montaje para un reloj electrónico digital multifuncional basado en el microcontrolador AT89C51. ¡Pueden venir expertos! ~

Utilice 89C51 para controlar tres HC595. Los dos primeros 595 están conectados a tubos de visualización digitales de 8 segmentos y la pantalla "0" ~ "9" salta una vez por segundo. El LED se enciende y cada uno parpadea una vez por segundo.

#include

#include

#define?uchar? unsigned?char

#define?uint?unsigned?int

uchar?table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80, 0x90};

uint?cycle=0,cycle1=0,count=0,key=0,ACK=0x01;?

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

void?comend();

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

//Subrutina de visualización de dos dígitos

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

void?sent_P0 (uchar?temp1,uchar?temp)// Visualización de dos dígitos

{?

P0=table[temp1];

P1_6=0;

P1=0xff;

P0=tabla[temp];

P1_7=0;

P1=0xff;?

}?

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

//Ajustar la subrutina de operación de visualización de dos dígitos

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

void ?set_LED()

{

TR0=1;//Se necesita 1 s para contar el tiempo cuando la interrupción T0 está habilitada

enviado_P0(ciclo,ciclo1);?

TR0=0;

}

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

//Subrutina de interrupción T0

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

void?Timer0Int(void)?interrupt?1?using ?0?

{

count++;?

if(count==50)count=0;?//¿Interrumpir el tiempo de conteo?

if(count==10)?//Este valor de recuento no puede ser cero; de lo contrario, la visualización será inexacta

{

ciclo++;?//Determina qué tan rápido el tiempo aumenta según el tiempo del recuento de interrupciones

}

if(cycle==10)

{?

ciclo =0;?//ciclo es el dígito de las unidades

ciclo1++ ?//ciclo1 es el dígito de las decenas

}

if(ciclo1==10) ciclo1=0;//if(RB8==1)RI=1;?

TH0=(65536-10000)/256;

TL0=(65536-10000)% 256;

}

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

//Subrutina de interrupción en serie

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

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

void?Out_int(void)?interrupt?4?using?3

{

uchar?temp;

if(TI==1)TI=0;

else{

if(RB8==1)

{?

RB8=0;

mientras(!RI);RI=0;?//ES=0;?

temp=SBUF;

if(0x01==temp)?//Dirección de contraste

{

SM2=0;

TI=0;?

SBUF=ACK;?//Respuesta recibida del host

mientras(!TI);TI=0;?

}

else?goto?stop;

}?

mientras(!RI);?RI=0;?

temp= SBUF ;//SBUF son los datos enviados desde el host recibidos del registro de recepción en serie

switch(temp)//La instrucción switch controla si se muestra o se detiene

{?< / p>

case?0x01?:?//Display

{?

key=1;?

break;

}

caso?0x02:?//Detener

{

key=2;?

romper;

}

predeterminado:?;

}?

}

detener:?;?

}

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

//Función principal

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

void?main(void)

{

SCON=0xf0;//El modo de funcionamiento de la interrupción en serie y la configuración de apertura registro de recepción

PCON=0x80;//Establezca la velocidad en baudios para duplicar la velocidad en baudios

TH1=0xf9;//Establezca la velocidad en baudios generada por T1 en 4800*2=9600

TMOD=0x21;//¿Configurar T1 para generar velocidad en baudios y trabajar en modo 2 y T0 para trabajar en modo 1?

TH0=(65536-10000)/256;

p>

TL0=(65536-10000)%256;

IE=0x92;?//Habilitar la interrupción T0 ET0 y la interrupción en serie ES y la interrupción total EA

TR1 =1;//Habilitar interrupción T1

IP=0x10;

P1=0xff;

while(1)?//Cuando RB8=1 , El sistema solicita automáticamente una interrupción, configurando RI en 1;

{

if(key==1)set_LED();

if(key ==2 )P0=0xff;?

}

}

Programa anfitrión:

#include

#include

#define?uchar?unsigned?char?

#define?uint?unsigned?int

uint ?address1=0x01,ACK=0x01;

/*void?Delay(uint?n)

{

uint?i;

for(i=0;i

}

*/

vo

id?main(void)

{

uchar?temp;

SCON=0xd0;?

PCON=0x80;// SMOD=1, doble velocidad en baudios

TMOD=0x20;

TH1=0xf9;//Establezca la velocidad en baudios en 4800*2=9600, que debe ser coherente con la máquina esclava Sólo así se podrán enviar los datos correctos

TR1=1;

while(1)

{?

P1= 0xff;

while(P1_0==1);?

TB8=1;

SBUF=0x01;?//Enviar dirección

mientras(! TI);TI=0;

mientras(!RI);RI=0;?

temp=SBUF;?

si (ACK==temp )//Verificar dirección del esclavo

{?

P2=0x00;?

TB8=0;

SBUF=0x01; ?//¿Enviar el primer comando?

mientras(!TI);TI=0;

}

mientras(P1_1==1 );

TB8=1;

SBUF=0x01;//Enviar la dirección y enviar la dirección al esclavo nuevamente

while(!TI); TI=0;

mientras(!RI);RI=0;?

temp=SBUF;

if(ACK==temp)

{ ?

P2=0xff;?

TB8=0;

SBUF=0x02;?//¿Enviar el segundo comando?

mientras(!TI);TI=0;

}

}

}

No lo hago sepa cómo es su diagrama de circuito Sí, le daré un circuito de referencia y un programa para la pantalla del tubo digital HC595.

En cuanto al reloj digital, no sé qué chip estás usando. . No puedo escribir. Tengo el programa 8563 aquí