Red de conocimiento del abogados - Respuesta jurídica de la empresa - 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;

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

}