Alrededor de 51 microcontroladores, tubo digital en lenguaje C, 4*4 teclas, bloqueo de contraseña simple, ¡por favor ayuda!
Teclas de función
S6---S15 Teclas numéricas 0-9
S16--Cambiar contraseña S17--Cambiar contraseña Luego confirme
S18--Restablecer contraseña, restablecer S19--Cerrar bloqueo de contraseña
Contraseña inicial: 000000 Dígitos de contraseña: 6 dígitos
Nota: Se perdió la La contraseña establecida se perderá después de apagar la alimentación y la contraseña se restaurará a la contraseña inicial: 6 dígitos
Nota: Después de apagar la alimentación, la contraseña que se ha establecido se perderá y la contraseña se restaurará al 000000 original cuando se encienda la alimentación.
El LED de 8 bits conectado a P1 se ilumina para indicar que la cerradura está abierta y se apaga indica que la cerradura está bloqueada.
Función del programa: Este programa combina la función de memoria de la memoria 24C02, que se puede utilizar en caso de un corte de energía. Guarde la contraseña a continuación.
Cuando se ejecuta por primera vez, si no hay respuesta después de ingresar la contraseña original 000000, puede intentar eliminar la línea de comentarios frente al programa y eliminar una pequeña sección del programa que está bloqueada. por la línea de comentario en el programa principal, y luego vuelva a compilar y descargar (puede restaurar la contraseña a 000000).
Después, una pequeña parte del programa será bloqueada nuevamente, luego recompilada y descargada. Entonces se puede utilizar normalmente.
1. Desbloqueo:
Después de descargar el programa, presione directamente la tecla S7 seis veces (que representa el número 1), el LED de 8 dígitos se enciende, se abre la cerradura , ingrese la contraseña,
El tubo digital de seis dígitos muestra las secciones en secuencia.
2. Cambiar contraseña:
Esta función sólo se puede utilizar cuando la cerradura está abierta (el LED está encendido).
Primero, presione la tecla de cambio de contraseña S16 y luego configure la contraseña correspondiente. En este momento, el tubo digital de seis dígitos mostrará el número correspondiente a la contraseña establecida
. Finalmente, después de configurar los seis dígitos, presione la tecla S17 para confirmar el cambio de contraseña y la nueva contraseña entrará en vigor.
3. Vuelva a intentar la contraseña:
Al ingresar la contraseña, la contraseña es incorrecta. Presione la tecla S18 para volver a ingresar la contraseña de seis dígitos.
Al configurar la contraseña, si desea cambiarla a mitad de camino, también puede presionar este botón para restablecerla.
4. Cierra el bloqueo de contraseña:
Presiona la tecla S19 para cerrar el bloqueo de contraseña abierto.
Pasos de demostración básicos recomendados: Ingrese la contraseña original 000000--Presione el botón de cambio de contraseña S16--Presione del 0 al 9 para configurar la contraseña--Presione S17
Confirme el cambio de contraseña --Presione S18 para cerrar el bloqueo de contraseña--Ingrese una nueva contraseña para abrir el bloqueo de contraseña
************************ ********* ******************************************* *******/
#include lt;reg52.hgt;
#include lt;intrins.hgt;
#define uint unsigned int
#define uchar unsigned char
uchar old1, old2, old3, old4, old5, old6 //Contraseña original 00000000
uchar new1, new2, new3; , new4, new5, new6; //Cada vez que la MCU captura la entrada de contraseña
uchar a=16, b=16, c=16, d=16, e=16, f=16; /Variables que se introducirán en la pantalla de tubería digital
uchar wei, key, temp;
bit permitir, genggai, ok, wanbi, reintentar, cerrar
sbit dula=P2^6;
sbit wela=P2^7;
sbit pitido=P2^3
sbit sda=P2^0; //definición del puerto IO
void clock() //reloj del bus I2C
{
unsigned char i=0
scl; =1;
nop ();
mientras ((sda==1)amp; amp; (ilt; 255))
i ; > scl=0;
nop();
}
//////// dirección esclava de 24c02///// p>
carácter unsigned read24c02(dirección de char unsigned)
{
char unsigned i;
start();
writebyte(0xa0);
reloj();
writebyte(dirección);
reloj();
writebyte(0xa1 );
reloj();
i=readbyte()
detener(); >
delay1(100);
return(i);
}
////// Escribe un byte de datos en la dirección info/////< de 24c02 /p>
void write24c02(dirección de carácter sin firmar, información de carácter sin firmar)
{
inicio();
writebyte(0xa0);
reloj();
writebyte(dirección);
reloj();
writebyte(info);
reloj();
stop();
retraso1(5000); Debe ser lo suficientemente largo; de lo contrario, se producirá un error. Porque después de obtener los datos de sda, 24c02 necesita algo de tiempo para completar el proceso de grabación.
}
/****************************** Módulo de programa de bloqueo de contraseña** ************************************************** * ****/
retraso nulo (unsigned char i)
{
uchar j, k;
for(j = i;jgt;0;j--)
for(k=125;kgt;0;k--);
}
visualización vacía ( uchar a, uchar b, uchar c, uchar d, uchar e, uchar f)
{
dula=0;
P0=table[a ] ;
dula=1;
dula=0;
wela=0;
P0= 0xfe;
wela=1;
wela=0;
retraso(5);
P0=tabla[b]; > dula=1;
dula=0;
P0=0xfd
wela=1
p> wela=0; ;
retraso(5);
P0=tabla[c]
dula=1; /p>
p>
P0=0xfb;
wela=1;
wela=0
retraso(5); /p>
P0=tabla[d];
dula=1;
dula=0;
P0=0xf7;
wela=1 ;
wela=0;
retraso(5
P0=tabla[e]; > dula=1;
dula=0;
P0=0xef;
wela=1
wela=0; /p>
retraso(5);
P0=tabla[f];
dula=1;
dula=0.
P0= 0xdf;
wela=1;
wela=0;
retraso(5);
void teclascan()
{
{
P3=0xfe
temp= P3; /p>
temp=tempamp;0xf0;
if (temp! =0xf0)
{
demora(10);
if(temp!=0xf0)
{
temp=P3;
cambiar(temp)
{
caso 0xee:
clave=0;
wei ;
descanso
caso 0xde:
clave=1
wei ;
romper;
caso 0xbe:
>
clave=2;
wei
romper;
caso 0x7e:
clave=3; >
wei;
romper
}
mientras (temp!=0xf0)
{
temp=P3;
temp=tempamp;
temp=0xf0; }
pitido=1;
}
}
P3=0xfd
temp=P3;
temp=tempamp;0xf0;
if(temp!=0xf0)
{
demora(10);
if(temp!=0xf0)
{
temp=P3;<
cambiar(temp)
{
caso 0xed:
clave=4
wei
descanso
caso 0xdd:
clave=5;
wei ;
romper
caso 0xbd:
clave=6;
wei;
descanso
caso 0x7d:
clave=7
wei ;
romper;
romper
}
mientras(temp!=0xf0)
{
temp=P3;
temp=tempamp;
temp=0xf0
pitido=0; }
pitido=1;
}
}
P3= 0xfb
temp=P3;
temp=tempamp;0xf0;
if(temp!=0xf0)
{
demora(10);
if(temp!=0xf0)
{
temp=P3;
cambiar(temp)
{
caso 0xeb:
clave=8
wei
descanso
caso 0xdb:
p>
p>
clave=9;
wei ;
descanso
caso 0xbb:
genggai =1;
p>
wei=0;
romper;
caso 0x7b:
if(permitir)
ok=1;
romper;
}
mientras(temp! =0xf0)
{
temp=P3
temp=0xf0;
temp=temp=0;
pitido=0
}
pitido=1
}
P3=0xf7;
temp=P3;
temp=0xf0
si (temp!=0xf0)
{
demora(10);
si(temp!= 0xf0)
{
temp=P3;
cambiar(temp)
{
caso 0xe7:
reintentar=1
romper
caso 0xd7:
close=1;
romper.
romper
}
mientras; (temp!=0xf0)
{
temp=P3;
temp=tempamp;0xf0;
pitido=0;
}
pitido=1
}
}
}
}
void shumima() //asignar datos recopilados de las pulsaciones de teclas
{
if(!wanbi)
{
cambiar(wei)
{
caso 1: new1=clave
if(!new4=clave;
if(a==17) d=17;
else d=clave;
caso 5: new5=clave; =17) e=17;
else e=clave;
caso 6: nuevo6=clave
if(a==17) f =17;
De lo contrario f=clave
wanbi=1
}
}
}
void yanzheng() //verifica que la contraseña sea correcta
{
if(wanbi) //verifica solo cuando se ingresan las seis contraseñas
{
if ((new1====1))p> if((new1==old1)amp; (new2==old2)amp; (new3== old3)amp;(new4==old4)amp;(new5==old5)amp;(new6==old6))
enable=1; //Cuando la contraseña se ingresa correctamente, obtendrá la configuración permite 1
}
}
void main()
{
init() ; //Inicializar 24C02
/********** La función del siguiente subprograma es formatear el almacenamiento de contraseñas.
***********
****** Cuando llega 24c02 ***************
******* Cuando los datos almacenados en estas áreas de almacenamiento cambian debido al funcionamiento de otros programas, o cuando se olvida la contraseña, ******************* ** p>
****** Puede eliminar la línea de comentario anterior y luego volver a compilarla y descargarla. ****************
****** Después de restaurar la contraseña a 000000, bloquee lo siguiente con ******* ** *********
****** Vuelve a compilar y descargar el programa comentado, y luego podrás usarlo normalmente************** **** *****/
// write24c02(110, 0x00);
// write24c02(111, 0x00); // Unidades de dirección 110 a 115 de; 24c02 se utilizan como contraseñas Área de almacenamiento
// write24c02(112, 0x00);
// write24c02(113, 0x00); 114, 0x00);
// write24c02(115, 0x00);
/********************* ******* **************************** ****************/
old1 =read24c02(110);
old2=read24c02(111);
old3=read24c02(112);
old4 =read24c02(113);
p>
old5=read24c02(114);
old6=read24c02(115);
mientras(1)
{
teclascan();
shumima();
yanzheng()
if( permitir) //Después de la verificación, si permitir es 1, entonces Desbloquear
{
P1=0x00
if(!genggai)
<; p> wanbi=0;}
if(genggai) //Al presionar la tecla de cambio de contraseña S16, genggai se establecerá en 1
{
if(allow) // Solo se permite cambiar la contraseña cuando el candado está abierto
{
while(!wanbi) //Cuando la nueva no se ha establecido una contraseña de seis dígitos, permanecerá en bucle aquí
{
keyscan();
keyscan(0);
llavescan(0)=0;
}
if(allow) //Cuando se presiona la tecla de cambio de contraseña S16, esta tecla se establecerá en 1.
shumima();
if(retry|close) // Cuando se detecta que la tecla de reintento S18 o la tecla de bloqueo de contraseña S19 están cerradas, salta
{ wanbi=1;
romper
}
mostrar(a, b, c, d, e, f); >
}
}
}
if(ok) //Al cambiar la contraseña, presione esta tecla para presionar los seis dígitos nuevos Finalizar el cambio de contraseña
{ //Esta clave no es válida en otros momentos
ok=0;
genggai =0; p> old1=new1; old2=new2; old3=new3; // En este momento, se reemplazará la contraseña anterior
old4=new4; p>
La nueva contraseña se escribirá en la memoria.
escribir24c02(110, antiguo1);
escribir24c02(111, antiguo2);
escribir24c02(112, antiguo3); (113, antiguo4);
escribir24c02( 114, antiguo5);
escribir24c02( 115, antiguo6); =16; d=16; e=16; f=16;
}
if(retry) //Cuando se presiona el botón de reintento S18, se configura el reintento
{
reintento=0; wanbi=0;
a=16; c=16; ; f=16;
nuevo1=0; nuevo2=0; nuevo4=0; nuevo6=0; > if(close) // Cuando se presiona el botón de bloqueo de contraseña, la configuración se cierra
{
close=0; // Se borran todas las variables.
wei=0; wanbi=0;
permitir=0;
P1=0xff
a=16; 16; c=16; d=16; e=16; nuevo5=0.nuevo6=0; /p>
}
display(a, b, c, d, e, f //visualización en tiempo real
}
}