Sie sind auf Seite 1von 9

PRACTICA 3

PUERTOS DIGITALES
1.- La siguiente aplicacin utiliza un C PIC16F877A para implementar un semforo con
temporizador, implementando los siguientes modos de operacin:

a) Explicar que hacen, como funcionan, que parmetros requieren y que valores devuelven
las funciones: output_X(), input_X Y delay_ms().
OUTPUT=Sacar Datos
INPUT = Meter Datos
Para escribir (sacar) datos en un puerto.
Output_X(valor)
Ejm: encender led 0 y led 1
Output_A(0x03)
Para leer (meter) datos de un puerto.
Int x;
X=input_A()
Delay_ms()
Detiene la ejecucin del programa la cantidad de tiempo en ms que se indica en la propia
instruccin. De tal manera que 1000 equivale a 1seg.
b) Explicar para que se utiliza la directiva define
Se utiliza para definir los pines de salida para poder facilitar la realizacin de la
programacin asignando otro tipo de cdigos como ENT1.
c) Definir un propio cuadro de tiempos e implementar el mismo modificando el programa.
Modo

Descripcin

Rojo

Amarillo

Verde

00

Modo normal

4 seg

1 seg

4 seg

01

Modo vehicular

10 seg

5 seg

30 seg

10

Modo peatn

15 seg

3 seg

10 seg

11

Modo nocturno

----

200 ms

CODIFICACION,#include<16f877a.h>
#fuses XT,NOWDT
#use delay (clock=4M)
#use standard_io(B)
#use standard_io(C) void main()
{
int modo,dec,unid,i,temp; do{
modo=input_A(); modo=modo&0x03; switch(modo){
case 0: output_B(0x01); for(i=10;i>0;i--){ dec=i/10; unid=i%10;
temp = dec<<4 | unid; output_C(temp); delay_ms(1000);
}
output_B(0x02); for(i=2;i>0;i--){ dec=i/10; unid=i%10;
temp=dec<<4 | unid;
output_C(temp); delay_ms(1000);
}
output_B(0x04); for(i=10;i>0;i--){ dec=i/10; unid=i%10; temp=dec<<4 | unid; output_C(temp);
delay_ms(1000);
}
break; case 1:
output_B(0x01); for(i=10;i>0;i--){ dec=i/10; unid=i%10;
temp = dec<<4 | unid; output_C(temp); delay_ms(1000);
}
output_B(0x02); for(i=10;i>0;i--){ dec=i/10; unid=i%10;
temp=dec<<4 | unid;
output_C(temp); delay_ms(1000);
}
output_B(0x04); for(i=20;i>0;i--){ dec=i/10; unid=i%10; temp=dec<<4 | unid; output_C(temp);
delay_ms(1000);
}
break; case 2:
output_B(0x01); for(i=20;i>0;i--){ dec=i/10; unid=i%10;
temp = dec<<4 | unid; output_C(temp); delay_ms(1000);
}
output_B(0x02); for(i=5;i>0;i--){ dec=i/10; unid=i%10;
temp=dec<<4 | unid;
output_C(temp); delay_ms(1000);
}
output_B(0x04); for(i=10;i>0;i--){ dec=i/10; unid=i%10; temp=dec<<4 | unid; output_C(temp);
delay_ms(1000);
}
break; case 3:
output_B(0x02); delay_ms(200); output_B(0x00); delay_ms(200); break;
}
}while(true);
}

----

2. El siguiente circuito y su correspondiente cdigo implementa la misma funcionalidad


descrita en el punto 1 utilizando una placa ARDUINO UNO.

a) Explicar que hacen, como funcionan, que parmetros requieren y que valores
devuelven las funciones : digitalWrite(), digitalRead(), pinMode() y delay().
R.- Son funciones digitales orientadas a revisar el estado y la configuracin de las entradas y
salidas digitales
Las funciones y parmetros de cada digital
digitalWrite() = Nos permite escribir un pin digital con 1 0
digitalRead() = Nos permite Leer un pin digital (0 1).
pinMode() = Nos permite configurar un pin.
delay() = Detiene la ejecucin del programa la cantidad de tiempo en ms que se indica en la propia
instruccin. De tal manera que 1000 equivale a 1seg.
b) Explicar cmo operan las funciones setup() y loop() en el entorno de programacin
ARDUINO.
funcin setup() = se invoca una sola vez cuando el programa empieza. Se utiliza para inicializar
los modos de trabajo de los pins, o el puerto serie. Debe ser incluido en un programa aunque no
haya declaracin que ejecutar.
funcin loop() = Despus de llamar a setup(), la funcin loop() hace precisamente lo que sugiere
su nombre, se ejecuta de forma cclica, lo que posibilita que el programa este respondiendo
continuamente ante los eventos que se produzcan en la tarjeta

c) Explicar para que se utiliza la directiva define.


Se utiliza para definir los pines de salida para poder facilitar la realizacin de la programacin
asignando otro tipo de cdigos como ENT1.

d) Definir un propio cuadro de tiempos e implementar el mismo modificando el


programa.
Modo

Descripcin

Rojo

Amarillo

Verde

00

Modo normal

15 seg

4 seg

15 seg

01

Modo vehicular

8 seg

3 seg

15 seg

10

Modo peatn

15 seg

4 seg

10 seg

11

Modo nocturno

----

300 ms

----

1) Codificacin
#define A1 0
#define B1 1

void setup() {

#define C1 2

// put your setup code here, to run once:

#define D1 3

pinMode (A1, OUTPUT);


pinMode (B1, OUTPUT);

#define A2 4

pinMode (C1, OUTPUT);

#define B2 5

pinMode (D1, OUTPUT);

#define C2 6

pinMode (A2, OUTPUT);

#define D2 7

pinMode (B2, OUTPUT);


pinMode (C2, OUTPUT);

#define ROJO 8

pinMode (D2, OUTPUT);

#define AMARILLO 9

pinMode (ENT0, INPUT);

#define VERDE 10

pinMode (ENT1, INPUT);


pinMode (ROJO, OUTPUT);

#define ENT0 12

pinMode (AMARILLO, OUTPUT);

#define ENT1 13

pinMode (VERDE, OUTPUT);

boolean b0, b1;

int i, dec, unid, modo;

void loop() {

b0 = digitalRead(ENT0);

for (i = 15; i > 0; i--) {

b1 = digitalRead(ENT1);

dec = i / 10;
unid = i % 10;

if (b1 == LOW && b0 == LOW)

muestraDigitoD1(unid);

modo = 0;

muestraDigitoD2(dec);

else if (b1 == LOW && b0 == HIGH)


modo = 1;
else if (b1 == HIGH && b0 == LOW)
modo = 2;
else
modo = 3;

delay(1000);
}
break;
case 1:
digitalWrite(ROJO, HIGH);
digitalWrite(AMARILLO, LOW);
digitalWrite(VERDE, LOW);

switch (modo) {

for (i = 8; i > 0; i--) {

case 0:

dec = i / 10;

digitalWrite(ROJO, HIGH);

unid = i % 10;

digitalWrite(AMARILLO, LOW);

muestraDigitoD1(unid);

digitalWrite(VERDE, LOW);

muestraDigitoD2(dec);

for (i = 15; i > 0; i--) {

delay(1000);

dec = i / 10;

unid = i % 10;

digitalWrite(ROJO, LOW);

muestraDigitoD1(unid);

digitalWrite(AMARILLO, HIGH);

muestraDigitoD2(dec);

digitalWrite(VERDE, LOW);

delay(1000);

for (i = 3; i > 0; i--) {

dec = i / 10;

digitalWrite(ROJO, LOW);

unid = i % 10;

digitalWrite(AMARILLO, HIGH);

muestraDigitoD1(unid);

digitalWrite(VERDE, LOW);

muestraDigitoD2(dec);

for (i = 4; i > 0; i--) {

delay(1000);

dec = i / 10;

unid = i % 10;

digitalWrite(ROJO, LOW);

muestraDigitoD1(unid);

digitalWrite(AMARILLO, LOW);

muestraDigitoD2(dec);

digitalWrite(VERDE, HIGH);

delay(1000);

for (i = 15; i > 0; i--) {

dec = i / 10;

digitalWrite(ROJO, LOW);

unid = i % 10;

digitalWrite(AMARILLO, LOW);

muestraDigitoD1(unid);

digitalWrite(VERDE, HIGH);

muestraDigitoD2(dec);

delay(1000);

digitalWrite(AMARILLO, HIGH);

digitalWrite(VERDE, LOW);

break;

delay(300);

case 2:

digitalWrite(AMARILLO, LOW);

digitalWrite(ROJO, HIGH);

delay(300);

digitalWrite(AMARILLO, LOW);

break;

digitalWrite(VERDE, LOW);
for (i = 15; i > 0; i--) {

}
}

dec = i / 10;
unid = i % 10;

void muestraDigitoD1(int n) {

muestraDigitoD1(unid);

switch (n) {

muestraDigitoD2(dec);

case 0:

delay(1000);

digitalWrite(A1, LOW);

digitalWrite(B1, LOW);

digitalWrite(ROJO, LOW);

digitalWrite(C1, LOW);

digitalWrite(AMARILLO, HIGH);

digitalWrite(D1, LOW);

digitalWrite(VERDE, LOW);

break;

for (i = 4; i > 0; i--) {

case 1:

dec = i / 10;

digitalWrite(A1, HIGH);

unid = i % 10;

digitalWrite(B1, LOW);

muestraDigitoD1(unid);

digitalWrite(C1, LOW);

muestraDigitoD2(dec);

digitalWrite(D1, LOW);

delay(1000);

break;

case 2:

digitalWrite(ROJO, LOW);

digitalWrite(A1, LOW);

digitalWrite(AMARILLO, LOW);

digitalWrite(B1, HIGH);

digitalWrite(VERDE, HIGH);

digitalWrite(C1, LOW);

for (i = 10; i > 0; i--) {

digitalWrite(D1, LOW);

dec = i / 10;
unid = i % 10;

break;
case 3:

muestraDigitoD1(unid);

digitalWrite(A1, HIGH);

muestraDigitoD2(dec);

digitalWrite(B1, HIGH);

delay(1000);

digitalWrite(C1, LOW);

digitalWrite(D1, LOW);

break;

break;

case 3:

case 4:

digitalWrite(ROJO, LOW);

digitalWrite(A1, LOW);

digitalWrite(B1, LOW);

switch (n) {

digitalWrite(C1, HIGH);

case 0:

digitalWrite(D1, LOW);

digitalWrite(A2, LOW);

break;

digitalWrite(B2, LOW);

case 5:

digitalWrite(C2, LOW);

digitalWrite(A1, HIGH);

digitalWrite(D2, LOW);

digitalWrite(B1, LOW);

break;

digitalWrite(C1, HIGH);

case 1:

digitalWrite(D1, LOW);

digitalWrite(A2, HIGH);

break;

digitalWrite(B2, LOW);

case 6:

digitalWrite(C2, LOW);

digitalWrite(A1, LOW);

digitalWrite(D2, LOW);

digitalWrite(B1, HIGH);

break;

digitalWrite(C1, HIGH);

case 2:

digitalWrite(D1, LOW);

digitalWrite(A2, LOW);

break;

digitalWrite(B2, HIGH);

case 7:

digitalWrite(C2, LOW);

digitalWrite(A1, HIGH);

digitalWrite(D2, LOW);

digitalWrite(B1, HIGH);

break;

digitalWrite(C1, HIGH);

case 3:

digitalWrite(D1, LOW);

digitalWrite(A2, HIGH);

break;

digitalWrite(B2, HIGH);

case 8:

digitalWrite(C2, LOW);

digitalWrite(A1, LOW);

digitalWrite(D2, LOW);

digitalWrite(B1, LOW);

break;

digitalWrite(C1, LOW);

case 4:

digitalWrite(D1, HIGH);

digitalWrite(A2, LOW);

break;

digitalWrite(B2, LOW);

case 9:

digitalWrite(C2, HIGH);

digitalWrite(A1, HIGH);

digitalWrite(D2, LOW);

digitalWrite(B1, LOW);

break;

digitalWrite(C1, LOW);

case 5:

digitalWrite(D1, HIGH);

digitalWrite(A2, HIGH);

break;

digitalWrite(B2, LOW);

digitalWrite(C2, HIGH);

digitalWrite(D2, LOW);

void muestraDigitoD2(int n) {

break;

case 6:

digitalWrite(B2, LOW);

digitalWrite(A2, LOW);

digitalWrite(C2, LOW);

digitalWrite(B2, HIGH);

digitalWrite(D2, HIGH);

digitalWrite(C2, HIGH);

break;

digitalWrite(D2, LOW);

case 9:

break;

digitalWrite(A2, HIGH);

case 7:

digitalWrite(B2, LOW);

digitalWrite(A2, HIGH);

digitalWrite(C2, LOW);

digitalWrite(B2, HIGH);

digitalWrite(D2, HIGH);

digitalWrite(C2, HIGH);

break;

digitalWrite(D2, LOW);
break;
case 8:
digitalWrite(A2, LOW);

}
}

CONCLUCIONES.En Este laboratorio optamos por utilizar ARDUINO donde primeramente hicimos la
simulacion del circuito de un semaforo con temporizador en el programa ISIS , luego
realizamos la codificacion e implementando tiempos para luego compilar al
simulador y asi confirmar que el circuito funciona correctamente.
Luego se procedio a grabar al controlador ARDUINO para acoplar luego a nuestro
circuito semaforo en el protoboad, y asi se concluyo con exito el proyecto.

Das könnte Ihnen auch gefallen