O bloqueio baseado em senha para qualquer sistema de controle de acesso é muito comum hoje em dia. Se houver um bloqueio com senha para qualquer portão/porta, o portão ou porta só será aberto quando a senha correta for inserida. Principalmente em tal sistema o teclado numérico é fornecido para inserir a senha. O bloqueio de código sequencial difere aqui do sistema de bloqueio de senha normal. Não possui teclado numérico completo com 10 a 12 chaves. Em vez disso, possui apenas 2 a 3 interruptores. O usuário deve inserir a sequência correta de dígitos numéricos, assim como os bloqueios sequenciais disponíveis nas pastas. Quando os dígitos numéricos são organizados na sequência correta, ele é desbloqueado.
Neste projeto, o usuário deve primeiro definir a sequência correta de dígitos rolando-os de 0 a 9 pressionando apenas 1 botão, semelhante à rolagem e configuração de dígito na fechadura da pasta. O usuário deve definir todos os dígitos um por um para completar o código sequencial. O projeto é construído usando microcontrolador AT89C52. Ele usa LCD para exibir várias mensagens. O motor de passo é usado para ilustrar a abertura e o fechamento do portão.
Descrição do circuito
Fig. 1: Diagrama de circuito do sistema de bloqueio de código sequencial baseado em microcontrolador 8051
·A porta P1 está configurada como entrada e 3 botões estão conectados aos pinos P1.0 a P1.2, portanto, quando o botão é pressionado, o pino obtém 0 como entrada
· A porta P0 é uma porta de saída e aciona os pinos de dados do LCD D0 – D7. Outros dois pinos da porta P2 P2.7 e P2.6 estão conectados aos pinos de controle do LCD Rs e E. O terceiro pino de controle RW está permanentemente conectado ao terra para fazer com que o LCD sempre habilite gravação
· Um potenciômetro de 1 K é conectado ao pino de controle de brilho Vee do LCD para variar seu brilho
· A porta P3, pinos P3.4 – P3.7, aciona o motor de passo através do chip driver do motor ULN2003A. O motor abre ou fecha o portão
· Um cristal de 12 MHz é conectado entre os pinos XTAL junto com dois capacitores de polarização de 33 PF. Ele fornece sinal de relógio para o microcontrolador
Operação do circuito:
· Quando o sistema é ligado, o portão é fechado e a mensagem é exibida no LCD como “Para abrir o portão, digite o código”
· Para inserir o código o usuário deve pressionar a tecla numérica. Ele tem que continuar pressionando a tecla numérica novamente para rolar todos os dígitos de 1 a 0. Assim como pressionar a tecla uma vez exibirá o dígito 1, pressionar a tecla duas vezes exibirá o dígito 2, da mesma forma 3, 4, 5,….. até 0 e novamente inicia a partir de 1
· Assim que chegar ao dígito desejado, para definir o dígito ele deve pressionar o segundo botão para definir o dígito como 1st dígito do código. Depois de definir o primeiro dígito, o cursor muda para a posição do segundo dígito
· Novamente, o usuário deve rolar os dígitos começando em 1 e chegar ao dígito desejado usando 1st botão. Defina o segundo dígito do código pressionando 2e botão
· Da mesma forma, o usuário deve definir um código de 4 dígitos. Depois que o código de 4 dígitos for definido, o usuário pressionará o botão Enter
· Quando o botão Enter é pressionado, o microcontrolador irá comparar o código inserido com o código programado
· Se corresponderem, o motor gira no sentido horário para abrir o portão e a mensagem é exibida no LCD como “portão aberto”. Após 5 segundos novamente o motor gira no sentido anti-horário para fechar o portão e o LCD exibe “gate close” e então novamente a mensagem padrão “To open gate Enter code” é exibida
· Mas se o código não corresponder, o motor para e a mensagem de aviso é exibida como “código errado”. Além disso, se o código errado for inserido 3 vezes, o sistema entra em loop infinito (isso significa que ele trava). Ele pode sair do loop somente quando o botão reset é pressionado para reiniciar o sistema novamente.
Código fonte do projeto
###
#include#incluir
#define ON 0
#define DESLIGADO 1
sbit rs = P2 ^ 7;
sbit en = P2 ^ 6;
sbit unlock_led = P2^0;
sbit 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, tentativa = 0, reset_flag = 0;
void dly
{
int y,z;
para(z=0;z<100;z++)
para(y=0;y<1000;y++);
}
vazio motor_delay
{
intp;
para(p=0;p<2000;p++);
}
vazio wait_for_5_sec
{
int r,s;
para(r=0;r<100;r++)
for(s=0;s<10000;s++);
}
vazio lcd_delay
{
interno;
para(y=0;y<2000;y++);
}
void writecmd (caractere não assinado a)
{
lcd_delay ;
rs = 0;
P0 = uma;
en = 1;
en = 0;
}
void writedat (caractere não assinado b)
{
lcd_delay ;
rs = 1;
P0=b;
en = 1;
en = 0;
}
void writestr(caractere não assinado *s)
{
caractere não assinado l,i;
eu = strlen(s);
para (eu=0;eu
{
escreverdata(*s);
s++;
}
}
vazio lcd_init
{
escrevacmd(0x3C);
escrevacmd(0x0E);
escrevacmd(0x01);
writestr("Para abrir o portão");
escrevacmd(0xC0);
writestr("Digite o código:");
}
inicialização nula
{
P1=0xFF;
P0=0x00;
P2 = 0x00;
P3 = 0x00;
}
vazio open_gate
{
não assinado int i;
escrevacmd(0x01);
writestr("Portão aberto");
para(i=0;i<128;i++)
{
P3 = 0x8F;
atraso_motor ;
P3 = 0x4F;
atraso_motor ;
P3 = 0x2F;
atraso_motor ;
P3 = 0x1F;
atraso_motor ;
}
wait_for_5_sec ;
escrevacmd(0x01);
writestr("Portão fechado");
para(i=0;i<128;i++)
{
P3 = 0x1F;
atraso_motor ;
P3 = 0x2F;
atraso_motor ;
P3 = 0x4F;
atraso_motor ;
P3 = 0x8F;
atraso_motor ;
}
}
número vazio
{
if(set_count==0) writecmd(0xCB);
senão if (set_count==1) writecmd(0xCC);
senão if(set_count==2) writecmd(0xCD);
senão if(set_count==3) writecmd(0xCE);
número_contagem++;
if(número_contagem==1) {writedat(0x31);}
senão if(número_contagem==2) {writedat(0x32);}
senão if(número_contagem==3) {writedat(0x33);}
senão if(número_contagem==4) {writedat(0x34);}
senão if(número_contagem==5) {writedat(0x35);}
senão if(número_contagem==6) {writedat(0x36);}
senão if(número_contagem==7) {writedat(0x37);}
senão if(número_contagem==8) {writedat(0x38);}
senão if(número_contagem==9) {writedat(0x39);}
senão if(número_contagem==10){writedat(0x30);número_contagem=0;}
}
vazio set_number
{
set_contagem++;
code_num(código_dígito)=número_contagem;
número_contagem=0;
código_dígito++;
}
void enter_number
{
int não assinado tmp;
tmp= núm_código(0)*1000+núm_código(1)*100+núm_código(2)*10+núm_código(3);
if(tmp == código_lock_num)
{
desbloquear_led = LIGADO;
lock_led = DESLIGADO;
portão aberto ;
portão_flag=1;
set_count=0;
código_dígito=0;
tentativa=0;
}
outro
{
escrevacmd(0x01);
writestr("código errado");
tentativa++;
se(tentativa==3)
{
escrevacmd(0x01);
writestr("tentativas encerradas");
escrevacmd(0xC0);
writestr("Sistema travado");
reset_flag=1;
}
outro
{
escrevacmd(0xC0);
writestr("tente novamente");
portão_flag=1;
set_count=0;
código_dígito=0;
}
}
}
vazio principal
{
inicializar ;
novamente: lcd_init ;
portão_flag=0;
desbloquear_led = DESLIGADO;
lock_led = LIGADO;
voltar: P1=0xFF;
enquanto(P1==0xFF);
interruptor (P1)
{
caso 0xFE:
número ;
dly ;
quebrar;
caso 0xFD:
set_número ;
dly ;
quebrar;
caso 0xFB:
insira numeros ;
dly ;
quebrar;
}
if(reset_flag==1) vai para o infinito;
senão if(gate_flag==0) volta para trás;
senão vá para novamente;
infinito:enquanto(1);
}
###
Diagramas de circuito
Diagrama de circuito-8051-Sistema de bloqueio de código sequencial baseado em microcontrolador |