Informática Industrial - Examen ... - PoliformaT - UPV
Informática Industrial - Examen ... - PoliformaT - UPV Informática Industrial - Examen ... - PoliformaT - UPV
Informática Industrial - Examen microcontroladores junio 2011 Nombre y apellidos: • En la mesa sólo puede tenerse: • Identificación Personal (Tarjeta Identidad UPV/DNI/Carnet de Conducir) • Lápiz/Bolígrafo • Este enunciado • Tablas resumen publicadas en PoliformaT • Hojas de respuesta • Antes de nada, poner el nombre en: el enunciado, en cada hoja de respuesta y en las • tablas resumen. • Resolver cada problema en una hoja aparte. Problema 1 (3,0 puntos). Se desea implementar un dado electrónico con un microcontrolador de la familia 8051. Para realizar el dado, se emplea una placa donde se montan 7 LEDs que representan los posibles valores del dado. Para encender cada LED, el pin correspondiente del microcontrolador al que se conecta el LED debe ponerse a “0”. Un pulsador conectado al pin P0.7 se emplea para realizar la tirada, de manera que, cada vez que se pulsa, debe aparecer un nuevo valor aleatorio en el dado. +Vcc P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 Se pide: Desarrollar el código en C que implementa la funcionalidad del dado con las siguientes restricciones: • Emplear máscaras para actualizar la salida del puerto P0 de manera que el bit P0.7 no se vea afectado. No usar operaciones bit a bit en esta parte. • Emplear operaciones bit a bit para la lectura del pulsador. • Definir los sfr y sbit necesarios. Sugerencia: una manera sencilla de generar un valor aparentemente aleatorio consiste en ir incrementando un contador mientras el pulsador de tirada se mantiene pulsado.
- Page 2 and 3: Problema 2 (3,0 puntos). Se desea u
- Page 4 and 5: Solución problema 1: /* dado exame
- Page 6 and 7: salida = 1; // valor inicial de la
Informática <strong>Industrial</strong> - <strong>Examen</strong> microcontroladores junio 2011<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 (3,0 puntos).<br />
Se desea implementar un dado electrónico con un microcontrolador de la familia<br />
8051.<br />
Para realizar el dado, se emplea una placa donde se montan 7 LEDs que representan<br />
los posibles valores del dado. Para encender cada LED, el pin correspondiente del<br />
microcontrolador al que se conecta el LED debe ponerse a “0”.<br />
Un pulsador conectado al pin P0.7 se emplea para realizar la tirada, de manera que,<br />
cada vez que se pulsa, debe aparecer un nuevo valor aleatorio en el dado.<br />
+Vcc<br />
P0.7<br />
P0.6<br />
P0.5<br />
P0.4<br />
P0.3<br />
P0.2<br />
P0.1<br />
P0.0<br />
Se pide: Desarrollar el código en C que implementa la funcionalidad del dado con las<br />
siguientes restricciones:<br />
• Emplear máscaras para actualizar la salida del puerto P0 de manera que el bit<br />
P0.7 no se vea afectado. No usar operaciones bit a bit en esta parte.<br />
• Emplear operaciones bit a bit para la lectura del pulsador.<br />
• Definir los sfr y sbit necesarios.<br />
Sugerencia: una manera sencilla de generar un valor aparentemente aleatorio consiste<br />
en ir incrementando un contador mientras el pulsador de tirada se mantiene pulsado.
Problema 2 (3,0 puntos).<br />
Se desea utilizar un microcontrolador de la familia 8051 para realizar un convertidor<br />
de códigos de tres bits.<br />
La tabla de conversión es la siguiente:<br />
Código de<br />
entrada<br />
Código de<br />
salida<br />
000 010<br />
001 011<br />
010 100<br />
011 000<br />
100 101<br />
101 111<br />
110 001<br />
111 110<br />
Los códigos de entrada se reciben por los bits P0.2, P0.1 y P0.0 del microcontrolador<br />
(siendo P0.0 el bit menos significativo del código de entrada)<br />
Los códigos de salida se envían por los bits P1.2, P1.1 y P1.0 (siendo P1.0 el bit<br />
menos significativo del código de salida)<br />
La conversión debe realizarse cada vez que se recibe un flanco de bajada a través del<br />
pin de interrupción externa INT1.<br />
Se pide: Escribir un programa en lenguaje C que atienda la petición de interrupción<br />
externa, leyendo el código de entrada y enviando el código de salida. Definir los sfr y<br />
sbit necesarios.
Problema 3 (4,0 puntos).<br />
Se desea diseñar un sistema basado en un microcontrolador de la familia 8051 para<br />
controlar la alarma un vehículo.<br />
El funcionamiento de la alarma es el siguiente. La alarma se activa o desactiva<br />
mediante un flanco de bajada en el pin P3.2. Cuando la alarma se activa, debe hacerse<br />
un retardo de 10s y, seguidamente, a través del pin P0.1 debe generarse una onda<br />
cuadrada de 2 segundos de periodo como indica la figura. En cualquier momento, un<br />
nuevo flanco en P3.2 (desactivar alarma) detendrá el ciclo, dejando P0.1 a nivel bajo<br />
y el sistema listo para una nueva activación.<br />
Se pide: Diseñar un programa en C que cumpla el requisito de funcionamiento de la<br />
alarma.<br />
MCS-51<br />
P3.2<br />
P0.1<br />
retardo= 10s<br />
T= 2 s<br />
Para ello, declarar todos registros involucrados (“sfr”), los bits necesarios, así como<br />
la utilización de las variables más adecuadas (0,5 ptos).<br />
También, se deberá implementar usar el temporizador C/T0, en ambos casos en el<br />
modo de 16 bits, tanto el retardo, como la salida periódica suponiendo un reloj de 6<br />
MHz. Para ello, se habrá de tener en cuenta que el desborde de C/T0 se deberá<br />
encuestar en ambos casos. (3,5 ptos)
Solución problema 1:<br />
/* dado examen infi juny 2011 */<br />
sfr P0= 0x80;<br />
sbit pulsador = P0^7;<br />
unsigned char<br />
tabla_combinaciones[]={0x3F,0x5B,0x1B,0x52,0x12,0x40};<br />
void main(void) {<br />
unsigned char puntuacion;<br />
puntuacion = 3;<br />
// un valor inicial a ojo<br />
}<br />
while(1) {<br />
while(pulsador == 1) {}; // esperar pulsacion<br />
// mientras está oprimido el pulsador ir contando<br />
while(pulsador == 0) {<br />
puntuacion = (puntuacion + 1) % 6;<br />
}<br />
// actualizar puntos<br />
P0 &= 0x80;<br />
P0 |= tabla_combinaciones[puntuacion];<br />
}<br />
Solución problema 2:<br />
unsigned char tabla_conversion [8] = {2,3,4,0,5,7,1,6};<br />
sfr P0 = 0x80;<br />
sfr P1 = 0x90;<br />
sfr TCON = 0x88;<br />
sfr IE = 0xA8;<br />
sbit IT1 = TCON^2;<br />
sbit EX1 = IE^2;<br />
sbit EA = IE^7;<br />
void convertir (void) interrupt 2 {<br />
P1 = tabla_conversion [ P0 & 0x07 ]; }<br />
void main (void) {<br />
IT1 = 1;
EX1 = 1;<br />
EA = 1;<br />
while (1) { } }<br />
Solución problema 3:<br />
sfr P0 = 0x80;<br />
sfr P3 = 0xB0;<br />
sfr TH0 = 0x8C;<br />
sfr TL0 = 0x8A;<br />
sfr TMOD = 0x89;<br />
sfr TCON = 0x88;<br />
sbit TR0 = TCON^4;<br />
sbit TF0 = TCON^5;<br />
sbit entrada = P3^2;<br />
sbit salida = P0^1;<br />
data bit alarma;<br />
#define alarma_ON 1<br />
#define alarma_OFF 0<br />
#define desbordes_retardo_10_s 100 // 1 CM = 12/6MHz = 2us; 10s<br />
= 5 000 000 CM, suponiendo temporización de 50000 CM<br />
#define desbordes_semiperiodo_1_s 10 // 1s = 500 000 CM duración<br />
de cada semiperiodo, suponiendo temporización de 50000 CM<br />
void main(void){<br />
unsigned char recarga_TH0;<br />
unsigned char recarga_TL0;<br />
bit entrada_activada; // para almacenar si se ha activado<br />
la entrada<br />
unsigned char desbordes;<br />
// preparar timer<br />
TR0 = 0;<br />
TF0 = 0;<br />
TMOD &= 0xF1;<br />
TMOD |= 0x01; // modo 1, timer, gate=0<br />
recarga_TH0 = (65536-50000)/256;<br />
registro TH0 del C/T0<br />
recarga_TL0 = (65536-50000)%256;<br />
registro TL0 del C/T0<br />
// Inicialización del<br />
// Inicialización del<br />
alarma = alarma_OFF;<br />
// bucle infinito<br />
while (1){
salida = 1;<br />
// valor inicial de la salida<br />
// esparar pulso<br />
while(entrada) {} // espera mientras la entrada sea un<br />
nivel alto (=1)<br />
while(entrada==0) {} // espera termacion pulso<br />
nuevo<br />
entrada_activada = 0;<br />
// supones que no ha llega pulso<br />
// temporizar 10 s<br />
salida = 0;<br />
desbordes = desbordes_retardo_10_s;<br />
while ((entrada_activada == 0) && (desbordes > 0)) {<br />
TR0 = 0; TF0 = 0;<br />
TH0 = recarga_TH0; // Inicialización del registro<br />
TH0 del C/T0<br />
TL0 = recarga_TL0; // Inicialización del registro<br />
TL0 del C/T0<br />
TR0 = 1;<br />
while ((entrada_activada == 0) && (TF0 == 0)) {<br />
if (entrada == 0) {<br />
entrada_activada =1; // se ha<br />
detectado pulso<br />
};<br />
}<br />
desbordes--;<br />
}<br />
// temporizar 1 s a nivel alto<br />
salida = 1;<br />
desbordes = desbordes_semiperiodo_1_s;<br />
while ((entrada_activada == 0) && (desbordes > 0)) {<br />
TR0 = 0; TF0 = 0;<br />
TH0 = recarga_TH0; // Inicialización del registro<br />
TH0 del C/T0<br />
TL0 = recarga_TL0; // Inicialización del registro<br />
TL0 del C/T0<br />
TR0 = 1;<br />
while ((entrada_activada == 0) && (TF0 == 0)) {<br />
if (entrada == 0) {<br />
entrada_activada =1; // se ha<br />
detectado pulso<br />
};<br />
}<br />
desbordes--;<br />
}<br />
// temporizar 1 s a nivel alto
salida = 0;<br />
desbordes = desbordes_semiperiodo_1_s;<br />
while ((entrada_activada == 0) && (desbordes > 0)) {<br />
TR0 = 0; TF0 = 0;<br />
TH0 = recarga_TH0; // Inicialización del registro<br />
TH0 del C/T0<br />
TL0 = recarga_TL0; // Inicialización del registro<br />
TL0 del C/T0<br />
TR0 = 1;<br />
while ((entrada_activada == 0) && (TF0 == 0)) {<br />
if (entrada == 0) {<br />
entrada_activada =1; // se ha<br />
detectado pulso<br />
};<br />
}<br />
desbordes--;<br />
}<br />
}<br />
}