Vous êtes sur la page 1sur 13

Marco Terico

PIC 16F877A

El microcontrolador pertenece a la familia 16F87x, que son una conbinacin del PIC 16F84 y los recursos del PIC 16C73 y 74, incorpora la memoria FLASH, con capacidad de 4K u 8K. Tiene 5 puertos configurables a las necesidades, comunicacin serie, convertidor Analgo/Digital, comunicacin paralela y su alimentacin va en un rango de 3 a 5 volts. Este microcontrolador trabaja con varias frecuencias de entrada, siendo la mayor de 20 mega hertz, aunque internamente trabaja a un cuarto de frecuencia antes mencionada gracias a un divisor de frecuencia que ya esta contenido en el interior del PIC. La cantidad de corriente que estos dispositivos requiren es muy pequea y tienen un gran soporte y resistencia contra ciertos contaminantes del exterior, aunque si son sensibles al ruido externo causado por algunas componentes conectados a sus terminales.

Pic 16f84

Se trata de uno de los microcontroladores ms populares del mercado actual, ideal para principiantes, debido a su arquitectura de 8 bits, 18 pines, y un set de instrucciones RISC muy amigable para memorizar y fcil de entender, internamente consta de:

Memoria Flash de programa (1K x 14). Memoria EEPROM de datos (64 x 8). Memoria RAM (68 registros x 8). Un temporizador/contador (timer de 8 bits). Un divisor de frecuencia. Varios puertos de entrada-salida (13 pines en dos puertos, 5 pines el puerto A y 8 pines el puerto B).

Otras caractersticas son:


Manejo de interrupciones (de 4 fuentes). Perro guardin (watchdog). Bajo consumo. Frecuencia de reloj externa mxima 10MHz. (Hasta 20MHz en nuevas versiones). La frecuencia de reloj interna es un cuarto de la externa, lo que significa que con un reloj de 20Mhz, el reloj interno sera de 5Mhz y as pues se ejecutan 5 Millones de Instrucciones por Segundo (5 MIPS) No posee conversores analgicos-digital ni digital-analgicos. Pipe-line de 2 etapas, 1 para bsqueda de instruccin y otra para la ejecucin de la instruccin (los saltos ocupan un ciclo ms). Repertorio de instrucciones reducido (RISC), con tan solo 30 instrucciones distintas. 4 tipos distintos de instrucciones, orientadas a byte, orientadas a bit, operacin entre registros, de salto.

Propuesta del proyecto Diagrama de Bloques

Reloj

LCD
Pic
Actuador

Teclado

Reloj: El reloj ser construido a partir de un pic 16f84 de gama baja el cual tambin podr ser utilizado como dispositivo de almacenamiento externo si as fuera necesario.

Teclado: Se utiliz un teclado de PC. Pic: El Pic utilizado es el 16f877a que posee buenas prestaciones y posibilidad de comunicacin serial con lo que es posible controlar el teclado. LCD: LCD de 16*2 caracteres. Actuador: Es simulado mediante un LED. El costo aproximado se muestra a continuacin: Cantidad 1 1 1 1 Pieza Pic 16f877a Teclado Pic 16f84 Pantalla LCD Insumos Varios TOTAL Costo (Q) 80.00 20.00 50.00 160.00 50.00 360.00

Circuitos impresos

Placa para Pic 16f877a

Placa para Pic 16f84

Placa para adaptar el teclado Programacin Pic 16f877a


TRISD = %00000000 TRISB = %00000111 TRISC = %11111111 Dim todos_los_datos As Byte Dim paridadystop As Byte Dim paridad As Bit Dim stop As Bit Dim make_code As Byte Dim dato As Byte Dim pass1 As Byte Dim pass2 As Byte Dim pass3 As Byte Dim pass4 As Byte Dim pass5 As Byte Dim pass6 As Byte Dim i As Byte Dim in As Bit Dim hor As Byte Dim min As Byte Dim seg As Byte Dim recibif0 As Bit Dim recibidato As Bit Dim cuenta As Byte

Define LCD_BITS = 4 'allowed values are 4 and 8 - the number of data interface lines Define LCD_DREG = PORTD Define LCD_DBIT = 4 '0 or 4 for 4-bit interface, ignored for 8-bit interface Define LCD_RSREG = PORTD Define LCD_RSBIT = 2 Define LCD_EREG = PORTD Define LCD_EBIT = 0 Define LCD_RWREG = PORTD Define LCD_RWBIT = 1 Symbol ready = PORTB.2 Symbol clock = PORTB.0 Symbol data = PORTB.1 paridadystop = 0 hor = 0 min = 0 seg = 0 recibidato = 0 recibif0 = 0 INTCON.GIE = 1 OPTION.INTEDG = 0 INTCON.INTE = 1 sleepx: PORTB.7 = 0 Gosub hora Lcdinit Lcdcmdout LcdClear Lcdout " ", #hor, " : ", #min, " : " #seg WaitMs 10 If recibidato = 0 Then Goto sleepx cuenta = 0 retorno: Lcdcmdout LcdClear Lcdout " Bienvenido " WaitMs 400 Lcdcmdout LcdClear Lcdout " Ingrese " Lcdcmdout LcdLine2Home Lcdout " Contrasenia " WaitMs 100 dato = 0 i=0 ready = 0 recibidato = 0 While i <= 5 denuevo: If recibidato = 0 Then Goto denuevo 'si no recibi el Dato espera "osea espera a soltar la tecla"

Select Case i Case 0 pass1 = dato Case 1 pass2 = dato Case 2 pass3 = dato Case 3 pass4 = dato Case 4 pass5 = dato Case 5 pass6 = dato EndSelect recibidato = 0 'reseteo para proximo dato. i=i+1 Wend in = 0 'primer clave If pass1 = 28 Then If pass2 = 50 Then If pass3 = 33 Then If pass4 = 35 Then If pass5 = 36 Then If pass6 = 43 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.1" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'segunda clave If pass1 = 22 Then If pass2 = 30 Then If pass3 = 38 Then If pass4 = 37 Then If pass5 = 46 Then If pass6 = 54 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.2"

Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, ": ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'tercer clave If pass1 = 54 Then If pass2 = 46 Then If pass3 = 37 Then If pass4 = 38 Then If pass5 = 30 Then If pass6 = 22 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.3" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'cuarta clave If pass1 = 61 Then If pass2 = 62 Then If pass3 = 70 Then If pass4 = 69 Then If pass5 = 28 Then If pass6 = 50 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.4" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif

Endif Endif Endif Endif Endif 'quinta clave If pass1 = 50 Then If pass2 = 28 Then If pass3 = 69 Then If pass4 = 70 Then If pass5 = 62 Then If pass6 = 61 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.5" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'sexta clave If pass1 = 28 Then If pass2 = 50 Then If pass3 = 35 Then If pass4 = 33 Then If pass5 = 36 Then If pass6 = 43 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.6" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'septima clave If pass1 = 45 Then

If pass2 = 68 Then If pass3 = 58 Then If pass4 = 36 Then If pass5 = 45 Then If pass6 = 68 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.7" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'octava clave If pass1 = 22 Then If pass2 = 30 Then If pass3 = 38 Then If pass4 = 28 Then If pass5 = 50 Then If pass6 = 33 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.8" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'novena clave If pass1 = 22 Then If pass2 = 28 Then If pass3 = 30 Then If pass4 = 50 Then If pass5 = 38 Then If pass6 = 33 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.9"

Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif 'decima clave If pass1 = 33 Then If pass2 = 38 Then If pass3 = 50 Then If pass4 = 30 Then If pass5 = 28 Then If pass6 = 22 Then Gosub hora Lcdcmdout LcdClear Lcdout "Bienvenido No.10" Lcdcmdout LcdLine2Home Lcdout " ", #hor, " : ", #min, " : ", #seg PORTB.7 = 1 in = 1 WaitMs 1000 Goto sleepx Endif Endif Endif Endif Endif Endif If in = 0 Then Lcdcmdout LcdClear Lcdout " intentelo " Lcdcmdout LcdLine2Home Lcdout " de nuevo " cuenta = cuenta + 1 WaitMs 1000 Endif If cuenta = 3 Then Goto sleepx Goto retorno End '----------------------------------------------------------------------------------------------------------------------------- ------------------------------------'--------------------------------ESTA RUTINA SE ENCARGA DE LEER LO QUE EL TECLADO MANDA AL PIC SOLO LEE UN BYTE POR ESO NO QUIERO LOS BREAK_CODES-------------------

'----------------------------------------------------------------------------------------------------------------------------- ------------------------------------On Interrupt If data = 0 Then For todos_los_datos = 0 To 7 espero: If clock = 0 Then Goto espero espero2: If clock = 1 Then Goto espero2 make_code.7 = data If todos_los_datos < 7 Then make_code = ShiftRight(make_code, 1) Endif Next todos_los_datos For paridadystop = 0 To 1 espero3: If clock = 0 Then Goto espero3 espero4: If clock = 1 Then Goto espero4 If paridadystop = 0 Then paridad = data 'BIT PARIDAD If paridadystop = 1 Then stop = data 'BIT STOP Next paridadystop dato = make_code todos_los_datos = 0 paridadystop = 0

If recibif0 = 1 Then recibidato = 1 'Indico que ha llegao el dato que importa recibif0 = 0 Else If make_code = %11110000 Then recibif0 = 1 'si el pic lee F0 PONE LA BANDERA DE F0 A 1 Endif Endif INTCON.INTF = 0 Endif Resume hora: ready = 1 WaitMs 1 ready = 0 hor = PORTC WaitMs 10 espero8: If PORTC = 0 Then Goto espero8

min = PORTC WaitMs 30 espero9: If PORTC = 0 Then Goto espero9 seg = PORTC Return

Programacin Pic 16f84


AllDigital TRISA = %01000 TRISB = %00000000 Dim hora As Byte Dim minuto As Byte Dim segundo As Byte Symbol ready = PORTA.3 hora = 0 minuto = 0 segundo = 0 rereinicio: hora = 0 reinicio: minuto = 0 inicio: segundo = 0 While segundo < 60 If ready = 1 Then PORTB = hora WaitMs 25 PORTB = 0 PORTB = minuto WaitMs 30 PORTB = 0 PORTB = segundo WaitMs 30 PORTB = 0 Endif WaitMs 800 segundo = segundo + 1 Wend minuto = minuto + 1 If minuto > 59 Then

hora = hora + 1 If hora < 24 Then Goto reinicio Else Goto rereinicio Endif Endif Goto inicio

End

Las 10 claves validas de la cerradura son: 1. abcdef 2. 123456 3. 654321 4. 7890ab 5. ba0987 6. abdcef 7. romero 8. 123abc 9. 1a2b3c 10. c3b2a1