Está en la página 1de 19

PROYECTO FINAL

TRANSMISION Y RECEPCIÓN INALÁMBRICA DE SEÑALES UTILIZANDO


MODULO SERIAL RS232 DEL MICROCONTROLADOR PIC16F877A

LINA ISABEL ENCISO SALAZAR

JORGE ANGARITA

OBJETIVOS:

 Implementación de módulos de transmisión y recepción inalámbrica.


 Uso del conversor análogo digital del MCU de 8 bits.
 Implementación de la tecnología TTL (lógica transistor a transistor).

DIAGRAMA DE BLOQUES

Diagrama de Bloques del Transmisor


Diagrama de Bloques del Receptor

2. DESCRIPCIÓN DEL PROYECTO

El proyecto se divide en dos componentes: el transmisor, que consiste en un sistema de


recolección de una señal mediante un sensor, posteriormente una etapa de amplificación, y
después, se realiza una transformación análoga a digital mediante el módulo que viene integrado
en el microcontrolador PIC16F877A; el valor de esa transformación se guardará en un registro de 8
bits para finalmente enviar dicho registro utilizando el módulo de comunicaciones RS232 que esta
integrado en el mismo micro controlador y esa señal (que tiene niveles TTL) se ingresa a un
módulo

transmisor RF. El anterior proceso se repite indefinidamente cada pocos milisegundos. La otra
etapa, el receptor inicia en un módulo receptor inalámbrico, el cual recibe las señales del
transmisor y las convierte a niveles TTL, las cuales ingresan por el módulo serial RS232 del otro
microcontrolador, es guardada como un registro, y luego, mediante una lógica definida, se toma la
decisión de encender un pin (un sentido del motor), otro pin (sentido contrario del motor) o
apagar los dos (motor detenido). Las salidas de esos dos pines se ingresan al integrado L293B, el
cual es un doble puente H utilizado comúnmente en aplicaciones con motores DC. Finalmente se
conecta el motor que se desea controlar para la aplicación elegida.
SIMULACION EL PROTEUS

Simulación de lo que se debe ver en el montaje real en el receptor

U2(+VS)

LCD2
LM016L
1 U2

U1 0
36.0
13 33
14
OSC1/CLKIN RB0/INT
34 1
OSC2/CLKOUT RB1

V DD
V SS

V EE
2 35

RW
RS

D0
D1
D2
D3
D4
D5
D6
D7
VOUT RB2

E
2 36
RA0/AN0 RB3/PGM
3 37
RA1/AN1 RB4 0

1
2
3

4
5
6

7
8
9
10
11
12
13
14
4 38
RA2/AN2/VREF-/CVREF RB5
3 LM35 5 39
6
RA3/AN3/VREF+ RB6/PGC
40 0
RA4/T0CKI/C1OUT RB7/PGD
7
RA5/AN4/SS/C2OUT
15
RC0/T1OSO/T1CKI 1
8 16
RE0/AN5/RD RC1/T1OSI/CCP2 0
9 17
RE1/AN6/WR RC2/CCP1 0
10 18
RE2/AN7/CS RC3/SCK/SCL 0
23
RC4/SDI/SDA
1 24
MCLR/Vpp/THV RC5/SDO
25
RC6/TX/CK
26
RC7/RX/DT

19
RD0/PSP0
20
RD1/PSP1
21
RD2/PSP2
22
RD3/PSP3
27
RD4/PSP4
28
RD5/PSP5
29
RD6/PSP6
30
RD7/PSP7

PIC16F877A

NOTA: ya que proteus no permite simular transmisión rf se realizó el proyecto con el montaje
original presentado el viernes 22 de mayo en el laboratorio.

CONCLUSIONES:

 La lógica transistor a transistor nos sirvió mucho en este caso para las señales de salida
TTL ya que se degradan rápidamente si no se transmiten a través de circuitos
adicionales de transmisión

 Gracias al integrado L293B permite realizar la inversión de giro de dos motores o arrancar
y parar cuatro motores por diferentes señales de entrada, como en este caso a las
variaciones de los ojos al mirar hacia diferentes lados; mediante los MCU solamente, es
difícil controlar los motores ya que entregan muy poca corriente, sin embargo estos
integrados ayudar a manipular fácilmente los motores sin necesidad q el MCU deba
entregar grandes cantidades de corriente.

 Las comunicaciones entre dispositivos de tipo serial son muy útiles, puesto que permiten
la transferencia de información por un solo hilo, a diferencia de la comunicación en
paralelo.
 Los modulos RF facilitan la comunicación de tipo serial entre dispositivos, mediante la
modulación FSK a frecuencias entre 315 a 438MHz y gracias a estas frecuencias altas se
requieren antenas cortas y bajo consumo de potencia para transmisiones de hasta 100
metros a campo abierto

ANEXO

CODIGO DEL TRANSMISOR

#include <16F877A.h>
#device ADC=10

// usaremos conversor A/D con 10 bits de resolución

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)

#include <lcd.c>

#use fast_io(A) // Para configurar manualmente el puerto como entrada o salida


#use fast_io (B)
//////////////////////////////////////////////////////////////////////////////////////

int16 Valor,maximo,minimo,centro;

//////////////////////////////////////////////////////////////////////////////////////

void IniPuertos(){

set_tris_B(0x00);
set_tris_C(0x00);

void IniConversorAD(){
setup_adc(ADC_CLOCK_INTERNAL); // Configura el conversor
setup_adc_ports(AN0); // Entrada RA0 como analógica
set_tris_A(0xFF); // Todo el PortA como entrada
}

void LeerSenal(){
set_adc_channel(0); // Seleccionar un canal (en este caso Canal 0)
delay_us(10); // Retardo necesario entre la selección de canal y la adquisición.
Valor=read_adc(); // Adquisición de la señal.
}

//////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL //
//////////////////////////////////////////////////////////////////////////////////////

void main() {
IniPuertos();
IniConversorAD();
centro=520;
maximo=centro+25; //se define umbral para derecha
minimo=centro-25; //umbral izquierda

while (true){

LeerSenal();

if (!input(pin_C4)){ //FRENO AUTOMMATICO


output_bit(PIN_B7,0);
output_bit(PIN_B6,0);
output_bit(PIN_B5,0);
output_bit(PIN_B4,0);

else {

if (Valor>maximo){ //avanza para la derecha

output_bit(PIN_B5,1);
output_bit(PIN_B4,0); //UN MOTOR HACIA LA DERECHA

output_bit(PIN_B6,0);
output_bit(PIN_B7,0); //EL OTRO MOTOR DETENIDO

else if (Valor<minimo){ //miro a la izquierda

output_bit(PIN_B5,0);
output_bit(PIN_B4,0); //MOTOR 1 DETENIDO
output_bit(PIN_B6,1);
output_bit(PIN_B7,0); //MOTOR 2 HACIA LA IZQUIERDA

}
else if ((Valor>minimo)||(Valor<maximo)) { //miro al centro

output_bit(PIN_B5,1);
output_bit(PIN_B4,0); //MOTOR 1 DETENIDO

output_bit(PIN_B6,1);
output_bit(PIN_B7,0); //MOTOR 2 HACIA LA IZQUIERD

}
}

}
}

CODIGO DEL RECEPTOR

#include <16F877A.h>
#device ADC=10

#include <DriverTec4x4.c>

// usaremos conversor A/D con 10 bits de resolución

#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)

#include <lcd.c>

#use fast_io(A) // Para configurar manualmente el puerto como entrada o salida


#use fast_io (B)
//////////////////////////////////////////////////////////////////////////////////////

int16 Valor,Voltaje,superior,inferior,aux;
int8 Dig1,Dig2,Dig3,Dig4;
int8 NTec,unidades,decenas,centenas,milesimas,indicador,posicion;
signed int16 num1,num2,resul;
int1 on,resultado,segundaparte,suma,resta;
//////////////////////////////////////////////////////////////////////////////////////

void IniConversorAD(){
setup_adc(ADC_CLOCK_INTERNAL); // Configura el conversor
setup_adc_ports(AN0); // Entrada RA0 como analógica
set_tris_A(0xFF); // Todo el PortA como entrada
}

void LeerSenal(){
set_adc_channel(0); // Seleccionar un canal (en este caso Canal 0)
delay_us(10); // Retardo necesario entre la selección de canal y la adquisición.
Valor=read_adc(); // Adquisición de la señal.
}

void DescomponerEnDigitos(int16 Dato){


int16 aux;

Dig1= Dato/1000;
aux= Dato% 1000;
Dig2= aux/100;
aux%= 100;
Dig3= aux/10;
Dig4= aux%10;
}

void ProcesarSenal(){
int32 aux;
aux= Valor;
Voltaje= (9775*aux)/200; // V= 6*q*Valor
DescomponerEnDigitos(Voltaje);

Dig1+= '0'; // Convierte los dígitos a código ASCII


Dig2+= '0';
Dig3+= '0';
Dig4+= '0';
if (Dig1== '0'){
Dig1= " ";
}
}

void IniPantallaLCD(){
lcd_init();
lcd_putc("\f"); // Borrar Pantalla
lcd_putc("*CONVERSION A/D*\n"); // Texto inicial y \n para pasar a la línea 2
lcd_putc("Tempera= 00.00gr");
}

void VisualizaLCD(){

lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD


lcd_putc(Dig1);
lcd_putc(Dig2);
lcd_putc(".");
lcd_putc(Dig3);
lcd_putc(Dig4);
}

void IniPuertos(){

unidades=0;
decenas=0;
centenas=0;
milesimas=0;
indicador=0;
posicion=0;

set_tris_B(0x0F);
port_b_pullups(TRUE);
indicador=0;

void ProcesarTeclado(){ // Esta función ejecuta la acción requerida por cada pulsador del teclado.
int8 i;
switch (NTec){
case 0: // Rutina de atención al pulsador a
indicador=1;
break;

void procesarnumeroteclado(){
int16 aux1;
int16 aux2;

aux=milesimas;
aux=aux*1000;

aux1=centenas;
aux1=aux1*100;

aux2=decenas;
aux2=aux2*10;
aux=aux+aux1+aux2+unidades;

void ProcesarTeclado1(){ // Esta función ejecuta la acción requerida por cada pulsador del
teclado.
int8 i;
switch (NTec){

case 12: // Rutina de atención al pulsador d


if (indicador==4){
procesarnumeroteclado();
inferior=aux;
indicador=0;
posicion=0;
IniPuertos();
IniConversorAD();
IniPantallaLCD();
}

if (indicador==2){
procesarnumeroteclado();
superior=aux;
indicador=3;
posicion=0;
}
break;
case 1: // Rutina de atención al pulsador 3
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('3');
unidades=3;
posicion=4;
}

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('3');
decenas=3;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('3');
centenas=3;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('3');
milesimas=3;
posicion=1;
}

if (posicion==4){
posicion==0;
}

break;
case 5: // Rutina de atención al pulsador 6
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('6');
unidades=6;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('6');
decenas=6;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('6');
centenas=6;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('6');
milesimas=6;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 9: // Rutina de atención al pulsador 9
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('9');
unidades=9;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('9');
decenas=9;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('9');
centenas=9;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('9');
milesimas=9;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;

case 2: // Rutina de atención al pulsador 2


if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('2');
unidades=2;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('2');
decenas=2;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('2');
centenas=2;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('2');
milesimas=2;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 6: // Rutina de atención al pulsador 5
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('5');
unidades=5;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('5');
decenas=5;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('5');
centenas=5;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('5');
milesimas=5;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 10: // Rutina de atención al pulsador 8
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('8');
unidades=8;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('8');
decenas=8;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('8');
centenas=8;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('8');
milesimas=8;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 14: // Rutina de atención al pulsador 0
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('0');
unidades=0;
posicion=4;
}

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('0');
decenas=0;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('0');
centenas=0;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('0');
milesimas=0;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 3: // Rutina de atención al pulsador 1
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('1');
unidades=1;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('1');
decenas=1;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('1');
centenas=1;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('1');
milesimas=1;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 7: // Rutina de atención al pulsador 4
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('4');
unidades=4;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('4');
decenas=4;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('4');
centenas=4;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('4');
milesimas=4;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 11: // Rutina de atención al pulsador 7
if(posicion==3){
lcd_gotoxy(14,2); // Direccionamos la RAM de la LCD
lcd_putc('7');
unidades=7;
posicion=4;

if(posicion==2){
lcd_gotoxy(13,2); // Direccionamos la RAM de la LCD
lcd_putc('7');
decenas=7;
posicion=3;
}

if(posicion==1){
lcd_gotoxy(11,2); // Direccionamos la RAM de la LCD
lcd_putc('7');
centenas=7;
posicion=2;
}

if(posicion==0){
lcd_gotoxy(10,2); // Direccionamos la RAM de la LCD
lcd_putc('7');
milesimas=7;
posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
}

if(NTec!=16){ // Si se oprimió algún pulsador


delay_ms(280);
}

void promedio(){
int16 aux5;
LeerSenal();
aux5=Valor;
delay_ms(100);
LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);
LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

LeerSenal();
aux5=aux5+Valor;
delay_ms(100);

aux5=aux5/17;

Valor=aux5;
}

//////////////////////////////////////////////////////////////////////////////////////
// PROGRAMA PRINCIPAL //
//////////////////////////////////////////////////////////////////////////////////////

void main() {
IniPuertos();
IniConversorAD();
IniPantallaLCD();
while (true){
if (indicador==0){

NTec= LeerTeclado(); // En NTec queda el código del pulsador


// oprimido o 16 si ninguno se oprimió

ProcesarTeclado();
delay_ms(200);
promedio();
ProcesarSenal(); // Función encargada de manipular el procesar el dato adquirido
VisualizaLCD();

if (Voltaje>superior){
lcd_gotoxy(1,1); // Direccionamos la RAM de la LCD
lcd_putc("ALERTA SUPERIOR");
}

else if (Voltaje<inferior){
lcd_gotoxy(1,1); // Direccionamos la RAM de la LCD
lcd_putc("ALERTA INFERIOR");
}
else {
lcd_gotoxy(1,1); // Direccionamos la RAM de la LCD
lcd_putc("*CONVERSION A/D*");
}

}
else if(indicador==1){
lcd_putc("\f"); // Borrar Pantalla
lcd_putc("*LIMIT SUPERIOR*\n");
lcd_putc("Tempera= 00.00gr");
indicador=2;
}

else if(indicador==2){
NTec= LeerTeclado(); // En NTec queda el código del pulsador
// oprimido o 16 si ninguno se oprimió
ProcesarTeclado1();
}
else if (indicador==3){
lcd_putc("\f"); // Borrar Pantalla
lcd_putc("*LIMIT INFERIOR*\n");
lcd_putc("Tempera= 00.00gr");
indicador=4;
}

else if (indicador==4){
NTec= LeerTeclado(); // En NTec queda el código del pulsador
// oprimido o 16 si ninguno se oprimió
ProcesarTeclado1();
}
delay_ms(200);

}
}

También podría gustarte