El bloqueo basado en contraseña para cualquier sistema de control de acceso es muy común hoy en día. Si hay un bloqueo con contraseña para cualquier portón/puerta, el portón o puerta solo se abrirá cuando se ingrese la contraseña correcta. Básicamente, en dicho sistema se proporciona un teclado numérico para ingresar la contraseña. El bloqueo de código secuencial se diferencia aquí del sistema de bloqueo de contraseña normal. No tiene un teclado numérico completo con 10 a 12 teclas. En cambio, sólo tiene de 2 a 3 interruptores. El usuario deberá ingresar la secuencia correcta de dígitos numéricos, así como los bloqueos secuenciales disponibles en las carpetas. Cuando los dígitos numéricos están ordenados en la secuencia correcta, se desbloquea.
En este proyecto, el usuario primero debe configurar la secuencia correcta de dígitos desplazándolos del 0 al 9 presionando solo 1 botón, similar al desplazamiento y configuración de dígitos en el bloqueo de carpeta. El usuario debe definir todos los dígitos uno por uno para completar el código secuencial. El proyecto se construye utilizando el microcontrolador AT89C52. Utiliza LCD para mostrar varios mensajes. El motor paso a paso se utiliza para ilustrar la apertura y el cierre de la puerta.
Descripción del circuito

Fig. 1: Diagrama de circuito del sistema de bloqueo de código secuencial basado en microcontrolador 8051
El puerto P1 está configurado como entrada y 3 botones están conectados a los pines P1.0 a P1.2, por lo que cuando se presiona el botón, el pin obtiene 0 como entrada
· El puerto P0 es un puerto de salida y controla los pines de datos del LCD D0 – D7. Otros dos pines del puerto P2, P2.7 y P2.6, están conectados a los pines de control del LCD Rs y E. El tercer pin de control RW está permanentemente conectado a tierra para que el LCD siempre esté habilitado para escritura.
· Un potenciómetro de 1K está conectado al pin de control de brillo Vee de la pantalla LCD para variar su brillo.
· Puerto P3, pines P3.4 – P3.7, impulsa el motor paso a paso a través del chip controlador del motor ULN2003A. El motor abre o cierra la puerta.
· Un cristal de 12 MHz está conectado entre los pines XTAL junto con dos condensadores de polarización de 33 PF. Proporciona señal de reloj al microcontrolador.
Operación del circuito:
· Cuando el sistema está encendido, la puerta se cierra y se muestra el mensaje en la pantalla LCD como "Para abrir la puerta, ingrese el código"
· Para ingresar el código, el usuario debe presionar la tecla numérica. Tiene que seguir presionando la tecla numérica nuevamente para desplazar todos los dígitos del 1 al 0. Al igual que presionar la tecla una vez mostrará el dígito 1, presionar la tecla dos veces mostrará el dígito 2, de manera similar 3, 4, 5,….. arriba a 0 y nuevamente comienza desde 1
· Una vez que llegue al dígito deseado, para definir el dígito debe presionar el segundo botón para definir el dígito como el 1er dígito del código. Después de configurar el primer dígito, el cursor cambia a la posición del segundo dígito.
· Nuevamente el usuario tiene que desplazarse por los dígitos comenzando desde 1 y llegar al dígito deseado usando el primer botón . Configure el segundo dígito del código presionando 2 y el botón
· Asimismo, el usuario deberá definir un código de 4 dígitos. Después de configurar el código de 4 dígitos, el usuario presionará el botón Enter
· Cuando se presiona el botón Enter, el microcontrolador comparará el código ingresado con el código programado
· Si coinciden, el motor gira en el sentido de las agujas del reloj para abrir la puerta y el mensaje se muestra en la pantalla LCD como "puerta abierta". Después de 5 segundos nuevamente, el motor gira en sentido antihorario para cerrar la puerta y la pantalla LCD muestra "puerta cerrada" y luego nuevamente se muestra el mensaje estándar "Para abrir la puerta, ingrese el código".
· Pero si el código no coincide, el motor se detiene y se muestra el mensaje de advertencia como "código incorrecto". Además, si se ingresa el código incorrecto 3 veces, el sistema entra en un bucle infinito (esto significa que falla). Puede salir del bucle solo cuando se presiona el botón de reinicio para reiniciar el sistema nuevamente.
Código fuente del proyecto
###
#incluir#incluir
#definir EN 0
#definir APAGADO 1
bits rs = P2 ^ 7;
sbit es = P2^6;
bit unlock_led = P2^0;
bit lock_led = P2^1;
unsigned int number_count=0,code_num(4),code_digit=0,set_count=0,gate_flag=0;
unsigned int code_lock_num = 1122, intento = 0, reset_flag = 0;
vacío
{
int y, z;
para(z=0;z<100;z++)
para(y=0;y<1000;y++);
}
retardo_motor vacío
{
intp;
para(p=0;p<2000;p++);
}
vacío esperar_5_seg
{
intr,s;
para(r=0;r<100;r++)
para(s=0;s<10000;s++);
}
retardo_lcd vacío
{
interno;
para(y=0;y<2000;y++);
}
void writecmd (carácter sin firmar a)
{
lcd_delay;
r = 0;
P0 = uno;
en = 1;
en = 0;
}
void writedat (carácter sin firmar b)
{
lcd_delay;
r = 1;
P0=b;
en = 1;
en = 0;
}
void writetr(caracteres sin firmar *s)
{
carácter sin firmar l,i;
i = strlen(s);
para (l=0;l
{
fecha de escritura(*s);
s++;
}
}
lcd_init vacío
{
escribircmd(0x3C);
escribircmd(0x0E);
escribircmd(0x01);
writetr("Para abrir la puerta");
escribircmd(0xC0);
writestr("Ingrese el código:");
}
inicialización nula
{
P1=0xFF;
P0=0x00;
P2 = 0x00;
P3 = 0x00;
}
puerta_abierta vacía
{
int sin firmar yo;
escribircmd(0x01);
writetr("Puerta abierta");
para(i=0;i<128;i++)
{
P3 = 0x8F;
retraso_motor;
P3 = 0x4F;
retraso_motor;
P3 = 0x2F;
retraso_motor;
P3 = 0x1F;
retraso_motor;
}
esperar_5_seg;
escribircmd(0x01);
writetr("Puerta cerrada");
para(i=0;i<128;i++)
{
P3 = 0x1F;
retraso_motor;
P3 = 0x2F;
retraso_motor;
P3 = 0x4F;
retraso_motor;
P3 = 0x8F;
retraso_motor;
}
}
numero vacio
{
if(set_count==0) writecmd(0xCB);
de lo contrario, si (set_count==1) writecmd(0xCC);
si no, if(set_count==2) writecmd(0xCD);
si no, if(set_count==3) writecmd(0xCE);
número_cuenta++;
if(count_number==1) {writedat(0x31);}
else if(number_count==2) {writedat(0x32);}
else if(number_count==3) {writedat(0x33);}
else if(number_count==4) {writedat(0x34);}
else if(number_count==5) {writedat(0x35);}
else if(number_count==6) {writedat(0x36);}
else if(number_count==7) {writedat(0x37);}
else if(number_count==8) {writedat(0x38);}
else if(number_count==9) {writedat(0x39);}
else if(number_count==10){writedat(0x30);number_count=0;}
}
número_conjunto vacío
{
set_count++;
núm_código(código_dígito)=número_conteo;
número_cuenta=0;
código_dígito++;
}
anular ingresar_número
{
int tmp sin firmar;
tmp= núm_código(0)*1000+núm_código(1)*100+núm_código(2)*10+núm_código(3);
si(tmp == código_lock_num)
{
desbloquear_led = ENCENDIDO;
lock_led = APAGADO;
puerta abierta;
bandera_puerta=1;
set_count=0;
código_dígito=0;
intento=0;
}
otro
{
escribircmd(0x01);
writetr("código incorrecto");
intento++;
si(intento==3)
{
escribircmd(0x01);
writetr("intentos cerrados");
escribircmd(0xC0);
writetr("Sistema bloqueado");
restablecer_flag=1;
}
otro
{
escribircmd(0xC0);
writetr("inténtalo de nuevo");
bandera_puerta=1;
set_count=0;
código_dígito=0;
}
}
}
vacío principal
{
inicializar;
nuevamente: lcd_init;
bandera_puerta=0;
desbloquear_led = APAGADO;
lock_led = ENCENDIDO;
retorno: P1=0xFF;
mientras(P1==0xFF);
interruptor (P1)
{
caso 0xFE:
número;
dly;
romper;
caso 0xFD:
número_establecido;
dly;
romper;
caso 0xFB:
insertar números;
dly;
romper;
}
if(reset_flag==1) llega al infinito;
de lo contrario, si (gate_flag==0) regresa;
de lo contrario, vaya de nuevo;
infinito:mientras(1);
}
###
Diagramas de circuito
| Diagrama de circuito-8051-Sistema de bloqueo de código secuencial basado en microcontrolador | ![]() |
