Cómo programar una cerradura electrónica con código basada en el microcontrolador AT89S52
/*----------------------------------------- ------
Nombre: Bloqueo de contraseña de simulación de teclado Matrix
Foro: www.doflye.net
Escritor: shifang
Fecha: 2009.5
Revisión: Ninguna
Contenido: Bloqueo de contraseña simulado, la contraseña se solidifica en la ROM y no se puede cambiar mediante la entrada de una clave
--- -------------------------------------------------*/
#include< reg52.h> // Contiene el archivo de encabezado, que generalmente no necesita ser modificado. El archivo de encabezado contiene la definición del registro de función especial
#define. DataPort P0 //Definir el puerto de datos, en el programa El puerto de datos encontrado será reemplazado por P0
#define KeyPort P1
sbit LATCH1=P2^2;//definir pestillo habilitar el bloqueo del segmento de puerto
sbit LATCH2=P2^3; // Bloqueo de bits
Código de caracteres sin firmar dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d , 0x07,0x7f 0x07,0x7f ,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71} // Mostrar valor de código de segmento 0~F
código de carácter sin firmar dofly_WeiMa; []={0xfe,0xfd ,0xfb,0xf7,0xef,0xdf ,0xbf,0x7f};// Correspondiente al tubo digital correspondiente, es decir: 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //Correspondiente al tubo digital correspondiente Se ilumina.
e. Código de bits
unsigned char TempData[8]; //Variable global que almacena el valor de visualización
unsigned char code password[8]={1,2,3,4 , 5,6,7,8};
//Esta contraseña se puede cambiar para realizar múltiples pruebas
void DelayUs2x(unsigned char t); //Función de retraso a nivel de EE. UU. declaración
void DelayMs(unsigned char t); //retraso a nivel de ms
void Display(unsigned char FirstBit, unsigned char Num); // función de visualización del tubo digital
unsigned char KeyScan(void);//Escaneo de teclado
unsigned char KeyPro(void);
void Init_Timer0(void);//Inicialización del temporizador
/*----------------------------------------------------- ---
Función principal
------------------------------- -- --------------*/
void main (void)
{
número de caracteres sin firmar,i ,j ;
temperatura de caracteres sin firmar[8];
bandera de bits;
Init_ Timer0();
mientras (1) // bucle principal
{
num=KeyPro();
if(num!=0xff)
{
if(i==0)
{
for(j=0;j<8; j++)//borrar la pantalla
TempData[ j]=0;
}
if(i<8)
{
temp[i]=dofly_DuanMa[ num] ;//ingrese el valor de la pulsación de tecla en la matriz temporal
for(j=0;j<= i;j++) //Asigne los valores de la matriz temporal al búfer de visualización en un cierto orden
// Ingrese valores de derecha a izquierda
TempData[7-i+j]=temp[j]
}; p>
i++; // Ingrese el valor a acumular
if(i==9)// El valor normal es igual a 8.
Debido a que necesitamos vaciar uno para limpiar la pantalla,
//Las teclas al borrar la pantalla no ingresan valores
{
i=0;
p>Flag=1;//primero coloque la posición de comparación 1
for(j=0;j<8;j++)//bucle para comparar los 8 valores, p>
//si hay desigualdad, entonces el valor del indicador final es 0
Flag=Flag&&(temp[j]==dofly_DuanMa[password[j]]);
// Compara el valor de entrada con la contraseña existente
for(j=0;j<8;j++)//Borrar la pantalla
TempData[j]=0;
if(Flag)//si se comparan todos iguales, posición de la bandera 1
{
TempData[0]=0x3f // "o" p>
TempData[1]=0x73; // "p"
TempData[2]= p> TempData[1]=0x50; // "r"
TempData[2]= 0x50; // "r"
En caso contrario "Err"
}
}
}
}
}
/*---------- ---- ---- ----------------------------------
Función de retardo de EE. UU., que incluye parámetro de entrada gráfico sin signo, sin valor de retorno
el carácter sin signo se usa para definir variables de caracteres sin signo. Su rango de valores es
0 ~ 255. Aquí se usa el oscilador de cristal 12M. utilice el ensamblaje para un retraso preciso y un retraso aproximado
La longitud es la siguiente T=tx2+5 uS
---------------- --------------- -*/
void DelayUs2x(car t sin firmar)
{
mientras(- -t);
}
/*-------------- ------------------ ------------------
Función de retardo mS, el parámetro de entrada es el carácter sin signo t, sin valor de retorno
el carácter sin signo se define como una variable de carácter sin signo y el rango de valores es
0~255. se utiliza aquí. Utilice el ensamblaje para obtener un retraso preciso
-------- -------------------------. ---------------*/
void DelayMs(car t sin firmar)
{
while(t- -)
{
//retardo aproximado 1mS
DelayUs2x(245);
DelayUs2x(245);
} DelayMs(10); //eliminar el difuminado
if((KeyPort&0x0f )! =0x0f)
{
cord_h=KeyPort&0x0f //Leer los valores de columna y fila
KeyPort=cord_h;
|0xf0; //Muestra el valor de la columna actual
cord_l=KeyPort&0xf0; //Lee el valor de la fila
while((KeyPort&0xf0)!=0xf0);//Espera la liberación y Salida
return(cord_h+cord_l);//El último valor del código de combinación de teclado
}
}return(0xff);//Valor de retorno p >
}
/*----------------------------------- - ------------
Función de procesamiento de valores clave, devuelve el valor clave escaneado
------------- ----------------------------------*/
carácter sin firmar KeyPro( vacío ) p>
{
switch(KeyScan())
{
caso 0x7e: return 0;break;//0 Presione el tecla correspondiente para mostrar Valores de código correspondientes
case 0x7d: return 1;break;//1
case 0x7d: return 1;break;//1
case 0x7b: return 2;break;//2
case 0x77:return 3;break;//3
case 0xbe:return 4;break;//4
caso 0xbd:return 5;break;//5
case 0xbb:return 6;break;//6
case 0xb7: return 7;break;// 7 p>
caso 0xde:return 8;break;//8
case 0xdd:return 9;break;//9< break;//d
case 0xeb: return 14;break;//e
case 0xe7:return 15;break;//f
default:return 0xff;break;
} p>
}
}