矩阵键盘密码锁(C语言)

发布于 2022-04-27  1186 次阅读


设计思路:

将16个按键排成4列4排,将第一列每个按键的另一端连接在一起,构成第一根列线,用同样的方法第二,三,四列的按键连接,这样一共有4行4列共8根线,16个按键的每一端都与I/O口相互连接,通过程序即可检测16个键,通过控制三极管的导通和截止使继电器吸合与断开,从而控制电机转动与是否进行开锁与上锁。

仿真元器件清单:

7SE-COM-CATHODE

AT89C51

BUTTON

CAP

CAP-POL

CRYSTAL

G2RL-14B-CF-DC12

LED

MOTOR

MPS3638

RES

实现程序:

   #include <reg51.h>
   #include <intrins.h>
   #include <absacc.h>
   #define uchar unsigned char
   #define uint unsigned int
   sbit LED=P1^0;
   sbit relay=P1^7;
   uchar code a[16]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
   uchar code set_mima[6]={2,3,0,1,1,0};
   uchar m[6]={0,0,0,0,0,0};

   void delay(uint i)
   {   
     uint j;
     for(j=0;j<i;j++);
    }
   uchar checkkey() 
  {
     uchar i;
     uchar j;
     j=0xf0;
     P2=j;
     i=P2;
     i=i&0xf0;
     if (i==0xf0)
     {
        return(0);
      }
     else
     {
	return(0xff);
      }
}

   uchar keyscan()
   {
        uchar scancode;
	uchar codevalue;
	uchar a;
	uchar m=0;
	uchar k;
	uchar i,j;
	if (checkkey()==0)
	{
	   return(0xff);
	 }
	else
	{
          delay(100);
	  if(checkkey()==0)
	  {
	      return(0xff);
	   }
	  else
	  {
              scancode=0xfe;m=0x00;
	      for(i=1;i<=4;i++)
	      {
	         k=0x10;
		 P2=scancode;
	         a=P2;
		 for(j=0;j<4;+j++)
		{
		    if((a&k)==0)
	            {
		        codevalue=m+j;
		        while(checkkey()!=0);
	                return(codevalue);
	             }
		    else
		    {
	               (k=k<<1);
                     }
	         }
	        m=m+4;
		scancode=scancode<<1;
		scancode=scancode|0x01;
            }
            return 0;
          }
       }
   }

void main()
{
  uchar i;
  uchar m[6]={0,0,0,0,0,0};
  P3=0x00;
  while(1)
  {
	   if(checkkey()==0x00)
	   {
	   	continue;
	    }
	   else
	   {
	      for(i=0;i<5;i++)
	     {
	   	m[i]=keyscan();
	        P3=a[m[i]];
	        while(checkkey()==0);
	      }
	      if(m[0]==set_mima[0]&m[1]==set_mima[1]&m[2]==set_mima[2]&m[3]==set_mima[3]&m[4]==set_mima[4]&m[5]==set_mima[5])
	    {
	        LED=0;
	        relay=0;
	     }
            }
  }
}

 

实现仿真图:

注意事项:

继电器(G2RL-14B-CF-DC12)的电压要设置足够低,proteus继电器吸合有电压值要求,一般需要控制端加12V以上电压,继电器才会动作。
要么直接修改继电器吸合电压参数为5V以下,要么加三极管并且提高控制端电压到12V以上。
一般接线没有问题,主要是这个问题会导致继电器无动作。

 

实现效果视频: