Sie sind auf Seite 1von 19

PROYECTO FINAL

TRANSMISION Y RECEPCIN INALMBRICA DE SEALES UTILIZANDO


MODULO SERIAL RS232 DEL MICROCONTROLADOR PIC16F877A

LINA ISABEL ENCISO SALAZAR


JORGE ANGARITA
OBJETIVOS:

Implementacin de mdulos de transmisin y recepcin inalmbrica.


Uso del conversor anlogo digital del MCU de 8 bits.
Implementacin de la tecnologa TTL (lgica transistor a transistor).

DIAGRAMA DE BLOQUES

Diagrama de Bloques del Transmisor

Diagrama de Bloques del Receptor

2. DESCRIPCIN DEL PROYECTO


El proyecto se divide en dos componentes: el transmisor, que consiste en un sistema de
recoleccin de una seal mediante un sensor, posteriormente una etapa de amplificacin, y
despus, se realiza una transformacin anloga a digital mediante el mdulo que viene integrado
en el microcontrolador PIC16F877A; el valor de esa transformacin se guardar en un registro de 8
bits para finalmente enviar dicho registro utilizando el mdulo de comunicaciones RS232 que esta
integrado en el mismo micro controlador y esa seal (que tiene niveles TTL) se ingresa a un
mdulo
transmisor RF. El anterior proceso se repite indefinidamente cada pocos milisegundos. La otra
etapa, el receptor inicia en un mdulo receptor inalmbrico, el cual recibe las seales del
transmisor y las convierte a niveles TTL, las cuales ingresan por el mdulo serial RS232 del otro
microcontrolador, es guardada como un registro, y luego, mediante una lgica definida, se toma la
decisin 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 comnmente en aplicaciones con motores DC. Finalmente se
conecta el motor que se desea controlar para la aplicacin elegida.

SIMULACION EL PROTEUS
Simulacin de lo que se debe ver en el montaje real en el receptor
U2(+VS)

LCD2
LM016L

U2

U1

2
3
4

LM35

5
6
7
8
9
10
1

OSC2/CLKOUT

RB1
RB2

RA0/AN0

RB3/PGM

RA1/AN1

RB4

RA2/AN2/VREF-/CVREF
RA3/AN3/VREF+

RB5
RB6/PGC

RA4/T0CKI/C1OUT

RB7/PGD

RA5/AN4/SS/C2OUT
RC0/T1OSO/T1CKI
RE0/AN5/RD
RE1/AN6/WR
RE2/AN7/CS

RC1/T1OSI/CCP2
RC2/CCP1
RC3/SCK/SCL
RC4/SDI/SDA

MCLR/Vpp/THV

RC5/SDO
RC6/TX/CK
RC7/RX/DT
RD0/PSP0
RD1/PSP1
RD2/PSP2
RD3/PSP3
RD4/PSP4
RD5/PSP5
RD6/PSP6
RD7/PSP7

33

34
35
36
37

38
39

40
15
16
17
18
23

D0
D1
D2
D3
D4
D5
D6
D7

RB0/INT

7
8
9
10
11
12
13
14

VOUT

OSC1/CLKIN

RS
RW
E

14

4
5
6

13

V SS
V DD
V EE

36.0

1
2
3

1
0
0
0

24
25
26
19
20
21
22
27
28
29
30

PIC16F877A

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

CONCLUSIONES:

La lgica transistor a transistor nos sirvi mucho en este caso para las seales de salida
TTL ya que se degradan rpidamente si no se transmiten a travs de circuitos
adicionales de transmisin

Gracias al integrado L293B permite realizar la inversin de giro de dos motores o arrancar
y parar cuatro motores por diferentes seales de entrada, como en este caso a las
variaciones de los ojos al mirar hacia diferentes lados; mediante los MCU solamente, es
difcil controlar los motores ya que entregan muy poca corriente, sin embargo estos
integrados ayudar a manipular fcilmente 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 informacin por un solo hilo, a diferencia de la comunicacin en
paralelo.

Los modulos RF facilitan la comunicacin de tipo serial entre dispositivos, mediante la


modulacin 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 resolucin


#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 analgica
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 seleccin de canal y la adquisicin.
Valor=read_adc(); // Adquisicin de la seal.
}

//////////////////////////////////////////////////////////////////////////////////////
//
PROGRAMA PRINCIPAL
//
//////////////////////////////////////////////////////////////////////////////////////
void main() {
IniPuertos();
IniConversorAD();
centro=520;
maximo=centro+25;
minimo=centro-25;

//se define umbral para derecha


//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 resolucin
#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 analgica
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 seleccin de canal y la adquisicin.
Valor=read_adc(); // Adquisicin de la seal.
}
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 dgitos a cdigo 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 lnea 2
lcd_putc("Tempera= 00.00gr");
}
void VisualizaLCD(){
lcd_gotoxy(10,2);
lcd_putc(Dig1);
lcd_putc(Dig2);

// Direccionamos la RAM de la LCD

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 funcin ejecuta la accin requerida por cada pulsador del teclado.
int8 i;
switch (NTec){
case 0:
// Rutina de atencin 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(){
teclado.
int8 i;
switch (NTec){

// Esta funcin ejecuta la accin requerida por cada pulsador del

case 12:
// Rutina de atencin 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 atencin 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);
lcd_putc('3');
decenas=3;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('3');
centenas=3;
posicion=2;

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('3');
milesimas=3;
posicion=1;
}

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 5:
// Rutina de atencin 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);
lcd_putc('6');
decenas=6;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('6');
centenas=6;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('6');
milesimas=6;
posicion=1;
}
if (posicion==4){
posicion==0;
}
break;

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

case 9:
// Rutina de atencin 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);
lcd_putc('9');
decenas=9;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('9');
centenas=9;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('9');
milesimas=9;
posicion=1;
}

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 2:
// Rutina de atencin 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);
lcd_putc('2');
decenas=2;

// Direccionamos la RAM de la LCD

posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('2');
centenas=2;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('2');
milesimas=2;
posicion=1;
}

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 6:
// Rutina de atencin 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);
lcd_putc('5');
decenas=5;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('5');
centenas=5;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('5');
milesimas=5;

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

posicion=1;
}

if (posicion==4){
posicion==0;
}
break;
case 10:
// Rutina de atencin 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);
lcd_putc('8');
decenas=8;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('8');
centenas=8;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('8');
milesimas=8;
posicion=1;
}

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 14:
// Rutina de atencin 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);
lcd_putc('0');
decenas=0;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('0');
centenas=0;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('0');
milesimas=0;
posicion=1;
}

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 3:
// Rutina de atencin 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);
lcd_putc('1');
decenas=1;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('1');
centenas=1;

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('1');
milesimas=1;
posicion=1;
}

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
case 7:
// Rutina de atencin 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);
lcd_putc('4');
decenas=4;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('4');
centenas=4;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('4');
milesimas=4;
posicion=1;
}
if (posicion==4){
posicion==0;
}
break;

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

case 11:
// Rutina de atencin 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);
lcd_putc('7');
decenas=7;
posicion=3;
}
if(posicion==1){
lcd_gotoxy(11,2);
lcd_putc('7');
centenas=7;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('7');
milesimas=7;
posicion=1;
}

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

// Direccionamos la RAM de la LCD

if (posicion==4){
posicion==0;
}
break;
}
if(NTec!=16){
// Si se oprimi algn 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 cdigo del pulsador
// oprimido o 16 si ninguno se oprimi
ProcesarTeclado();
delay_ms(200);
promedio();
ProcesarSenal(); // Funcin 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 cdigo 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 cdigo del pulsador
// oprimido o 16 si ninguno se oprimi
ProcesarTeclado1();
}
delay_ms(200);

}
}

Das könnte Ihnen auch gefallen