Red de conocimiento informático - Descarga de software - Utilice el lenguaje C del microcontrolador para controlar el bloqueo de contraseña de 6 dígitos. Se requiere tener una clave clara y una clave de confirmación, y sonará una alarma si la contraseña se ingresa incorrectamente. Expertos por favor ayuden

Utilice el lenguaje C del microcontrolador para controlar el bloqueo de contraseña de 6 dígitos. Se requiere tener una clave clara y una clave de confirmación, y sonará una alarma si la contraseña se ingresa incorrectamente. Expertos por favor ayuden

Encontré uno en la "Enciclopedia de desarrollo de tecnología de aplicaciones en lenguaje C 51 microcontroladores"

Se está dibujando el diagrama SCH. . .

#include //Archivo de encabezado de 51 microcontroladores

typedef unsigned char uchar; //Definición de tipo, define el tipo uchar

typedef unsigned int uint; // Definición de tipo, definir tipo uint

//Instrucciones relacionadas con la subrutina del teclado.

#define BLANKCHAR 10 //Definir constantes en blanco

#define PCHAR 11 //Definir constantes de caracteres P

#define OPENCHAR 12 //Definir constantes de caracteres de desbloqueo

#define ALARMCHAR 13 //Definir carácter A constante

#define LINECHAR 14 //Definir carácter-constante

#define BACKKEY 0X0D //Definir tecla de retroceso constante

#define ENTERKEY 0X0F //Definir clave de confirmación constante

#define LOCKKEY 0X0E //Definir clave de bloqueo constante

#define NO_KEY 20 //Definición No valor de retorno de clave

#define KEYPORT P2 //Definir puerto de teclado

//Delay1Ms

void Delay1Ms()

{< / p>

uint i;

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

}

//Definir código de escaneo de clave Cuándo se escanea la clave de la tabla, las líneas de columna de 4 bits y las líneas de fila de 4 bits forman una tabla de datos de bytes

código uchar KEYCODE[]=

{0XEE,0XED,0XEB,0XE7 ,

p>

0XDE,0XDD,0XDB,0XD7,

0XBE,0XBD,0XBB,0XB7,

0X7E,0X7D,0X7B,0X77};

uchar KeyPre; //Guarda el valor clave de la última clave escaneada

uchar KeyUp

//Se utiliza para controlar la operación de rebote de claves. 1: Antirrebote al escanear 2: Esperando liberación 3: Antirrebote al soltar.

#define LEDPORT P0 //Definir el puerto de salida del código de segmento de visualización

#define LEDCON P1 //Definir el puerto de control de bits de visualización

uchar code SEGCODE[ ]=

{0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,//*** código de ánodo de 0~9

0xff, // ***Código de segmento de ánodo que no se muestra

0X8C, //*** código de segmento de ánodo del carácter P

0X8F, //*** código de segmento de ánodo de ┝

0X88, //*** código de segmento de ánodo del carácter A

0XBF, //*** código de segmento de ánodo del carácter -

};

//Definir código de control de código de bits LED

uchar code BITCODE[]={0Xfe,0Xfd,0Xfb,0Xf7,0Xef,0Xdf,0Xbf,0X7f}

;

uchar DispBuf[6]; //Guarda los caracteres mostrados

bit DispNormal; //Controla si se muestra normalmente o parpadea cuando se muestra.

uchar DispCnt; //Controla la frecuencia de la visualización parpadeante.

#define SHORT_TIME 10 //El timbre suena durante 200 ms

#define LONG_TIME 100 //El timbre suena durante 2 s

#define LONGER_TIME 9000 //El suena el timbre El timbre suena durante 3 minutos

sbit ALARMCON=P3^4; //Definir el pin de control de alarma

bit AlarmEnable //Si hay una alarma o un mensaje de sonido

uint AlarmTime; //Controla la duración del tiempo de alarma

sbit LOCKCON=P3^3 //Define el pin de control de la cerradura electrónica

uchar code PassWord[] ={1,2,3 ,4,5}; //Definir la tabla de contraseñas inicial

uchar PassInBuf[6] //Guardar los caracteres de contraseña ingresados

uchar PassPosi; // Los caracteres de contraseña ingresados ​​por el usuario se almacenan en la ubicación de PassInBuf [].

bit TimerBit; //El temporizador de 20 ms expira

uchar SysMode; //El sistema está en modo 0: Ingrese la contraseña modo 1: Modo de alarma 2: Modo de desbloqueo

uchar ErrorCnt; //El número de veces que el usuario cometió errores de contraseña consecutivos.

/*

Parámetros de entrada:

FillChar: caracteres escritos en el buffer

Parámetros de salida: Ninguno

*/

void Fill_Buf(uchar FillChar)

{

uchar i;

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

{

DispBuf[i]=FillChar;//Rellenar DispBuf[i] con el carácter FillChar

PassInBuf[i]=FillChar; /Rellenar PassInBuf con el carácter FillChar [i]

}

}

void Fill_Buf_P()

{

Fill_Buf(BLANKCHAR); // DispBuf[1..5]= ' '

DispBuf[0]=PCHAR; // DispBuf[0]='P'

}

void Fill_Buf_O()

{

Fill_Buf(BLANKCHAR) // DispBuf[1..5]= ' '

DispBuf[0]=OPENCHAR; // DispBuf[0]='┝'

}

void Fill_Buf_A()

{

Fill_Buf(LINECHAR); // DispBuf[1..5]= ' -----'

DispBuf[0]=ALARMCHAR; // DispBuf[0]='A'

}

/*

Parámetros de entrada:

DispPosi: Número de LED para mostrar datos.

DispChar: El contenido que se mostrará.

Parámetros de exportación: Ninguno

*/

void Disp_Led_Sin(uchar DispChar,uchar DispPosi)

{

LEDPORT=SEGCODE[DispChar];//Código de segmento de visualización de salida

LEDCON&=BITCODE[DispPosi];//Código de bits de visualización de salida

Delay1Ms() //Retraso 1MS

LEDCON|=0X3F;//Apagar la pantalla

}

/* (2) Apagar la función de visualización Disp_Led_OFF.

La función Disp_Led_OFF muestra caracteres en blanco en la pantalla y se utiliza principalmente para la visualización parpadeante. La función logra la funcionalidad requerida llamando a Disp_Led_Sin 6 veces.

El código es el siguiente: */

void Disp_Led_OFF()

{

uchar i;

LEDCON|=0X3F;/ / Apagar la pantalla

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

{

Disp_Led_Sin(BLANKCHAR,i);//Pantalla en blanco caracteres uno por uno

}

}

void Disp_Led_All()

{

uchar i;

LEDCON |=0X3F; // Apagar la pantalla

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

{

Disp_Led_Sin(DispBuf[i],i ); //Mostrar el valor en DispBuf[]

}

}

void Disp_LED()

{

DispCnt++;

DispCnt%=10;

if(DispCnt==0)

{

DispNormal=~DispNormal ;//Invierte el bit de control de visualización parpadeante en 200 ms

}

if(SysMode==1)

{ //Modo de alarma, pantalla parpadeante

p>

if(!DispNormal)

{

Disp_Led_OFF();//Mostrar caracteres en blanco

return;

}

}

Disp_Led_All();//Mostrar el valor en DispBuf[]

}

/*

Parámetros de entrada:

stime: tiempo del sonido del timbre.

Parámetros de exportación: Ninguno

*/

void Sys_Speaker(uint stime)

{

AlarmEnable= 1;//Alarma permitida

AlarmTime=stime;//Duración del tiempo de alarma

}

void Sys_Alarm()

{

if(AlarmEnable==1)

{//Permitir alarma

ALARMCON=0;//Alarma

AlarmTime-- ;

if(AlarmTime==0)

{//Detener hora de alarma

AlarmEnable=0;

ALARMCON=1; //Desactivar alarma

if(SysMode==1)

{//Cuando la alarma ocurre en modo 1, regresa al modo 0

SysMode=0

Fill_Buf_P();//Mostrar P

}

}

}

}

/*

Parámetro de entrada: ninguno

Parámetro de salida: valor clave o sin clave

*/

uchar Find_Key ()

{

uchar KeyTemp,i;

KEYPORT=0xf0;// La línea de fila genera 0 y la línea de columna genera todos 1

KeyTemp=KEYPORT;//Leer el valor del puerto clave

if(KeyTemp==0xf0)

return NO_KEY;//No se presiona ninguna tecla, regresar

KEYPORT=KeyTemp|0x0f;//Salida de línea de columna, entrada de línea de fila

KeyTemp=KEYPORT;//Leer valor de puerto clave

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

{

if(KeyTemp==KEYCODE[i])//Encuentre el valor de la clave según el valor de escaneo del puerto clave

return i;/ /Devolver valor clave

}

return NO_KEY;

}

/*

Parámetro de entrada: Ninguno

Parámetros de exportación: valor clave o sin clave

*/

uchar Scan_Key()

{

uchar KeyTemp;

KeyTemp=Find_Key();//Escanea el teclado y obtén el valor de la clave

if(KeyTemp==NO_KEY)

{

if(KeyUp<2)

{//No se presiona ninguna tecla, regresa

KeyUp=0;

regresa NO_KEY ;

}

if(KeyUp==2)

{//Para soltar la tecla, retrasa el rebote

KeyUp= 3;

return NO_KEY;

}

if(KeyUp==3)

{//Suelta la clave y devuelve el valor clave

KeyUp=0;

devolver KeyPre;

}

}

más

p>

{

if(KeyUp==0)

{//Cuando se presiona una tecla, guarda el valor de la clave

KeyUp=1 ;

KeyPre=KeyTemp;

}

else if(KeyUp==1)

{//Después del rebote, detectar nuevamente Se presiona una tecla

if( KeyPre==KeyTemp)

KeyUp=2;

else

KeyPre=KeyTemp; p>

} else if(KeyUp==3)

{//Esperar a que se suelte la tecla

KeyUp=2;

}

}

return NO_KEY;

}

/*

Parámetros de entrada:

Clave: Valor clave

Parámetros de exportación: Ninguno

*/

void Key_Process(uchar Key)

{

uchar i;

if(Key==NO_KEY)

return ;// Sin clave, sin procesamiento

switch(SysMode)

{

caso 0://Ingresar contraseña

interruptor(Clave)

{

caso 0:

caso 1:

caso 2:

caso 3:

caso 4:

caso 5:

caso 6:

caso 7:

caso 8:

caso 9:

DispBuf[PassPosi]= LINECHAR;/ /Mostrar '-'

PassInBuf[PassPosi]=Key;//Guardar la contraseña ingresada por el usuario

if(PassPosi<5)

PassPosi++;// Ajustar la posición de entrada de la contraseña

Sys_Speaker(SHORT_TIME);//Enviar tono de tecla

break;

case BACKKEY://Tecla de retroceso

DispBuf[PassPosi]=BLANKCHAR;//Display ' '

PassInBuf[PassPosi]=BLANKCHAR;//Borrar la contraseña de la ubicación actual

si (PassPosi>1)

PassPosi--;//Ajustar la posición de visualización

Sys_Speaker(SHORT_TIME);//Enviar tono de tecla

pausa;

case ENTERKEY://Botón Confirmar

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

{//Compara la contraseña ingresada por el usuario con la contraseña predeterminada del sistema

if(PassInBuf[i+1]!=PassWord[i]

)

break;

}

if(i>=5)

{//Introduce la contraseña correctamente

Fill_Buf_O();//Mostrar estado de desbloqueo

PassPosi=1;

LOCKCON=1;//Desbloqueo

ErrorCnt=0;

Sys_Speaker(LONG_TIME);//Enviar un tono de aviso largo

SysMode=2;//Cambiar al modo 2

}

else

{

ErrorCnt++;//El número de errores más uno

if(ErrorCnt>2)

{//El número de errores excede 3 veces

ErrorCnt=0;

Fill_Buf_A();//Mostrar estado de alarma

PassPosi=1;

Sys_Speaker(LONGER_TIME);//Enviar sonido de alarma

SysMode=1;

}

else

{//El número de errores es menor que 3, el usuario vuelve a ingresar

Fill_Buf_P();

PassPosi=1;

Sys_Speaker(LONG_TIME);

}

}

pausa;

case LOCKKEY://Bloquear tecla

Fill_Buf_P();//Mostrar P

PassPosi=1;

Sys_Speaker(SHORT_TIME);

descanso

}

descanso;

caso 2://estado de desbloqueo

if(Key==LOCKKEY)

{//El usuario presiona el botón de bloqueo

Fill_Buf_P ();

SysMode=0 ;

LOCKCON=0;//Bloqueo

Sys_Speaker(SHORT_TIME);

}

descanso;

}

}

void Ini_Timer0()

{

TMOD& =0XF0;

TMOD|= 0X01;//Inicializar T0, modo 1

TR0=0;

TH0=(65536-20000)/256; //T0 asigna valor de recuento inicial

TL0=(65536-20000)%256;

TR0=1;//Iniciar T0

ET0=1; //Permitir interrupción T0

}

void Timer0() interrupción 1

{

TR0=0;

TH0=(65536-20000)/256

; //T0 asigna valor de conteo inicial

TL0=(65536-20000)%256;

TR0=1

TimerBit=1;//Timing Se acabó el tiempo

}

void Ini_System()

{

PassPosi=1;

LOCKCON= 0 ;//Enclavamiento

Ini_Timer0();//Inicializar T0

Fill_Buf_P();

EA=1;//Permitir interrupción del sistema

}

void main()

{

uchar KeyTemp;

Ini_System();

while(1)

{

if (TimerBit==1)

{//El cronómetro ha terminado

Disp_LED () ;//Actualizar la pantalla

Sys_Alarm();//Procesamiento de alarma

KeyTemp=Scan_Key();//Escanear la clave

Key_Process( KeyTemp);/ /Procesamiento de botones

TimerBit=0;

}

}

}