Você está na página 1de 16

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA UNAD

ESCUELA DE CIENCIAS BASICAS, TECNOLOGIA E INGENIERIA

MICROPROCESADORES Y MICROCONTROLADORES

PASO 3
SOLUCIONAR LOS CIRCUITOS Y AVANCES DEL PROYECTO

PRESENTADO POR:

DIEGO JAVIER COHECHA LEON COD: 80228006

GRUPO: 309696_29

PRESENTADO A:
Ing. NESTOR JAVIER RODRIGUEZ

BOGOTA - COLOMBIA
ABRIL 2018
INTRODUCCION

En este trabajo se presentara la solución a ejercicios planteados mediante el


Microcontrolador Pic16f877 realizando su diseño y programación dando solución a
una determinada aplicación o aplicaciones que muy posiblemente de ven en el
campo industrial empleándose sensores y control de variables como lo es la
temperatura.

Para este trabajo se utilizo el lenguaje de programación Pic C y la simulación del


software mediante Proteus
Actividades a desarrollar
Programa 1:
Microcontrolador Pic16f877a
1 Display 16 X 2
1 Dth11 (sensor de temperatura y humedad)
3 leds (rojo , amarillo, verde)
2 Motores 12 vdc (ventilador)
3 resistencias de 220 ohmios
3 resistencias de 1 k ohmios
5 pulsadores

Debe sensar la humedad y temperatura del ambiente con el sensor


dth11 de proteus, monitorizando las dos variables y visualizándolas en
un display 16 x2 y si la temperatura está menor o igual de 15 grados
el led verde se encenderá , si la temperatura está entre los 20 y 28
grados se encenderá un led amarillo , y si supera los 30 grados el led
rojo se prendera y debe dar una alarma constante y prenderse el
ventilador hasta que baje la temperatura menor o igual a 20
grados. En el display se debe visualizar el valor de la temperatura y
la activación de motor como MOTOR ON o MOTOR OFF. Debe sensar
a todo momento la humedad del ambiente al pasar por el 60% se
debe activar un motor ventilador y se debe apagar cuando esta baje
a menos de 50%.

Para este primer ejercicio realice la aplicación mediante PIC C, a continuación


describo el código:
#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock = 20M)
#define PCF_SDA PIN_C2
#define PCF_SCL PIN_C1
// LCD con i2C
#use i2c(master, sda=PCF_SDA, scl=PCF_SCL)
#define PCF_ID 7
#define PCF 64 // Puede ser 112 ó 64 (PCF8574T=64, PCF8574A=112, PCF8574=64)
#define blacking P3
#define LCD_RS P0
#define LCD_RW P1
#define LCD_E P2
#define LCD_DB4 P4
#define LCD_DB5 P5
#define LCD_DB6 P6
#define LCD_DB7 P7
#include <LCD_PCF.c>// Librerio para manejar el I2C
#use fast_io(D)

// Asignacion de pin para conectar el DTH11 al puerto D0


#BIT Data_Pin = 0x08.0 // Pin mapped to PORTD.0
#BIT Data_Pin_Direction = 0x88.0 // Pin direction mapped to TRISD.0
short Time_out;//Variable para el tiempo de respuesta del sensor
unsigned int8 T_byte1, T_byte2, RH_byte1, RH_byte2,Temp,RH,CheckSum ;

void start_signal(){
Data_Pin_Direction = 0; // Configure connection pin as output
Data_Pin = 0; // Connection pin output low
delay_ms(25);
Data_Pin = 1; // Connection pin output high
delay_us(30);
Data_Pin_Direction = 1; // Configure connection pin as input
}

short check_response(){
delay_us(40);
if(!Data_Pin){ // Read and test if connection pin is low
delay_us(80);
if(Data_Pin){ // Read and test if connection pin is high
delay_us(50);
return 1;}
}
}
unsigned int8 Read_Data(){
unsigned int8 i, k, _data = 0; // k is used to count 1 bit reading duration
if(Time_out)
break;
for(i = 0; i < 8; i++){
k = 0;
while(!Data_Pin){ // Wait until pin goes high
k++;
if (k > 100) {Time_out = 1; break;}
delay_us(1);}
delay_us(30);
if(!Data_Pin)
bit_clear(_data, (7 - i)); // Clear bit (7 - i)
else{
bit_set(_data, (7 - i)); // Set bit (7 - i)
while(Data_Pin){ // Wait until pin goes low
k++;
if (k > 100) {Time_out = 1; break;}
delay_us(1);}
}
}
return _data;
}

//Cadena para el manejo del char donde se enviara los datos para el i2c

Const char Letra1[8]= {0b00000,0b11011,


0b11011,
0b00000,
0b11111,
0b11111,
0b01110,
0b00000
};
char i; //Variable para el i2c

void main(){
lcd_init(); // Initialize LCD module
CGRAM_x(5);
lcd_putc('\f'); // LCD clear
for(i=0;i<=7 ;i++) lcd_send_byte(1,Letra1[i]);
output_high(pin_b3); //Sentido motor
output_low(pin_b4); //Sentido motor
output_low(pin_b7); //Apaga Motor RH
output_low(pin_b5); //Apaga Motor
while(TRUE){
delay_ms(1000);
Time_out = 0;
Start_signal();
if(check_response()){ // Si hay respuesta del sensor
RH_byte1 = Read_Data(); // lee Humedad Relativa del byte1
RH_byte2 = Read_Data(); // lee Humedad Relativa del byte2
T_byte1 = Read_Data(); // lee Temperatura del byte1
T_byte2 = Read_Data(); // lee Temperatura del byte2
CheckSum = Read_Data();
Temp=((T_byte2*10)+T_byte1);
RH=((RH_byte2*10)+RH_byte1);
lcd_putc('\f');
lcd_gotoxy(1, 1);
printf(LCD_PUTC,"Temp: ");
printf(LCD_PUTC,"%d", Temp);
lcd_gotoxy(1, 2);
printf(LCD_PUTC,"RH: ");
printf(LCD_PUTC,"%d", RH);
delay_us(1000);
delay_us(1000);

}
if(Temp<=15){
output_high(pin_b2);
output_low(pin_b1);
output_low(pin_b0);
}else if(Temp >=20 && Temp <=28){
output_low(pin_b2);
output_high(pin_b1);
output_low(pin_b0);
}
if(Temp >=30){
output_low(pin_b2);
output_low(pin_b1);
output_high(pin_b0);
output_high(pin_b5); //Encender motor
output_high(pin_b6); //Encender Alarma
lcd_putc('\f');
lcd_gotoxy(1, 1);
printf(LCD_PUTC,"Temp: ");
printf(LCD_PUTC,"%d", Temp);
lcd_gotoxy(1,2);
printf(LCD_PUTC,"MOTOR ON ");
delay_us(1000);
delay_ms(1000);
}else if(Temp <=20){
output_low(pin_b5); //Apaga Motor
output_low(pin_b6); //Apaga Alarma - buzzer
lcd_putc('\f');
lcd_gotoxy(1, 1);
printf(LCD_PUTC,"Temp: ");
printf(LCD_PUTC,"%d", Temp);
lcd_gotoxy(1,2);
printf(LCD_PUTC,"MOTOR OFF ");
delay_us(1000);
delay_us(1000);
}
if(RH>=60){
output_high(pin_b7); // Apaga Motor RH
lcd_putc('\f');
lcd_gotoxy(1, 1);
printf(LCD_PUTC,"RH: ");
printf(LCD_PUTC,"%d", RH);
lcd_gotoxy(1,2);
printf(LCD_PUTC,"MOTOR ON ");
delay_us(1000);
delay_ms(1000);
}
if(RH<=50){
output_low(pin_b7); // Apaga Motor RH
lcd_putc('\f');
lcd_gotoxy(1, 1);
printf(LCD_PUTC,"RH: ");
printf(LCD_PUTC,"%d", RH);
lcd_gotoxy(1,2);
printf(LCD_PUTC,"MOTOR OFF ");
delay_us(1000);
delay_us(1000);
}
}
}

Como para esta práctica utilice un I2C, se requiere incluir la librería I2C en la
misma carpeta de realización del ejercicio para que funcione correctamente, es
decir en la carpeta del proyecto.
Montaje de la Práctica en Proteus
Programa 2:
Se diseñara un sistema de cerradura electrónica el cual deberá en un
display 16X2 desplegar en la primera línea el nombre del curso y
numero de grupo, habrá un teclado matricial de 4 x4, y al digitar el
número de cedula de cada estudiante debe aparecer en el display y al
ser el correcto se debe encender un led para cada uno de los
estudiantes, serán 5 leds (verde, amarillo, rojo, azul y blanco)

En primer lugar para este ejercicio los integrantes del grupo somos:
Diego
Carlos
Nestor
Roosber
Javier

Y con respecto al número de documento designe los siguientes números


de documento de identidad respectivamente:
1033685765
1033685766
1033685767
1033685768
1033685769

Para este segundo ejercicio también utilice el lenguaje PIC C


El cual es el siguiente:
#include <16F877A.h>
#fuses XT,HS
#use delay (clock=4M)
#define PCF_SDA PIN_D1
#define PCF_SCL PIN_D0
#use i2c(master, sda=PCF_SDA, scl=PCF_SCL)
#define PCF_ID 7
#define PCF 64 // Puede ser 112 ó 64 (PCF8574T=64, PCF8574A=112, PCF8574=64)
#define blacking P3
#define LCD_RS P0
#define LCD_RW P1
#define LCD_E P2
#define LCD_DB4 P4
#define LCD_DB5 P5
#define LCD_DB6 P6
#define LCD_DB7 P7
#include <LCD_PCF.c>
#include <KBD1.c>
Const char Letra1[8]= {0b00000,0b11011,
0b11011,
0b00000,
0b11111,
0b11111,
0b01110,
0b00000
};
char c;
int clave1[10]={'1','0','3','3','6','8','5','7','6','5'};
int clave2[10]={'1','0','3','3','6','8','5','7','6','6'};
int clave3[10]={'1','0','3','3','6','8','5','7','6','7'};
int clave4[10]={'1','0','3','3','6','8','5','7','6','8'};
int clave5[10]={'1','0','3','3','6','8','5','7','6','9'};
int i,u=0; // contador
char k; // lectura del teclado
char dato[10]; //dato: almacena los dígitos

void main(){
lcd_init();
CGRAM_x(5);
for(c=0;c<=7 ;c++) lcd_send_byte(1,Letra1[c]);
kbd_init();
port_b_pullups(TRUE); // resistencias o internas del pic
for(;;){
lcd_putc("\f");
lcd_putc("MICROCONTROLADOR "); // Nombre del programa
lcd_putc("\n GRUPO 29 "); // numero del grupo
delay_ms(1000);
delay_ms(1000);
lcd_putc("\fINGRESE SU CLAVE ");
output_low(PIN_D0);
output_low(PIN_D1);

i=0;
while(i<10){
k=kbd_getc(); // leer la tecla presionada
if(k!=0){
dato[i]=k;
i++;
lcd_gotoxy(i,2); // posición i de la segunda línea
lcd_putc(k);
}
}

if( u==0 && dato[0]==clave1[0] && dato[1]==clave1[1] && dato[2]==clave1[2] && dato[3]==clave1[3]
&& dato[4]==clave1[4] && dato[5]==clave1[5] && dato[6]==clave1[6] && dato[7]==clave1[7] &&
dato[8]==clave1[8] && dato[9]==clave1[9])
{
lcd_putc("\fClave Correcta! ");
lcd_putc("\nUsuario Diego ");
delay_ms(2000);
output_high(pin_c0);
u=1;
}
if( u==0 &&dato[0]==clave2[0] && dato[1]==clave2[1] && dato[2]==clave2[2] && dato[3]==clave2[3]
&& dato[4]==clave2[4] && dato[5]==clave2[5] && dato[6]==clave2[6] && dato[7]==clave2[7] &&
dato[8]==clave2[8] && dato[9]==clave2[9])
{
lcd_putc("\fClave Correcta! ");
lcd_putc("\nUsuario Carlos ");
delay_ms(2000);
output_high(pin_c1);
u=1;
}
if( u==0 && dato[0]==clave3[0] && dato[1]==clave3[1] && dato[2]==clave3[2] && dato[3]==clave3[3]
&& dato[4]==clave3[4] && dato[5]==clave3[5] && dato[6]==clave3[6] && dato[7]==clave3[7] &&
dato[8]==clave3[8] && dato[9]==clave3[9])
{
lcd_putc("\fClave Correcta! ");
lcd_putc("\nUsuario Nestor ");
delay_ms(2000);
output_high(pin_c2);
u=1;
}
if(u==0 && dato[0]==clave4[0] && dato[1]==clave4[1] && dato[2]==clave4[2] && dato[3]==clave4[3]
&& dato[4]==clave4[4] && dato[5]==clave4[5] && dato[6]==clave4[6] && dato[7]==clave4[7] &&
dato[8]==clave4[8] && dato[9]==clave4[9])
{
lcd_putc("\fClave Correcta! ");
lcd_putc("\nUsuario Roosber ");
delay_ms(2000);
output_high(pin_c3);
u=1;
}
if( u==0 &&dato[0]==clave5[0] && dato[1]==clave5[1] && dato[2]==clave5[2] && dato[3]==clave5[3]
&& dato[4]==clave5[4] && dato[5]==clave5[5] && dato[6]==clave5[6] && dato[7]==clave5[7] &&
dato[8]==clave5[8] && dato[9]==clave5[9])
{
lcd_putc("\fClave Correcta! ");
lcd_putc("\nUsuario Javier ");
delay_ms(2000);
output_high(pin_c4);
u=1;
}
if(u==0){
lcd_putc("\fClave incorecta ");
lcd_putc("\n -_- ");
delay_ms(2000);

}else u=0;
}
}

Para este ejercicio también se requiere incluir la librería de I2C para su


correcto funcionamiento.

A continuación anexo pantallazo de montaje realizado en proteus


PROPUESTA GRUPAL

SISTEMA DE SEGURIDAD:
Alarma con 6 puntos de sensibilidad con sensores de movimiento,
infrarrojos, temperatura, presión etc. con indicación de zona de
ingreso y por medio de un lcd 16x2, y 3 salidas que activen los leds
de color rojo, amarillo y verde como zona segura(verde),
alerta(amarilla) y alarma(rojo), zona segura no se activa ningún
sensor, alerta máximo 2 sensores activados y alarma 3 sensores
activados, más una salida a relevos para sirena.

Metodología:
Para este proyecto se utilizara Proteus para su simulación donde
implementaremos los componentes necesarios para dar solución a la problemática
planteada.
Insertaremos como nos lo pide la guía; 6 sensores los cuales los simularemos por
medio de Switches - pulsadores, la visualización será por medio de un LCD de
16x2, como salidas tendremos 3 leds lo cuales nos mostraran su visualización
mediante su encendido, teniendo en cuenta que el led rojo nos indica alarma; es
decir que hay presencia de peligro y se activaran 3 sensores, el led amarillo nos
indica alerta: es decir que muy posiblemente hay presencia de algún peligro y se
activaran 2 sensores y el led verde nos indica zona segura y por lo tanto no se
activara ningún sensor.
Como alarma utilizaremos un buzzer.
Y posteriormente procederemos a utilizar Arduino para la realización del código
Para este utilizaremos del pin 1 al 6 como entradas (serian los sensores) y del pin
7 al 9 como salidas (serian los leds de visualización)
En el código es importante identificar los pines asignados tanto para los sensores
como para las salidas y la configuración del display y la declaración de las
variables.
Y teniendo en cuenta lo anterior se utilizaría un If (si condicional) para el
reconocimiento de los 6 sensores según su estado, es decir; nos validara si están
en 0 (low) o en 1 (hight) para la detección del sistema de seguridad y así
dependiendo del estado se nos activaría los leds. Así mismo teniendo en cuenta
esta condición también se visualizara en el LCD el análisis de resultados

Inicio de fase del Algoritmo:


Esquema General:

Análisis de Resultados:
El análisis de resultados lo tendremos básicamente de 3 maneras según el estado
de activación de los 6 sensores.
Tendremos la visualización en LCD del estado de los 6 sensores, es decir de las
entradas y nos dirá si están activados o encendidos o están desactivados o
apagados y simultáneamente podemos visualizar el estado de las salidas, que
para la práctica son los led’s, y también tenemos un tercer dispositivo como salida
que es un buzzer el cual únicamente se activara cuando se activen 3 o más
sensores lo que indicara que la alarma de activo, a este buzzer le podremos
controlar el tono mediante un potenciómetro de 1KΏ

Recursos a utilizar:
Tarjeta Arduino MEGA (1)
LCD 16x2 (1)
Pulsadores N/A (6)
Resistencias (varios valores)
Potenciómetro 1 kΏ(1)
Led Verde (1)
Led Amarillo (1)
Led Rojo (1)
Buzzer (1)
CONCLUSIONES

Se identifico las características funcionales, arquitectura, aplicación del


Microcontrolador Pic 16f877

Se realizo la simulación mediante Proteus y utilización del programa PIC C,


determinando de esta forma que las aplicaciones se pueden realizar primero de
forma computacional para dar respuesta a la problemática planteada.

Se aplico un determinado diseño de algoritmo dependiendo la problemática

REFERENCIAS BIBLIOGRAFICAS
Di Jasio, Lucio (2007) Programming 16-bit PIC Microcontrollers in C ,
Learning to Fly the PIC 24. Recuperado
de http://bibliotecavirtual.unad.edu.co:2139/eds/detail/detail?vid=3&si
d=bb49356b-11e7-4189-97ff
c78729359ced%40sessionmgr198&hid=127&bdata=Jmxhbmc9ZXMmc2l
0ZT1lZHMtbGl2ZQ%3d%3d#AN=193636&db=nlebk

Tutovirtual0. (2013, Octubre 23). Curso Microcontroladores PIC Parte 1.


[Archivo de Video] Recuperado de:
https://www.youtube.com/watch?v=2OE0Py_vmn0

Yuste, P. P. (09 de 06 de 2009). Salidas Digitales de un Sistema


Microcontrolado Universidad Politecnica de Valencia. Recuperado de
http://repository.unad.edu.co/handle/10596/7111

Monografías (s.f) Diferencias entre microcontroladores y


microprocesadores [Blog] Recuperado de:
http://www.monografias.com/trabajos27/microcontroladores/microcontr
oladores.shtml

Você também pode gostar