DIAGRAMA DE BLOQUES
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.
ANEXO
CODIGO DEL TRANSMISOR
#include <16F877A.h>
#device ADC=10
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(){
//////////////////////////////////////////////////////////////////////////////////////
//
PROGRAMA PRINCIPAL
//
//////////////////////////////////////////////////////////////////////////////////////
void main() {
IniPuertos();
IniConversorAD();
centro=520;
maximo=centro+25;
minimo=centro-25;
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
}
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
}
}
}
}
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);
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){
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;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('3');
milesimas=3;
posicion=1;
}
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;
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;
}
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;
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;
}
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;
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;
}
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;
}
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;
posicion=2;
}
if(posicion==0){
lcd_gotoxy(10,2);
lcd_putc('1');
milesimas=1;
posicion=1;
}
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;
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;
}
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);
}
}