Red de conocimiento informático - Material del sitio web - Diseño de cerradura electrónica con código basado en microcontrolador

Diseño de cerradura electrónica con código basado en microcontrolador

Teclas de función

S6---S15 teclas numéricas 0-9

S16---Cambiar contraseña S17---Confirmar después de cambiar la contraseña

p>

S18---Reintentar contraseña, restablecer S19---Cerrar bloqueo de contraseña

Contraseña inicial: 000000 Dígitos de contraseña: 6 dígitos

Nota: Perdida Después de encender la alimentación, la contraseña establecida se perderá. Cuando se vuelva a encender la alimentación, la contraseña se restablecerá al 000000 original.

El LED luminoso de 8 dígitos conectado a P1 se ilumina hasta. indica que la cerradura está abierta para indicar que la cerradura está bloqueada

p>

Función del programa: este programa combina la función de almacenamiento de la memoria 24C02 y puede guardar contraseñas cuando se apaga la energía; .

Cuando se ejecuta por primera vez, si no hay respuesta después de ingresar la contraseña original de 000000, puede intentar cambiar la sección breve

anterior de la línea de comentarios frente al programa que está bloqueado por la línea de comentario en el programa principal Elimine, luego vuelva a compilar y descargar (puede restaurar la contraseña a 000000).

Después de eso, bloquea este pequeño programa y luego compílalo y descárgalo. antes de que pueda usarse normalmente.

1. Desbloqueo:

Después de descargar el programa, presione directamente S7 (que representa el número 1) seis veces. El LED de 8 dígitos se iluminará y se abrirá la cerradura. Al ingresar la contraseña,

El tubo digital de seis dígitos muestra pequeñas barras horizontales en secuencia.

2. Cambiar contraseña:

Esta función sólo se puede utilizar cuando la cerradura está desbloqueada (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

. Después de configurar los últimos seis dígitos, presione S17 para confirmar el cambio de contraseña y la nueva contraseña entrará en vigor a partir de entonces.

3. Vuelva a intentar la contraseña:

Al ingresar la contraseña, si la contraseña se ingresa incorrectamente, presione la tecla S18 para volver a ingresar la contraseña de seis dígitos.

Al configurar una contraseña, si desea cambiar la contraseña durante la configuración, también puede presionar este botón para restablecerla.

4. Cierre el bloqueo de contraseña:

Presione 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 cambiar contraseña S16---Presione 0 a 9 para configurar la contraseña---Presione S17

Confirmar el cambio de contraseña- --Presione S18 para cerrar el bloqueo de contraseña---Ingrese la nueva contraseña para abrir el bloqueo de contraseña

****************** ************ **************************************** ************ ***/

#include

#include

#define uint unsigned int

#define uchar unsigned char

uchar old1,old2,old3,old4,old5,old6 //Contraseña original 000000

uchar new1,new2,new3,new4,new5,new6 ; //Cada entrada de contraseña recopilada por MCU

uchar a=16,b=16,c=16,d=16,e=16, f=16; //Enviado a la pantalla del tubo digital Variables

uchar wei,key,temp;

bit enable,genggai,ok,wanbi,retry,close; bit

sbit dula =P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

sbit sda=P2^0; //Definición del puerto IO

sbit scl=P2^1;

tabla de códigos de caracteres sin firmar[]=

{0x3f, 0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,

0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};

/ *********** *******Controlador de memoria del chip IIC 24C02*************************** **********/

void nop()

{

_nop_();

_nop_( );

}

///////// Controlador de lectura 24c02 ///////////////////// /////////////////////////////////////////////////// //////

Retraso nulo1 (unsigned int m)

{ unsigned int n;

for(n=0;n

}

void init() //subrutina de inicialización 24c02

{

scl=1;

nop ();

sda= 1;

nop();

}

void start() //Inicia el bus I2C

{

sda=1;

nop();

scl=1;

nop( );

sda=0;

nop();

scl=0;

nop();

}

void stop() //Detener el bus I2C

{

sda=0;

nop() ;

scl=1;

p>

nop();

sda=1;

nop();

}

void writebyte(unsigned char j) //Escribe un byte

{

carácter sin firmar i,temp;

temp=j;

for (i=0;i<8;i++)

{

temp=temp<<1;

scl=0;

nop();

sda=CY; //desplazamiento temporal a la izquierda Cuando el valor se saca y se coloca en CY

nop();

scl=1 // Después de que los datos en la línea sda estén estables, tire de scl alto;

nop();

}

scl=0;

nop();

sda= 1;

nop();

}

unsigned char readbyte() //Leer un byte

{

char sin signo i,j,k=0;

scl=0; nop();

for (i=0;i<8;i++); )

{

nop(); scl=1; nop();

if(sda==1)

j =1 ;

más

j=0;

k=(k<<1)|j;

scl=0 ;

}

nop();

return(k);

}

reloj vacío( ) / /Reloj del bus I2C

{

unsigned char i=0;

scl=1;

nop();

while((sda==1)&&(i<255))

i++;

scl=0;

nop(

}

///////Leer un byte de datos de la dirección 24c02/////

unsigned char read24c02 (); dirección de carácter unsigned)

{

unsigned char i;

start();

writebyte(0xa0);

reloj();

escribirbyte(dirección);

reloj();

inicio();

escribirbyte ( 0xa1);

reloj();

i=readbyte();

detener();

retardo1(100) ;

return(i);

}

//////Escribe un byte de información de datos/// en la dirección de 24c02 //

void write24c02(dirección de caracteres sin firmar, información de caracteres sin firmar)

{

start();

w

ritebyte(0xa0);

reloj();

writebyte(dirección);

reloj();

writebyte(info) ;

clock();

stop();

delay1(5000); //Este retraso debe ser lo suficientemente largo, de lo contrario se producirá un error. Porque después de que 24c02 obtiene datos de sda, todavía necesita una cierta cantidad de tiempo para grabarlos.

}

/******************************Módulo del programa de bloqueo de contraseña ** ************************************************* *** ****/

retraso nulo (carácter i sin firmar)

{

uchar j,k;

para (j= i;j>0;j--)

for(k=125;k>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;

wela=0 ;

p>

retraso(5);

P0=tabla[c];

dula=1;

dula=0 ;

P0=0xfb;

wela=1;

wela=0;

retraso(5);

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;

retraso( 5);

P0=tabla[f];

dula=1;

dula=0;

P0=0xdf;

wela=1;

wela=0;

retraso(5);

}

anular teclascan()

{

{

P3=0xfe;

temp=P3;

temp= temp&0xf0;

if(temp!=0xf0)

{

retraso(10);

if( temp!=0xf0)

{

temp=P3;

cambiar(temp)

{

caso 0xee:

p>

clave=0;

wei++;

descanso;

caso 0xde:

clave=1;

wei++;

descanso;

caso 0xbe:

clave =2;

wei++;

descanso;

caso 0x7e:

clave=3;

wei++ ;

descanso;

}

mientras(temp!=0xf0)

{

temp=P3 ;

temp=temp&0xf0;

beep=0;

}

beep=1;

}

}

P3=0xfd;

temp=P3;

temp=temp&0xf0;

si( temp!=0xf0)

{

demora(10);

if(temp!=0xf0)

{

temp=P3;

cambiar(temp)

{

caso 0xed:

clave=4; p>

wei++;

descanso;

caso 0xdd:

clave=5;

wei++;

ruptura;

caso 0xbd:

clave=6;

wei++;

ruptura;

caso 0x7d:

clave=7;

wei++;

descanso;

}

mientras( temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

pitido=1;

}

}

P3=0xfb;

temp =P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

retraso(10);

si(tem

p!=0xf0)

{

temp=P3;

cambiar(temp)

{

caso 0xeb:

clave=8;

wei++;

descanso;

caso 0xdb:

clave =9;

wei++;

descanso;

caso 0xbb:

genggai=1;

wei =0;

descanso;

caso 0x7b:

if(allow)

ok=1;

romper;

}

mientras(temp!=0xf0)

{

temp=P3;

temp=temp&0xf0;

pitido=0;

}

pitido=1;

}

}

P3=0xf7;

temp=P3;

temp=temp&0xf0;

if(temp!=0xf0)

{

demora(10);

si(temp!=0xf0)

{

temp=P3 ;

cambiar(temp)

{

caso 0xe7:

reintentar=1;

romper;

caso 0xd7:

close=1;

break;

}

while(temp!= 0xf0)

{

temp=P3;

temp=temp&0xf0;

beep=0;

}

pitido=1;

}

}

}

}

void shumima() //Distribuye los datos recopilados presionando las teclas

{

if(!wanbi)

{

switch (wei)

{

caso 1:new1=key;

if(!allow) a=17;

else a = clave; b

reak;

caso 2:new2=key;

if(a==17) b=17;

else b=key; p>

caso 3:new3=clave;

if(a==17) c=17;

else c=clave;

caso 4:new4=clave;

if(a==17) d=17;

else d=clave;

caso 5: nuevo5=clave;

if(a==17) e=17;

else e=clave;

caso 6:nuevo6= clave;

if(a==17) f=17;

else f=clave;

wanbi=1; p> }

}

}

void yanzheng() //Verifica si la contraseña es correcta

{

if (wanbi) //La verificación solo se realizará después de que se hayan ingresado los seis dígitos de la contraseña

{

if((new1==old1)&(new2 ==old2)&(new3= =old3)&(new4==old4)&(new5==old5)&(new6==old6))

allow=1; es correcto, obtendrás el conjunto permitido

}

}

void main()

{

init(); //Inicialización 24C02

/*******La función del pequeño programa a continuación es formatear el área de almacenamiento de contraseñas. ***********

******Cuando estas áreas de almacenamiento en 24c02 se dañan debido a la ejecución de otros programas********** ** ***

Cuando los datos almacenados en ********* cambian o se olvida la contraseña, ***************** ***

******Puedes eliminar la línea de comentario que se encuentra delante y luego volver a compilarla y descargarla.

****************

******Después de restaurar la contraseña a 000000, utilice el siguiente procedimiento********* *** *************

******Bloquea los comentarios, vuelve a compilarlos y descárgalos, y luego podrás usarlos normalmente****** *********** ***/

// write24c02(110,0x00);

// write24c02(111,0x00);// Las unidades de dirección 110 a 115 de 24c02 se utilizan como área de almacenamiento de contraseñas

// write24c02(112,0x00);

// write24c02(113,0x00);

// escribir24c02(114,0x00);

p>

// escribir24c02(115,0x00);

/************ **************** ********************************** *****/

old1=read24c02 (110);

old2=read24c02(111);

old3=read24c02(112);

old4=read24c02(113);

old5=read24c02(114);

old6=read24c02(115);

mientras(1 )

{

keyscan();

shumima();

yanzheng();

si (permitir) //Después de la verificación, si permitir es 1, desbloquear

{

P1=0x00;

if(!genggai)

wanbi=0;

}

if(genggai) //Cuando se presiona la tecla de cambio de contraseña S16, genggai se establecerá en uno

{

if(allow) //Si se ha abierto el candado para tener la autoridad para cambiar la contraseña

{

while(!wanbi) // Cuando no se haya establecido la nueva contraseña de seis dígitos, seguirá repitiéndose aquí

p>

{

keyscan();

shumima();

if(retry|close) //Cuando se detecta la tecla de reintento Cuando se presiona S18 o cerrar la tecla de bloqueo de contraseña S19, saltará

{ wanbi=1;

romper;

}

mostrar(a,b,c,d,e,f);

}

}

}

if(ok) //Al cambiar la contraseña, cuando se presionan los seis dígitos de la nueva contraseña, puede presionar esta tecla para finalizar el cambio de contraseña

{ //Presionar esta tecla en otros momentos no es válido

ok=0; wei=0;

genggai=0;

old1=new1;old2=new2;old3=new3; //En este momento, se reemplazará la contraseña anterior

old4=new4;old5=new5;old6=new6;

//La nueva contraseña se escribe en el área de almacenamiento.

write24c02(110,old1);

write24c02(111,old2);

write24c02(112,old3);

write24c02 (113,old4);

escribir24c02(114,old5);

escribir24c02(115,old6);

a=16;b=16;c =16;d=16;e=16;f=16;

}

if(retry) //Cuando se presiona el botón de reintento S18, se configurará el reintento

{

reintentar=0; wei=0;wanbi=0;

a=16;b=16;c=16;d=16; 16;f=16;

nuevo1=0;nuevo2=0;nuevo3=0;nuevo4=0;nuevo5=0;nuevo6=0;

}

if(close) //Cuando se presiona el botón de bloqueo de contraseña de cierre, se establecerá el cierre

{

close=0;genggai=0;//se borran todas las variables a cero.

wei=0; wanbi=0;

allow=0;

P1=0xff;

a=16;b= 16;c=16;d=16;e=16;f=16;

nuevo1=0;nuevo2=0;nuevo3=0;nuevo4=0;nuevo5=0;nuevo6=0;

}

display(a,b,c,d,e,f); //Visualización en tiempo real

}

}

Hágalo usted mismo con el código. Si aún no puede hacerlo, no diré nada.