17.01.2015 Views

Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV

Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV

Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Informática Industrial - <strong>Examen</strong> <strong>microcontroladores</strong> <strong>septiembre</strong> <strong>2011</strong><br />

Nombre y apellidos:<br />

• En la mesa sólo puede tenerse:<br />

• Identificación Personal (Tarjeta Identidad <strong>UPV</strong>/DNI/Carnet de Conducir)<br />

• Lápiz/Bolígrafo<br />

• Este enunciado<br />

• Tablas resumen publicadas en <strong>PoliformaT</strong><br />

• Hojas de respuesta<br />

• Antes de nada, poner el nombre en: el enunciado, en cada hoja de respuesta y en las<br />

• tablas resumen.<br />

• Resolver cada problema en una hoja aparte.<br />

Problema 1 (4,0 puntos).<br />

A un microcontrolador de la familia 8051 se conecta un pulsador a cada uno de los<br />

pines P1.0, P1.1, P1.2 y P1.3, y se conecta un LED a cada uno de los pines P1.4 y<br />

P1.5. Los pulsadores introducen un “0” al presionarlos y los LED se encienden al<br />

colocar un “0” en las salidas correspondientes<br />

Se pide:<br />

Desarrollar una aplicación en C que enciende solo el LED conectado a P1.4 si hay 2 o<br />

menos pulsadores presionados y enciende solo el LED conectado a P1.5 si hay 3 o<br />

más pulsadores presionados.<br />

Dibujar el esquemático con el mínimo de componentes electrónicos que implementa<br />

dicha funcionalidad aprovechando la arquitectura de los puertos del 8051.<br />

Problema 2 (3,0 puntos).<br />

Se desea utilizar un microcontrolador de la familia 8051 para realizar un comparador<br />

de datos de cuatro bits.<br />

El datoA se recibe por los bits P0.3, P0.2, P0.1 y P0.0 del microcontrolador (siendo<br />

P0.0 el bit menos significativo del datoA).<br />

El datoB se recibe por los bits P0.7, P0.6, P0.5 y P0.4 (siendo P0.4 el bit menos<br />

significativo del datoB).<br />

El resultado de la comparación debe enviarse a través del bit P1.0 del<br />

microcontrolador, de forma que:<br />

P1.0 = 0 si datoA datoB


La comparación debe realizarse cada vez que se recibe un flanco de bajada a través<br />

del pin de interrupción externa INT0.<br />

Se pide: Escribir un programa en lenguaje C que atienda la petición de interrupción<br />

externa, leyendo los datos de entrada y enviando el resultado de la comparación.<br />

Definir los sfr y sbit necesarios.<br />

Problema 3 (3,0 puntos).<br />

Utilizando el timer 0 de un microcontrolador de la familia 8051, diseñar una función<br />

en C que permita hacer un retardo de hasta 10 segundos como máximo.<br />

El prototipo de la función será<br />

void retardo(int segundos);<br />

dónde segundos puede ser cualquier valor entero entre 1 y 10.<br />

Definir los sfr, bits y variables necesarios. Suponer un oscilador de 12 MHz.


Solución problema 1:<br />

/* examen micros setembre <strong>2011</strong> */<br />

sfr P1=0x90;<br />

sbit PULS1 = P1^0;<br />

sbit PULS2 = P1^1;<br />

sbit PULS3 = P1^2;<br />

sbit PULS4 = P1^3;<br />

sbit LED1 = P1^4;<br />

sbit LED2 = P1^5;<br />

void main (void) {<br />

unsigned char pulsados;<br />

while(1) {<br />

pulsados = 0;<br />

if (PULS1 == 0) {pulsados++;};<br />

if (PULS2 == 0) {pulsados++;};<br />

if (PULS3 == 0) {pulsados++;};<br />

if (PULS4 == 0) {pulsados++;};<br />

if (pulsados =3) {<br />

LED1 = 1;<br />

LED2 = 0;<br />

}<br />

}<br />

}


Solución problema 2:<br />

sfr P0 = 0x80;<br />

sfr P1 = 0x90;<br />

sfr TCON = 0x88;<br />

sfr IE = 0xA8;<br />

sbit IT0 = TCON^0;<br />

sbit EX0 = IE^0;<br />

sbit EA = IE^7;<br />

sbit resultado = P1^0;<br />

void comparar (void) interrupt 0 {<br />

unsigned char datoA,<br />

datoB;<br />

datoA = P0 & 0x0F;<br />

datoB = P0 >> 4;<br />

if ( datoA


* Función de retardo */<br />

sfr TCON = 0x88;<br />

sfr TMOD = 0x89;<br />

sfr TL0 = 0x8A;<br />

sfr TH0 = 0x8C;<br />

sbit TR0 = TCON^4;<br />

sbit TF0 = TCON^5;<br />

// no se introducirán valores decimales,<br />

#define seg 1<br />

// como los tiempos son enteros: 1,2,3,4, 5, .., hasta 10s<br />

// el temprorizador solo medirá tiempos multiplos de estas cantidades<br />

// Siendo el reloj externo de 12 MHz, el CM es 12/12/MHz= 1 us<br />

// haciendo temporizaciones de 10000us<br />

// 1s = 1*100*10000us, 2s = 2*100*10000us,3s = 3*100*10000 us, ...,<br />

// 10s = 10*100*10000 us,<br />

void delay_s(int seg)<br />

{<br />

unsigned int desbordes;<br />

desbordes = (seg*100);<br />

TH0 = (65536 - desbordes)/256;<br />

TL0 = (65536 - desbordes)%256;<br />

TR0 = TF0 = 0; /*garantizar condiciones iniciales adecuadas*/<br />

TR0 = 1; /* a correr */<br />

while(desbordes)<br />

if (TF0) {<br />

TF0 = 0;<br />

desbordes--;<br />

}<br />

TR0 = TF0 = 0;<br />

}<br />

void main(void){<br />

TMOD |= 0x01;<br />

TMOD &= 0xF1;<br />

/* modo 1, 16 bits, cronom de 65536 us, temp., control soft. */<br />

}<br />

while(1){<br />

delay_s(seg);<br />

}


* Con interrupción del temporizador C/T 0 */<br />

sfr TCON = 0x88;<br />

sfr TMOD = 0x89;<br />

sfr TL0 = 0x8A;<br />

sfr TH0 = 0x8C;<br />

sfr IE = 0xA8;<br />

sbit TR0 = TCON^4;<br />

sbit ET0 = IE^1;<br />

sbit EA = IE^7;<br />

sbit TF0 = TCON^5;<br />

#define seg 1<br />

unsigned int desbordes=0;<br />

// no se introducirán valores decimales,<br />

// como los tiempos son enteros: 1,2,3,4, 5, .., hasta 10s,<br />

// el temprorizador solo medirá tiempos múltiplos de estas cantidades<br />

// Siendo el reloj externo de 12 MHz, el CM es 12/12/MHz= 1 us<br />

// haciendo temporizaciones de 10000us<br />

// 1s = 1*100*10000us, 2s = 2*100*10000us,3s = 3*100*10000 us, ...,<br />

// 10s = 10*100*10000 us<br />

void delay_s (void)interrupt 1 {<br />

}<br />

TR0 = 0;<br />

desbordes--;<br />

if (desbordes==0) {<br />

ET0 = 0; // parar la interrupcion<br />

TR0 = 0; // parar temporizador<br />

}<br />

TH0 = (65536 - desbordes)/256;<br />

TL0 = (65536 - desbordes)%256;<br />

TR0 = 1;<br />

void main(void){<br />

EA = 0;<br />

ET0 = 1;<br />

TMOD |= 0x01;<br />

TMOD &= 0xF1;<br />

/* modo 1, de 16 bits, cronómetro hasta 65536, temp, control soft. */<br />

}<br />

desbordes = (seg*100);<br />

TH0 = (65536 - desbordes)/256;<br />

TL0 = (65536 - desbordes)%256;<br />

EA = 1;<br />

TR0 = 1; /* a correr */<br />

while(1);

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!