设计思路:
将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以上。
一般接线没有问题,主要是这个问题会导致继电器无动作。
Comments NOTHING