Site hosted by Angelfire.com: Build your free website today!
  [Anterior] [Indice] [Siguiente]

 

II. ALARMA CON ENCEDIDO DE BOMBILLAS

 

Este proyecto consiste en dos bombillas, una de las cuales se prende, dependiendo de si la clave que se ingrese es válida o no. Para el ingreso de la clave se utilizaron dos métodos distintos:

El primero fue mediante un dip switch y el otro mediante un teclado de membrana de 16 teclas.

A continuación detallamos cada uno, haciendo la salvedad de que en cada diagrama esquematico se ve el circuito correspondiente conectado directamente al puerto, lo que no es del todo válido, ya que se utilizo como interface entre el puerto del computador y el circuito de aplicación, la tarjeta detallada en el númeral anterior. Se omitio en el dibujo la tarjeta por facilidad para entender las conexiones, pero en el software realizado se tuvo en cuenta las conexiones de la tarjeta.

 

II.I. Con dip switch

El esquematico de este montaje se aprecia en la figura 4.

Figura 4.

 

El primer paso a realizar en lo que se refiere al software, tanto para el disño con dip switch como con teclado, es generar un archivo que guarde con antelación las claves válidas de acceso. Este archivo se generamos con el rpograma que se detalla a continuación, elaborado en C++.

//Escritura del archivo que guarda las claves.

#include <iostream.h>

#include <fstream.h>

#include <stdlib.h>

#include <conio.h>

 

main()

{ clrscr();

ofstream archsal("c:\\claves.dat", ios::out);

if(!archsal){

cerr<<"Error: no se puede abrir archivo de salida"<<endl;

exit(1);

}

cout <<"Escriba Apellido, Nombre y clave: "<<endl;

char apellido[20], nombre[20], clave[4];

cout<<"\t1:";

int n=1;

while(cin>>nombre>>apellido>>clave){

archsal<<nombre<<" "<<apellido<<" "<<clave<<endl;

cout<<"\t"<<++n<<":";

}

archsal.close();

return 0;

}

 

El anterior programa crea un archivo (claves.dat) en donde se guardan nombre, apellido y clave de las personas autorizadas. Cabe anotar que en este caso en que se utiliza dip switch, las claves tan solo pueden ser númericas y no contener ningun carácter; otra limitación se presenta con el hecho de que tan solo es posible ingresar un nombre y un solo apellido, es decir si se introduce un nombre compuesto, el programa toma el segundo nombre como el apellido, y el apellido quedaria reseñado como clave, por lo que se generaria un problema a la hora de la ejecución.

Cabe anotar que debido al registro de entrada, cuentan como entradas validas los siguientes números en valor hexadecimal: 10, 20, 30, 40, 50, 60, 70, 80 ,......, FF.

A continuación se detalla el programa general, el cual llee la clave del dip switch, y determina de acuerdo a las que han sido generadas con anterioridad, si la clave ingresada es válida o no; de serlo se prendera uno de los bombillos, si no se prendera el otro bombillo.

//Programa de claves usando DIP-SWITCH

 # include <iostream.h>

# include <dos.h>

# include <conio.h>

# include <stdlib.h>

# include <fstream.h>

# include <string.h>

# include <stdio.h>

 

void clave();

 

int puerto=0x378;

 

main()

{

char op;

do{

clrscr();

gotoxy(35,3);cout<<".CLAVES.";

gotoxy(25,10);cout<< "(A).Continuar";

gotoxy(25,12);cout<< "(B).Salir";

gotoxy(25,16);

cout<< "ELIJA LA OPCION DESEADA:";

op=getche();

if(op=='A')

clave();

}while (op!='B');

return 0;

}

 

void clave()

{ clrscr();

int resp, clavel, aux=0;

char apellido[20], nombre[20];

outportb(puerto+2,0x08);

resp=inportb(puerto+1)&&0xF0;

ifstream archen("c:\\claves.dat", ios::in);

if(!archen){

cerr<<"Error: no se puede abrir archivo de entrada"<<endl;

exit(1);

}

while(archen>>nombre>>apellido>>clavel){

if(clavel==resp){

gotoxy(25,3);

cout<<"Clave acertada perteneciente a "<<nombre

<<" "<<apellido<<endl;

archen.close();

outportb(puerto+2,0x01);

outportb(puerto, 0x02);

delay(1000);

gotoxy(25,16);

cout<<"Oprima cualquier tecla para continuar";

outportb(puerto+2,0x8);

getch();aux=1;

}

}

if(aux!=1){

archen.close();

clrscr();

gotoxy(30,3);cout<<"La clave digitada no es correcta"<<endl;

outportb(puerto+2,0x1);

outportb(puerto,0x01);

delay(1000);

outportb(puerto+2,0x4);

cout<<clavel<<" "<<resp<<endl;

gotoxy(25,16);

cout<<"Oprima cualquier tecla para continuar";

getch();

}

}

 

Todo el procedmiento detallado anteriormente fue probado y funciono sin ningún problema

 

 

II.II. Con teclado de membrana

 Este montaje difiere del anterior tan solo en que utiliza en vex del dip switch, unteclado de membrana de 16 teclas. Al usar este teclado ahora es posible tener claves de 4 digitos que incluyan los numeros del 1 al 9, y las letras de la A a la F. Cabe anotar el programa mencionado con anterioridad para generar las claves es el mismo, por lo tanto omitimos su escritura.

El esquematico de este montaje se aprecia en la figura 5, que se muestra a continuación.

 

Figura 5.

 

El programa general que se ejecuta para este tipo montaje permite se detalla a continuación.

# include <iostream.h>

# include <dos.h>

# include <conio.h>

# include <stdlib.h>

# include <fstream.h>

# include <string.h>

# include <stdio.h>

 

 

char opcion1(int );

char opcion2(int );

char opcion3(int );

char opcion4(int );

void clave();

 

int puerto=0x378;

 

main()

{

char op, resultado[5];

 

do{

clrscr();

gotoxy(35,3);cout<<".CLAVES.";

gotoxy(25,10);cout<< "(A).Continuar";

gotoxy(25,12);cout<< "(B).Salir";

gotoxy(25,16);

cout<< "ELIJA LA OPCION DESEADA:";

op=getche();

if(op=='A')

 

 

 

clave();

}while (op!='B');

return 0;

}

 

void clave()

{ clrscr();

int filas, j=0, i, resp, aux=0;

char clavel[5], apellido[20], nombre[20], clave[4];

gotoxy(15,3);

cout<<"Usando el teclado externo digite su clave de 4 digitos"<<endl;

do{

for(i=0; i<9;i=i*2){

outportb(puerto+2,0x01);

outportb(puerto,0x01*i);

outportb(puerto+2,0x08);

filas=inportb(puerto+1)&&0xF0;

 

if(filas!=0){

switch(i){

case 1:

clavel[j]=opcion1(filas);

j++;

break;

case 2:

clavel[j]=opcion2(filas);

j++;

break;

case 4:

clavel[j]=opcion3(filas);

j++;

break;

case 8:

clavel[j]=opcion4(filas);

j++;

break;

default:

break;

}

if(j==3){

clavel[4]='\0';

j++;

}

}

}

}while(j<4);

 

clrscr();

ifstream archen("a:\\claves.dat", ios::in);

if(!archen){

cerr<<"Error: no se puede abrir archivo de entrada"<<endl;

exit(1);

}

while(archen>>nombre>>apellido>>clave){

resp= strncmp(clave, clavel, 4);

if(resp==0){

gotoxy(25,3);

cout<<"Clave acertada perteneciente a "<<nombre

<<" "<<apellido<<endl;

archen.close();

outportb(puerto+2, 0x02);

outportb(puerto, 0x01);

 

 

delay(1000);

gotoxy(25,16);

cout<<"Oprima cualquier tecla para continuar";

outportb(puerto+2,0x08);

getch();

aux=1;

}

}

if(aux!=1){

archen.close();

gotoxy(30,3);

cout<<"La clave digitada no es correcta"<<endl;

outportb(puerto+2, 0x02);

outportb(puerto,0x02);

delay(1000);

gotoxy(25,16);

cout<<"Oprima cualquier tecla para continuar";

outportb(puerto, 0x04);

getch();

}

}

 

 

char opcion1(int cruce)

{

char valida;

switch(cruce){

case 10:

valida='0';

break;

case 20:

valida='4';

break;

case 40:

valida='8';

break;

case 80:

valida='C';

break;

default:

break;

}

return valida;

}

 

char opcion2(int cruce)

{

char valida;

switch(cruce){

case 10:

valida='1';

break;

case 20:

valida='5';

break;

case 40:

valida='9';

break;

case 80:

valida='D';

break;

default:

break;

 

 

 

 

}

return valida;

}

 

char opcion3(int cruce)

{

char valida;

switch(cruce){

case 10:

valida='2';

break;

case 20:

valida='6';

break;

case 40:

valida='A';

break;

case 80:

valida='E';

break;

default:

break;

}

return valida;

}

 

char opcion4(int cruce)

{

char valida;

switch(cruce){

case 10:

valida='3';

break;

case 20:

valida='7';

break;

case 40:

valida='B';

break;

case 80:

valida='F';

break;

default:

break;

}

return valida;

}

 

 

El anterior programa resulta extenso debido a que hay que proguntar por cada una de las teclas una vez que se detecta un contacto sobre ellas. El programa que se da para el caso de usar teclado membrana, requiere aun ser revisado ya que depende de la forma en que este configurado el teclado, así como de la forma en que éste sea conectado.

 

 

  [Anterior] [Indice] [Siguiente]