Documentos de Académico
Documentos de Profesional
Documentos de Cultura
JORGE ANGARITA
OBJETIVOS:
DIAGRAMA DE BLOQUES
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
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
#include <16F877A.h>
#device ADC=10
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#include <lcd.c>
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();
else {
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
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
}
}
}
}
#include <16F877A.h>
#device ADC=10
#include <DriverTec4x4.c>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#include <lcd.c>
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.
}
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);
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(){
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){
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;
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;
}
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){
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);
}
}