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);? p>
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
{ p>
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 p>
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? p> 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í