Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV
Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV
Examen microcontroladores septiembre 2011 ... - PoliformaT - UPV
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);