Utilice el microcontrolador AT89C51 para diseñar un reloj electrónico simple (seis dígitos) y realice la visualización de la hora a través de un tubo digital LED de 8 dígitos. El sistema puede calcular la hora a través de tres botones;
Ideas de programación: 1. Utilice el temporizador interno del microcontrolador como temporizador y llame a la función del temporizador; 2. Diseñe un conjunto de subrutinas de botones; (3) Diseñe un conjunto de rutinas de tubo de pantalla digital; A continuación se proporciona un conjunto de procedimientos como referencia.
#includelt;iom16v.hgt;
#include lt;macros.hgt;
#define uchar unsigned char
#define uint unsigned int
const uchar table[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f} //0-9 caracteres correspondientes
const uchar key_value[16]={0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};
uchar data[4]={0}; //El valor inicial mostrado es 0
uint count=0 ? //El valor de recuento inicial es 0
uchar keynum;
uint count=0 ? //El valor de recuento inicial es 0
uchar keynum;
uint count=0 p>
void port_init( ) ?//Función de inicialización del puerto
{DDRA=0XFF; //El puerto A es 1 salida push-pull PORTA=0XFF ?//Puerto B es 1 salida push-pull; DDRB=0XFF; DDRC=0XFF ?//El puerto C es una entrada sin resistencia pull-up PORTC=0XFF; DDRD=0XFF ?//Los 4 bits bajos del puerto D son PORTD=0X0F; p><; p>}
void delay(uint j) ? //Función de retardo
{uint k; while(j--) {for(k=1000;kgt ;0;k --) ;}
}
void display(uchar *p) ? //Función de visualización
{uchar i, sel=0x01; =0;ilt;4;i) {PORTA=sel; //Seleccione el tubo digital más a la derecha PORTB=table[p[i]]; //Enviar código de fuente sel =sellt;lt;1; //Desplazarse un bit a la izquierda}
}
uchar get_key(void)
{if((PINDamp;0X0F)! =0X0F) delay( 3); { PORTD=0XEF; switch(PINDamp; 0X0F) {caso 0x0e: keynum=key_value[0]; break
case 0x0d: keynum=key_value[4];
caso 0x0b: keynum=key_value[8]; break;
case 0x07: keynum=key_value[12]; break; switch(PINDamp; 0X0F) {caso 0x0e: keynum=key_value[1]; break;
case 0x0d: keynum=key_value[5]; valor_clave[9]; ruptura;
caso 0x07: keynum=valor_clave[13];
/p>
predeterminado: break; } PORTD=0xbf; switch(PINDamp; 0X0F) {caso 0x0e: keynum=key_value[2]; ; romper;
caso 0x0b: keynum=key_value[10];
caso 0x07: keynum=key_value[14]; romper; } PORTD=0x7f; switch(PINDamp; 0X0F) {caso 0x0e: keynum=key_value[3]; break
case 0x0d: keynum=key_value[7]; p> caso 0x0b: keynum=key_value[11]; break;
case 0x07: keynum=key_value[15]; break;
default: break }? ;0x0f)!=0x0f); } return keynum;
}
void process(uint i, uchar *q) //Dividimos la función de código BCD para mostrar miles, centenas, 10. Dígito de unidades
{ ?q[0]=i/1000
i=i1000
q[1]=i/100;
i=i100;
q[2]=i/10
i=i10;
q[3]=i; ;
}
void main(void)
{port_init(); PORTB=0xff; retraso(50); while(1) {get_key(); recuento=keynum; proceso(recuento, datos);