Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Sistema de Control

Descargar como doc, pdf o txt
Descargar como doc, pdf o txt
Está en la página 1de 3

Sistema de control de acceso

Bayron Steward Maldonado Gomez 1094285833

Juan Sebastian Ramirez Clavijo 1122145071


3) Montaje

I. INTRODUCCION

E n este documento veremos el código para poder lograr un


sistema de control de acceso utilizando un microcontrolador
PIC16F877A, trabajando con un teclado matricial, un motor
paso a paso, y una pantalla LCD.

II. PROCEDIMIENTO PARA EL ENVIÓ DEL TRABAJO


1) Objetivo : Implementar un sistema que habilite el
acceso a un usuario a través de una clave numérica. La 4) Código : Anexo # 1
contraseña debe ser introducida por medio de un teclado 5) Timer0 Tabla para lograr 5seg con el timer0
matricial. El sistema debe contar con un display Lcd que
permita al usuario interactuar con el funcionamiento del Escala
sistema. Cuando la contraseña numérica es correcta, el 2 2499744
acceso es ejecutado activando el giro de un motor paso a 4 1249744
paso hasta activar un final de carrera que indica que la 8 624744
puerta llego a su límite, en ese instante el giro del motor 16 312244
es pausado durante 5 segundos (Tiempo necesario para el 32 155994
usuario finalizar su acceso). Después de trascurrir ese
64 77869
tiempo, el giro del motor es invertido hasta llegar a su
posición inicial, indicada por el accionamiento de un final
de carrera que se activa cuando la puerta esta cerrada. Si
6) IX. CONCLUSIÓN
llega a suceder un caso de intento de ingresar con
contraseña equivocada encender una alarma durante 2
El microcontrolador pic16f877a tiene bastantes usos, acá se
segundos.
2) Materiales: - PIC16F877A pudo apreciar como utilizar las interrupciones por RB y así
- Motor paso a paso como las interrupcioens por TImer0
- Teclado matricial
- LCD
- 2 Resistencia 1k
- 4 Resistencia 10k
- Capacitor 1uf
- 2 Capacitor 20pf
- Crystal de 4MHz

Anexo # 1
#define RS RD2
#define EN RD3
 #define D4 RD4
#define D5 RD5 __delay_ms(5000);
#define D6 RD6 //TMR0IE=1;
#define D7 RD7 con=0;
Lcd_Clear();
#include <stdio.h> Lcd_Set_Cursor(1,1);
#include <stdlib.h> Lcd_Write_String("Cerrando... ");
#include <xc.h> while(cerrada != 1){
#define _XTAL_FREQ 4000000 PORTC=(IZQ[con]);
#include "lcd.h" for(int c=0;c<500;c++){

}
con++;
if(con>=4){con=0;}
// CONFIG }
#pragma config FOSC = XT // Oscillator Selection bits (HS oscillator) Lcd_Clear();
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT Lcd_Set_Cursor(1,1);
disabled) Lcd_Write_String("Profe no se pudo ");
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT Lcd_Set_Cursor(2,1);
disabled) Lcd_Write_String("con el timer :( ");
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR }
disabled) }
#pragma config LVP = OFF // Low-Voltage (Single-Supply) In-
Circuit Serial Programming Enable bit (RB3 is digital I/O, HV on MCLR void alarma(){
must be used for programming) RC7 = 1;
#pragma config CPD = OFF // Data EEPROM Memory Code __delay_ms(2000);
Protection bit (Data EEPROM code protection off) RC7 = 0;
#pragma config WRT = OFF // Flash Program Memory Write }
Enable bits (Write protection off; all program memory may be written to
by EECON control) void Teclado_EsperaDejePulsar(void){
#pragma config CP = OFF // Flash Program Memory Code const unsigned char Puerto_init = 0b11110000; //este es el valor que debe
Protection bit (Code protection off) tener el KEY_PORT cuando no se presione boton alguno.
unsigned char a;
/* PORTB = Puerto_init;
* while (1)
*/ {
//Variables teclado __delay_ms(20);
unsigned int tecla = 0; a = PORTB;
int i = 0,comparar = 0, reset = 0; if (Puerto_init == a)
int clave_ingresada[4] = {0,0,0,0} ; break;
int clave[4] = {6,4,2,7} ;
//Variables motor }
int con=0, abierta=0, cerrada = 0; }
unsigned int Num_desbordes=624744, Contador_desbordes=0;
int DERE[4]={ 0b1100,0b0110,0b0011,0b1001}; //Secuencia int int_teclado(){
Unipolar dos Pasos, hacia la Derecha int valor=0;
//y Secuencia Bipolar Paso Normal, while(1){
hacia la Derecha if(RB7==0){
PORTB = 0b0001;
int IZQ[4]={ 0b1001,0b0011,0b0110,0b1100}; //Secuencia if(RB7==1){reset = 1;break;}
Unipolar dos Pasos, hacia la Izquierda PORTB = 0b0010;
//y Secuencia Bipolar Paso Normal, if(RB7==1){abierta=1;break;}
hacia la Derecha PORTB = 0b0100;
//Variables if(RB7==1){cerrada=1;break;}
PORTB = 0b1000;
if(RB7==1){valor=0;break;}
void Abrir_puerta(){ }else{
con=0; if(RB6==0){
Lcd_Clear(); PORTB = 0b0001;
Lcd_Set_Cursor(1,1); if(RB6==1){valor=9;break;}
Lcd_Write_String("Abriendo... "); PORTB = 0b0010;
while(abierta != 1){ if(RB6==1){valor=6;break;}
PORTC=(DERE[con]); PORTB = 0b0100;
for(int c=0;c<500;c++){ if(RB6==1){valor=3;break;}
PORTB = 0b1000;
} if(RB6==1){valor=0;break;}
con++; }else{
if(con>=4){con=0;} if(RB5==0){
} PORTB = 0b0001;
Lcd_Clear(); if(RB5==1){valor=8;break;}
Lcd_Set_Cursor(1,4); PORTB = 0b0010;
Lcd_Write_String("Por favor "); if(RB5==1){valor=5;break;}
Lcd_Set_Cursor(2,3); PORTB = 0b0100;
Lcd_Write_String("ingrese... "); if(RB5==1){valor=2;break;}
PORTB = 0b1000;
if(abierta == 1){ if(RB5==1){valor=0;break;}
}else{ Lcd_Write_String("Clave incorrecta");
if(RB4==0){
PORTB = 0b0001; alarma();
if(RB4==1){valor=7;break;} }
PORTB = 0b0010; i=0;
if(RB4==1){valor=4;break;} }
PORTB = 0b0100;
if(RB4==1){valor=1;break;} }
PORTB = 0b1000; PORTB = 0B11110000;
if(RB4==1){valor=0;break;}
} if(TMR0IF == 0){ //Pregunta si la interrupcion fue por TMR0
} if(abierta == 1){
} if(Contador_desbordes <= Num_desbordes){
} Contador_desbordes++;
} Lcd_Clear();
Lcd_Set_Cursor(1,1);
return valor; Lcd_Write_String("Esperando... ");
RC5=1;
} }else{
RC7=1;
void interrupt interrupciones()
{ while(cerrada != 1){
GIE = 0; PORTC=(IZQ[con]);
if(INTF == 1) //Pregunta si la interrupcion fue por RB0 for(int c=0;c<500;c++){
{
}
} con++;
if(RBIF == 1) //Pregunta si la interrupcion fue por cambios en if(con>=4){con=0;}
RB }
{ Lcd_Clear();
Lcd_Set_Cursor(1,1);
if(i<4) Lcd_Write_String("Puerta cerrado ");
{
tecla=int_teclado(); abierta =0;
clave_ingresada[i++] = tecla; }
Lcd_Write_Int(tecla);
if(reset == 1){ }
Lcd_Clear(); }
Lcd_Set_Cursor(1,1);
Lcd_Write_String("Ingrese la clave: "); RBIF = 0;
Lcd_Set_Cursor(2,1); INTF = 0;
clave_ingresada[0] = 0; TMR0IF = 0;
clave_ingresada[1] = 0; GIE = 1;
clave_ingresada[2] = 0; }
clave_ingresada[3] = 0;
i=0; void main()
comparar = 0; {
reset=0; TRISB = 0B11110000;
} TRISC = 0B00000000;
Teclado_EsperaDejePulsar(); TRISD = 0B00000000;
} INTCON = 0B10001000;
if(i==4) OPTION_REG=0b10000010; //HABILITO PULL-UP EN
{ PUERTO B
if(clave_ingresada[0] == clave[0]) Lcd_Init();
{ Lcd_Clear();
if(clave_ingresada[1] == clave[1]) Lcd_Set_Cursor(1,1);
{ Lcd_Write_String("Ingrese la clave: ");
if(clave_ingresada[2] == clave[2]) Lcd_Set_Cursor(2,1);
{ PORTB=0B00000000;
if(clave_ingresada[3] == clave[3]) PORTC=0B00000000;
{
comparar=1; while(1){
} SLEEP();
} if(comparar == 1){
} Abrir_puerta();
} comparar = 0;
if(comparar == 1) if(abierta == 1){
{
Lcd_Clear(); }
Lcd_Set_Cursor(1,1); }
Lcd_Write_String("Clave correcta"); ]}
}else
{
Lcd_Clear();
Lcd_Set_Cursor(1,1);

También podría gustarte