Página principal

Tesina de seminario


Descargar 0.55 Mb.
Página8/10
Fecha de conversión18.07.2016
Tamaño0.55 Mb.
1   2   3   4   5   6   7   8   9   10

3.3. PROYECTO3: CERRADURA ELECTRONICA

3.3.1 OBJETIVO.


Utilización de interrupción por cambio en los Pórticos para el ingreso de números.

Ingreso de datos en Memoria SRAM.

Se debe ingresar 5 valores por medio del teclado numérico, al coincidir con la clave guardada previamente en la Memoria EEPROM del AvrButterfly deberá activarse el Led que representa la apertura de la cerradura Electrónica.

3.3.2 ENUNCIADO


Elaborar en lenguaje C un programa que sea para apertura de una puerta electrónica, al ingresar la clave correcta se activara un led que simula la apertura de la puerta. Se debe implementar tres botones, correspondientes a los números 1,2,3.

3.3.3 ESQUEMA DEL PROYECTO.


Figura 3-12: diagrama de bloque de Cerradura Electrónica.


3.3.4 DIAGRAMA DE FLUJO DEL PROYECTO.


Figura 3-13: diagrama de flujo principal



Figura 3-14: diagrama de flujo de Interrupción.



Figura 3-15: diagrama de rutina Comparar datos.


3.3.5 CÓDIGO FUENTE.


/*

* TERCERO.c

*

* Created: 04/01/2012 15:08:57



* Author: Micro

*/
#include


#include

#include

#include

#include

#include

#include

#include
#define BOOL char
#define FALSE 0

#define TRUE (!FALSE)

#define NULL 0
#define AUTO 3
#define INDICADOR 3
#include "lcd_functions.h"

#include "lcd_driver.h"


#define pLCDREG_test (*(char *)(0xEC))
void GRABAR_DATOS(void);

void CONFIGURAR_PUERTOS(void);


void GUARDAR_DATOS_EN_EEPROM(void);

void HABILITAR_PCINT(void);

int COMPARA_CLAVE(void);

void INGRESAR_DATO_EN_ARRAY(char);

void LED_INDICADOR_FLASH(void);

//ALMACENAMOS CLAVE

char CLAVE_ORIGINAL[] = "12312";

//ARRAY PARA ALMACENAR CLAVE A INGRESAR

char CLAVE_INGRESADA[] = " ";

char REG_TEMP;

uint8_t INDICE;
//MENSAJE INICIAL

PGM_P MENSAJE1;

PGM_P MENSAJE2;

PGM_P MENSAJE3;


int main(void)

{

CONFIGURAR_PUERTOS();



LCD_Init();

HABILITAR_PCINT();

sei();

LCD_puts_f(PSTR("INICIO"),1);



INDICE = 0X00;

for (;;) {

if(COMPARA_CLAVE()){

//CLAVE INGRESADA ES CORRECTA

LCD_puts_f(PSTR("OK"),1);

PORTE = (1<<7); //APERTURA DE PUERTA

_delay_ms(800);

_delay_ms(800);

PORTE = (0<<7); //SE CIERRA EL CIRCUITO.

//BORRAMOS CALVE INGRESADA

CLAVE_INGRESADA[0] = ' ';

CLAVE_INGRESADA[1] = ' ';

CLAVE_INGRESADA[2] = ' ';

CLAVE_INGRESADA[3] = ' ';

CLAVE_INGRESADA[4] = ' ';

LCD_puts_f(PSTR("INICIO"),1);


}

//PRENDE Y APAGA EL LED INDICADOR DE FUNCIONAMIENTO ESTABLE

LED_INDICADOR_FLASH();

}

return 0;



}
void LED_INDICADOR_FLASH(void)

{

PORTD = PINB;



PORTB = (1<

_delay_ms(23);

PORTB = (0<

_delay_ms(23);

}

void GRABAR_DATOS(void)



{

//COMPROBAMOS QUE TECLA SE PRESIONO.

char SELECCION;

//VERIFICA SI SE PRECIONO TECLA 1

SELECCION = (~PINB & 0X01);

if(SELECCION == 0x01)

{

PORTE = (1<<4);



INGRESAR_DATO_EN_ARRAY('1');

}

//VERIFICA SI SE PRESIONO TECLA 2



SELECCION = (~PINB & 0X02);

if(SELECCION == 0x02)

{

PORTE = (1<<5);



INGRESAR_DATO_EN_ARRAY('2');

}

//VERIFICA SI SE PRESIONO TECLA 3



SELECCION = (~PINB & 0X04);

if(SELECCION == 0x04)

{

PORTE = (1<<6);



INGRESAR_DATO_EN_ARRAY('3');

}

//VERIFICA SI SE PRESIONO TECLA CENTRAL



SELECCION = (~PINB & 0X10);

if(SELECCION == 0x10)

{

//NINGUNA ACCION



}

}
//PUERTOS B0,B1,B2 COMO ENTRADA PARA TECLAS.

void CONFIGURAR_PUERTOS(void)

{

DDRD = 0XFF;



DDRE = 0XF3;

DDRB = 0X08;

PORTB = 0XF7;
}
//ALMACENA LOS DATOS EN LA MEMORIA EEPROM PARA TENERLOS

//DE RESPALDO

void GUARDAR_DATOS_EN_EEPROM()

{
eeprom_write_byte (0X00, CLAVE_ORIGINAL[0]);

eeprom_write_byte (0X01, CLAVE_ORIGINAL[1]);

eeprom_write_byte (0X02, CLAVE_ORIGINAL[2]);

eeprom_write_byte (0X03, CLAVE_ORIGINAL[3]);

eeprom_write_byte (0X04, CLAVE_ORIGINAL[4]);


}
//COMPARA CLAVE ALMACENADA CON CLAVE INGRESADA

int COMPARA_CLAVE(void)

{

if(strcmp(CLAVE_ORIGINAL,CLAVE_INGRESADA)==0)



return 1;

return 0;

}
//CONFIGURACION DE INTERRUPCIONES, TAMBIEN SE CONFIGURAN LAS BOTONERAS

//DE PORTB0, PORB1, PORB2

void HABILITAR_PCINT(void){

//HABILITACION DE INTERRUPCONES POR CAMBIO EN PORTICOS

EIMSK |= (1<

//HABILITACION INDIVIDUAL DE INTERRUPCION EN CADA BITS.

PCMSK0 |= (1<

//TECLA1, TECLA2, TECLA3, CENTRO, ARRIBA, ABAJO

PCMSK1 |= (1<

}
//INTERRUPCION POR CAMBIO EN LOS PORTICOS PB0

SIGNAL(SIG_PIN_CHANGE0)

{

PORTE = 0x01;//INDICADOR



//REDIRECIONAMOS

GRABAR_DATOS();

}
//INTERRUPCION POR CAMBIO EN LOS PORTICOS PB0

SIGNAL(SIG_PIN_CHANGE1)

{

PORTE = 0x02; //INDICADOR



GRABAR_DATOS();

}

//INGRESA DATO EN EL ARREGLO DE CLAVES



//ANTES MUEVE LOS DATOS UNA POSISION

void INGRESAR_DATO_EN_ARRAY(char temp_i)

{

if(INDICE == 0X00)LCD_puts_f(PSTR("X "),1);



if(INDICE == 0X01)LCD_puts_f(PSTR("XX "),1);

if(INDICE == 0X02)LCD_puts_f(PSTR("XXX "),1);

if(INDICE == 0X03)LCD_puts_f(PSTR("XXXX "),1);

if(INDICE == 0X04)LCD_puts_f(PSTR("XXXXX"),1);

CLAVE_INGRESADA[0]=CLAVE_INGRESADA[1];

CLAVE_INGRESADA[1]=CLAVE_INGRESADA[2];

CLAVE_INGRESADA[2]=CLAVE_INGRESADA[3];

CLAVE_INGRESADA[3]=CLAVE_INGRESADA[4];

CLAVE_INGRESADA[4]=temp_i;

INDICE++;

if(INDICE == 0X05) INDICE = 0X00;

}


1   2   3   4   5   6   7   8   9   10


La base de datos está protegida por derechos de autor ©espanito.com 2016
enviar mensaje