Práctica de Puertas Lógicas
Implementación de las principales funciones lógicas mediante Arduino Mega 2560. Se leen cuatro entradas digitales y se representa el resultado de cada puerta mediante un LED.
1. Objetivo de la práctica
El objetivo es comprobar el funcionamiento de las puertas AND, NAND, OR, NOR, XOR, XNOR y NOT. Los interruptores proporcionan los valores lógicos de entrada (0 o 1), y los LED muestran el resultado de cada operación.
Las entradas se conectan a los pines 28, 26, 24 y 22. Las salidas disponibles para los LED son los pines del 13 al 5.
2. Asignación de pines
Entradas
| Entrada | Pin Arduino |
|---|---|
| A | 28 |
| B | 26 |
| C | 24 |
| D | 22 |
Salidas LED
| Puerta lógica | LED / pin | Operación |
|---|---|---|
| AND | 13 | A · B |
| NAND | 12 | NOT (A · B) |
| OR | 11 | A + B |
| NOR | 10 | NOT (A + B) |
| XOR | 9 | A exclusivo OR B |
| XNOR | 8 | NOT (A XOR B) |
| NOT | 7 | NOT A |
| Reservada | 6 | Sin asignar en el esquema |
| Reservada | 5 | Sin asignar en el esquema |
3. Funcionamiento de las puertas
- AND: la salida vale 1 cuando las dos entradas valen 1.
- NAND: es la negación de AND; solo vale 0 cuando ambas entradas son 1.
- OR: la salida vale 1 cuando al menos una entrada vale 1.
- NOR: es la negación de OR; solo vale 1 cuando ambas entradas son 0.
- XOR: la salida vale 1 cuando las entradas son diferentes.
- XNOR: la salida vale 1 cuando las entradas son iguales.
- NOT: invierte el valor de una entrada.
4. Código de Arduino
El programa lee las cuatro entradas y calcula las siete funciones lógicas del esquema. Cada resultado se envía al LED correspondiente.
const int entradas[] = {28, 26, 24, 22}; // A, B, C, D
const int salidas[] = {13, 12, 11, 10, 9, 8, 7, 6, 5};
bool A, B, C, D;
void setup() {
for (int i = 0; i < 4; i++) {
pinMode(entradas[i], INPUT);
}
for (int i = 0; i < 9; i++) {
pinMode(salidas[i], OUTPUT);
}
}
void loop() {
// Leer las entradas
A = digitalRead(entradas[0]);
B = digitalRead(entradas[1]);
C = digitalRead(entradas[2]);
D = digitalRead(entradas[3]);
// Puertas lógicas de dos entradas (A y B)
bool resultadoAND = A && B;
bool resultadoNAND = !(A && B);
bool resultadoOR = A || B;
bool resultadoNOR = !(A || B);
bool resultadoXOR = A ^ B;
bool resultadoXNOR = !(A ^ B);
// Puerta NOT: invierte la entrada A
bool resultadoNOT = !A;
// Mostrar los resultados en los LED
digitalWrite(13, resultadoAND);
digitalWrite(12, resultadoNAND);
digitalWrite(11, resultadoOR);
digitalWrite(10, resultadoNOR);
digitalWrite(9, resultadoXOR);
digitalWrite(8, resultadoXNOR);
digitalWrite(7, resultadoNOT);
// Pines 6 y 5 reservados: apagados
digitalWrite(6, LOW);
digitalWrite(5, LOW);
delay(50);
}
Este código supone que los interruptores entregan un nivel LOW o HIGH estable y que las entradas tienen una referencia definida. Si tus interruptores no incorporan resistencias pull-down o pull-up, habrá que adaptar la configuración para evitar entradas flotantes.
Archivo: puertas_logicas.ino