Documentos de Académico
Documentos de Profesional
Documentos de Cultura
DE LÁZARO CÁRDENAS
PRÁCTICA 1.3.
UNIDAD 1: MICROCONTROLADORES
ÍNDICE
Introducción .......................................................................................................................... 1
Material ................................................................................................................................. 3
Equipo .................................................................................................................................... 3
Desarrollo .............................................................................................................................. 4
Conclusión ........................................................................................................................... 15
Bibliografía .......................................................................................................................... 16
i
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Introducción
El reloj deberá de mostrar la hora, minutos y segundos, deberá ser posible el cambio entre
formato de 24 horas y 12 horas por medio de un botón y además tendrá otros dos botones
que permitan aumentar la hora y los minutos para que el usuario pueda ajustar la hora
adecuada. Para una mejor comodidad del usuario el reloj deberá de realizar la conversión de
las horas al pasar de formato de 24 horas a formato de 12 horas y viceversa, de modo que al
cambiar de formato el usuario no tenga que volver a ajustar la hora adecuada.
Esta práctica deberá de poderse llevar a cabo utilizando ciertos procedimientos lógicos
tratados con anterioridad en el curso, como la detección de los pulsos de botón, la
segmentación de los retardos y el uso de diferentes formatos de variables. Es por ello que se
espera que sea una muy buena práctica para consolidar los conocimientos sobre lo aprendido
en la presente unidad y siente las bases para la realización de un proyecto de aplicación de la
Unidad. El diagrama eléctrico propuesto para la práctica se muestra en la Figura 1.
1
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
5V
RESET 5V
39kΩ
10kΩ
MCLR/Vpp/RE3 1 40 RB7
RA0 2 39 RB6
RA1 3 38 RB5
HORAS RA2 4 RB4
37
5V
RA3 5 36 RB3
PIC18F45K50
MINUTOS RA4 6 35 RB2
5V
RA5 7 34 RB1 220Ω
4.7kΩ RE0 8 33 RB0
MODO
5V RE1 9 32 VDD 5V 5V
4.7kΩ RE2 10 31 VSS
VDD 11 30 RD7
5V
VSS 12 29 RD6 VSS VDD V0 RS RW E D0 D1 D2 D3 D4 D5 D6 D7 A K
4.7kΩ 5V
RA7 13 28 RD5
RA6 14 27 RD4
RC0 15 26 RC7
RC1
RC2
16
17
25
24
RC6
D+
LCD 16X02
VUSB3V3 18 23 D-
RD0 19 22 RD3
RD1 20 21 RD2
2
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Material
Equipo
3
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Desarrollo
Lo primero que se realiza es añadir los archivos de cabecera y definir los pines del
Microcontrolador donde irá conectado cada pin de la LCD, lo cual es necesario para el
funcionamiento de la librería “lcd.c” que se agrega después de estas declaraciones debido a
que necesita de ellas definidas antes de ejecutarse. Además, se definen los pines en los que
irán conectados los botones.
#include "18F45k50.h"
#fuses NOWDT
#use delay(internal=48MHz)
Se definen las variables horas, min y seg para guardar en ellas los valores correspondientes
al tiempo que se estará mostrando en el reloj, las variables mode y bmode permitirán guardar
el formato actual de hora y el formato anterior de hora, necesario para la conversión horaria,
la variable “apm” guardará si la hora mostrada en el formato de 12 horas es “am” o “pm”, la
variable bhoras guardará siempre la hora anterior para saber cuándo cambiar entre “am” y
4
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
“pm” y la variable “aux” será necesaria para que el cambio entre “am” y “pm” se realice
también cuando sea el usuario el que manualmente esté aumentando la hora.
void main(void){
lcd_init();
lcd_putc("\f PRACTICA 3");
delay_ms(5000);
lcd_putc("\f RELOJ");
delay_ms(2000);
lcd_putc('\f');
output_float(BUTTON_HORA);
output_float(BUTTON_MIN);
output_float(BUTTON_MODE);
Se inicia el ciclo infinito. El primer If tiene la finalidad de estar checando el valor de los
segundos para que cuando llegue a 60 se reinicie a 0 y los “min” incrementen en 1, indicando
que ha pasado un minuto. El segundo If cumple básicamente la misma función, este
incrementa la variable “horas” cuando “min” ha llegado a 60 y reinicia esta a 0.
for(;;){
if(seg >= 60){seg = 0;min++;}
if(min >= 60){min = 0;bhoras=horas;horas++;}
5
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Cuando la variable “mode” sea 1, significará que el reloj se encuentra en formato de 12 horas
por lo que en el siguiente If se le da el tratamiento adecuado cuando esto ocurre. Si “horas”
llega a 13 esta deberá reiniciarse a 1, si “horas” es 12 pero la hora anterior es 11 significa que
debe haber un cambio “am-pm” o viceversa por lo que se togglea el valor de “apm” que
contiene el meridiano en el que se encuentra el reloj y se establecen dos diferentes formas de
imprimir la hora. Cuando “apm” sea 1 se desplegará la hora junto con “pm”, cuando sea 0 se
desplegará la hora junto “am”.
if(mode){
if(horas>=13){horas=1;}
if(horas>=12 && bhoras==11){apm=!apm;}
if(apm)
printf(lcd_putc," %02u:%02u:%02u
pm",horas,min,seg);
else
printf(lcd_putc," %02u:%02u:%02u
am",horas,min,seg);
}
En cambio, cuando la variable “mode” valga cero significa que está en formato de 24 horas,
de manera que solo se establece el límite de “horas” en 24 y se resetea en 0 cuando esto
ocurra.
El ciclo for de 5 iteraciones servirá para poder testear los valores de los botones 5 veces en
cada segundo. El primer If testea cuando “BUTTON_HORA” se presiona, esto para guardar
la hora actual en “bhoras”, aumentar la variable “horas” y establecer la variable “aux” en 1
para que indique cada que se aumentó la hora, pero no se excedió de 12. El siguiente If testea
cuando al incrementar la variable “horas” el valor llegó a 12, por lo que se togglea “apm”
para detectar el cambio de meridiano y considerarlo en caso de que el modo de 12 horas esté
seleccionado para el siguiente ciclo, en este caso la variable se resetea a 0 indicando que ya
6
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
for(i=1;i<=5;i++)
{
if(input(BUTTON_HORA)){
bhoras=horas;horas++;aux=1;
if(horas>=12 && bhoras==11){apm=!apm;aux=0;}}
else if(input(BUTTON_MIN)){min++;}
También es necesario cambiar las “12 am” a “00” por lo que cuando “apm” sea 0 y “horas”
sea 12, se establecerá “horas” como 0. Cuando “mode” sea 1 y “bmode” sea 0 significa que
se pasó de formato de 24hrs a formato de 12hrs, por lo que si “horas” es mayor que 12 se le
restará a esta 12 y se pondrá “apm” en 1 para indicar “pm”, si “horas” es 12 simplemente se
seleccionará “pm” poniendo “apm” en 1, si “horas” es 0 se asignará a “horas” el valor “12”
y se pondrá el meridiano “am” colocando “apm” en 0, cualquier otro valor de la hora quedará
igual y solo se seleccionará “am” por medio de colocar “apm” en 0. El While final se utiliza
para esperar a que el botón de modo se deje de presionar.
7
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
else if(input(BUTTON_MODE))
{
bmode=mode;mode = !mode;
if(!mode && bmode){if(apm && horas>=1 &&
horas<12){horas+=12;}
else if(!apm && horas==12){horas=0;}
}
if(mode && !bmode){if(horas>12){horas-
=12;apm=1;}
else if(horas == 12){apm=1;}
else if(horas == 0){horas=12;apm=0;}
else{apm=0;}
while(input(BUTTON_MODE));
}
El For que itera 5 veces se termina con un retardo de 200ms, para que al hacer las 5 iteraciones
se complete el minuto. Las últimas líneas que se ejecutarán en cada iteración del ciclo infinito
consisten en colocar el puntero de la LCD en la posición (1,1) para que se sobreescriba sobre
los mensajes anteriores. El If comprueba si el botón “BUTTON_HORA” provocó un cambio
en la hora de 11 a 12 utilizando la variable “aux”, si no hubo cambio la variable “aux” debe
establecerse en 0 de nueva cuenta, si sí hubo se guarda el valor actual de “horas” en “bmode”
y se termina el programa.
delay_ms(200);
}
lcd_gotoxy(1,1);seg++;if(aux){aux=0;}else{bhora=
horas;
}
}
}
8
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
9
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Figura 4.- Esquema de conexiones para la tarjeta Miuva con LCD y botones.
Como se puede apreciar en la Figura 5, se fijó el reloj a las 13 horas, es decir, está en modo
24 horas. Al presionar el tercer botón (modo), se cambia el formato a 12 horas y marca la 1
pm, como se muestra en la Figura 6. Por otro lado, en la Figura 7 se presenta la hora en
formato 12 horas configurado en tiempo real antes del mediodía.
10
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
11
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
12
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
#include "18F45k50.h"
#include "18F45k50.h"
#fuses NOWDT
#use delay(internal=48MHz)
if(input(BUTTON_HORA)){bhoras=horas;horas++;aux=1;if(horas>=12 &&
bhoras==11){apm=!apm;aux=0;}}
13
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
else if(input(BUTTON_MIN)){min++;}
else if(input(BUTTON_MODE))
{
bmode=mode;mode = !mode;
if(!mode && bmode){if(apm && horas>=1 &&
horas<12){horas+=12;}
else
if(!apm && horas==12){horas=0;}
}
if(mode && !bmode){if(horas>12){horas-
=12;apm=1;}
else if(horas
== 12){apm=1;}
else
if(horas == 0){horas=12;apm=0;}
else{apm=0;}
}
while(input(BUTTON_MODE));
}
delay_ms(200);
}
lcd_gotoxy(1,1);seg++;if(aux){aux=0;}else{bhoras=horas;}
}
}
14
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Conclusión
La práctica presentada en este documento ha resultado ser una herramienta valiosa para el
desarrollo del razonamiento lógico en la programación de microcontroladores, especialmente
en lo que respecta al uso de funciones relacionadas con las entradas digitales. Además,
constituyó el primer desafío que exigía la correcta utilización de la librería "lcd.c", lo que
contribuyó significativamente a fortalecer nuestros conocimientos sobre su manejo. Hasta
ese momento, solo habíamos trabajado con programas sencillos que consistían en desplegar
simples datos constantes.
La importancia de que este programa funcionara a la perfección radica en que será la base
del proyecto de la unidad 1, por lo cual se buscó que este programa funcionara lo mejor
posible en términos de poder registrar, mostrar y modificar la hora, para que a la hora de
realizar el proyecto solo se agreguen ciertas funcionalidades de establecer alarmas y activar
alguna salida digital en función de dicha alarma. Para concluir, se considera que el programa
realizado para esta práctica está en óptimas condiciones para ser la base del proyecto de la
unidad 1.
15
Reporte Práctica 1.3
71S Aplicaciones de Microcontroladores Ingeniería Electrónica
Bibliografía
1. Fabricante: Microchip.
Título: PIC18(L)F2X/45K50 Datasheet.
Editorial: Microchip.
16
Reporte Práctica 1.3