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.
#include
#include
#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 valor_clave[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;
void port_init() ?//Función de inicialización del puerto
{DDRA=0XFF; // El puerto A es 1 salida push-pull PORTA=0XFF; El puerto B es una salida Push-pull 1 DDRB=0XFF; DDRC=0XFF ?// El puerto C es una entrada sin resistencia pull-up PORTC=0XFF DDRD=0XFF ?// Los 4 bits inferiores del puerto D son PORTD de salida; =0X0F;
}
retraso nulo(uint j)? //Función de retardo
{uint k; while(j--) {for(k) =1000;k> 0;k--) ;}
}
void display(uchar *p) ? //Función de visualización
{uchar i ,sel=0x01; for(i=0;i<4;i++) {PORTA=sel; //Seleccione el tubo digital más a la derecha PORTB=table[p[i]] //Enviar código de fuente delay(1); sel= sel<<1; //Desplazar una posición a la izquierda}
}
uchar get_key(void)
{if((PIND&0X0F)! =0X0F) retraso (3); { PORTD=0XEF; interruptor(PIND&0X0F) {caso 0x0e: keynum=key_value[0];break;
case 0x0d: keynum=key_value[4];break;
caso 0x0b: keynum=key_value[8];break;
case 0x07: keynum=key_value[12];break;
default:break } PORTD; =0xdf cambiar (PIND&0X0F) {case 0x0e:keynum=key_value[1];break;
case 0x0d:keynum=key_value[5];break;
case 0x0b:keynum; =key_value[9 ];break;
caso 0x07:keynum=key_value[13];break;
default:break } PORTD=0xbf (PIND&0X0F) {case 0x0e; :numeroclave=clave_
valor[2];romper;
case 0x0d:keynum=key_value[6];romper;
case 0x0b:keynum=key_value[10];romper;
caso 0x07:keynum=key_value[14];break;
default:break } PORTD=0x7f switch(PIND&0X0F) {case 0x0e:keynum=key_value[3];break;
caso 0x0d:keynum=key_value[7];break;
case 0x0b:keynum=key_value[11];break;
case 0x07:keynum=key_value[15 ];break;
default:break; }? while((PIND&0x0f)!=0x0f } return keynum;
}
void proceso(uint); i,uchar *q) //Dividimos la función de código BCD para mostrar los dígitos de miles, centenas, decenas y unidades
{ ?q[0]=i/1000;
i= i%1000;
q[1]=i/100;
i=i%100;
q[2]=i/10;
i=i%10;
q[3]=i;
}
void main(void)
{port_init(); PORTB=0xff; PORTA=0X00; retraso(50); mientras(1) {get_key(); }
}