数字电子密码锁
电子密码锁
一、 设计性能要求:
设计一个简单的数字电子密码锁~密码为6位。功能:
1(密码输入:每按下一个数字键~就输入一个数值~并在显示器的最右方显示出该数值~
同时将先前输入的数据依次左移一个数字位置,
2(密码清除:按下清除键可清除全面所有的输入值~清除成为“000000”, 3(密码更改:按下更改键可将目前的数码设定成新的密码,
4. 密码上锁:按下上锁键可将密码锁上锁~上锁后上锁指示灯点亮, 5. 密码解除:按下解除键首先检查输入的密码是否正确~密码正确即开锁~开锁指示灯点亮。
附加功能:允许密码输入错误的最大次数为三次, 口令错误次数超过三次则进入死锁状态, 并发出警报。
二、系统框图
时钟发生器 时序产生电路 键盘扫描电路
键盘译码电路 键盘
寄存器清除信号发生电路 按键数据缓存器
开关门锁电路 数值比较电路
七段译码电路
1
三(系统电路图
PIN_12
PIN_13INPUTstatusPIN_23PIN_14VCCINPUTrstPIN_11PIN_15VCCPIN_16mmkz02PIN_17
PIN_18OUTPUTsegout[0..6]clrsegout[0..6]OUTPUTlocksPIN_8statuslocksshzh02OUTPUTunlocksPIN_41rstunlocksINPUTOUTPUTclralertPIN_3PIN_2clrkoffkoffamVCCINPUTclkPIN_28clkclk1dcc1[4..0]VCCINPUTkey[3..0]PIN_4key[3..0]counter[2..0]VCCPIN_5inst3PIN_6inst2PIN_7
jpsm02
clrdcc1[4..0]OUTPUTselout[2..0]PIN_19clk1selout[2..0]PIN_20clkPIN_21koff
key[3..0]
inst
四(基本工作原理
电子密码锁主要由数字密码输入电路.密码锁控制电路和密码锁显示电路组成~其中数字密码输入电路包括以下部分:时序产生电路、键盘矩阵、键盘扫描、键盘译码及按键存储:密码锁控制电路包括数字按键输入、存储及密码清除和电锁的激活与解除,密码锁显示电路包括BCD 译码、动态扫描电路。
首先应先预置密码~密码器通过外接键盘矩阵输入数字密码~然后密码需要经过键盘扫描和键盘编码变成BCD码存储在系统中作为预置密码~同时将按下的数字通过扫描显示在数码管上~并且将数字从右到左移位~按下密码上锁键~此时上锁指示灯点亮,表示设置密码成功。按下清零键~此时数码管恢复为“000000”。
然后~密码器通过外接键盘矩阵输入数字密码后按下开锁键~此时按下的数字通过密码锁显示电路显示在数码管上~由密码锁控制电路判断:若输入的数字与预置密码相同~则开锁指示灯点亮~表示密码锁开锁成功,若输入的数字与预置密码不相同时~密码控制模块中的计错计数器counter4将会加1~直到输入三次错误密码时~密码控制模块中的计错计数器counter4将会计满并产生一个信号arm使密码锁进入死锁状态并且报警~此时无法继续输入密码~须按下复位键ret密码锁才能继续工作状态。
2
五(单元电路模块及源程序
1. 时序产生电路模块
密码器的工作时钟由外部晶振来提供~时钟频率为5kHz,通过一个自由计数器~对输入主时钟进行降频处理~来提供对整个电路的系统主时钟以及键盘扫描的时钟信号。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity shzh02 is
port(clr,clk: in std_logic;
key: in std_logic_vector(3 downto 0);
koff:out std_logic;
clk1:out std_logic);
end shzh02;
architecture one of shzh02 is signal test:std_logic;
signal counter2: std_logic_vector(4 downto 0);
signal counter1:std_logic_vector(1 downto 0);
begin
test<=key(3) and key(2) and key(1) and key(0);
process(clr,test,clk)
begin
if(clr='0') then
counter1<="00";
counter2<="00000";
koff<='1';
elsif(clk'event and clk='1') then
counter1<=counter1+1;
if(test='0')then
counter2<="00000";
3
koff<='0';
elsif(counter2<"11110")then
counter2<=counter2+1;
elsif(counter2="11110")then
koff<='1';
end if;
end if;
if (counter1<="01" ) then
clk1<='0';
else clk1<='1';
end if;
end process;
end one;
模块仿真图为:
2.键盘扫描及译码模块
矩阵式键盘是一种常见的输入装置~矩阵式键盘以行、列形式排列~键盘上的每一个按键盘其实是一个开关电路~当某键被按下时~该按键所对应的位置就呈现逻辑0的状态~键盘的扫描可以以行扫或列扫方式进行,该试验中为列扫方式,sel2—sel0列为扫描信号~其中的某一位为0即扫描其中的一列~若从key[3..0] 读出的值全为1 时~表示没有键被按下~则不进行按键的处理。如果有键被按下~则将selout[2..0]读出的送至键盘译码电路进行译码。
键盘扫描与其对应的键值的关系
key[3..0] selout[2..0] 对应的键值
1110 000 0
4
1 001
010 2
011 3
1110 110 4
111 5
ESC 101
100 STUEP
000 6
001 7
1101
8 100
101 9
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity jpsm02 is
port(clr,clk1,clk,koff:in std_logic;
key:in std_logic_vector(3 downto 0);
dcc1: out std_logic_vector(4 downto 0);
selout:out std_logic_vector(2 downto 0));
end jpsm02;
architecture two of jpsm02 is
5
signal test:std_logic;
signal counter:std_logic_vector(2 downto 0);
signal dcc: std_logic_vector(6 downto 0);
begin
test<=key(3) and key(2) and key(1) and key(0);
process(clk1,clr)
begin
if(clr='0') then
counter<="000";
elsif(clk1'event and clk1='1') then
if(test='0') or (koff='0') then
counter<=counter;
else
counter<=counter+1;
end if;
end if;
selout<=counter;
dcc<=counter & key;
end process;
process(clk,test)
begin
if(clk'event and clk='0')then
if(dcc="0001110")then
dcc1<="00000";
elsif(dcc="0011110")then
dcc1<="00001";
elsif(dcc="0101110")then
dcc1<="00010";
elsif(dcc="0111110")then
dcc1<="00011";
elsif(dcc="1101110")then
dcc1<="00100";
elsif(dcc="1111110")then
dcc1<="00101";
elsif(dcc="0001101")then
dcc1<="00110";
6
elsif(dcc="0011101")then
dcc1<="00111";
elsif(dcc="1001101")then
dcc1<="01000";
elsif(dcc="1011101")then
dcc1<="01001";
elsif(dcc="1101101")then
dcc1<="01010";
elsif(dcc="1111101")then
dcc1<="01011";
elsif(dcc="0101011")then
dcc1<="01100";
elsif(dcc="0111011")then
dcc1<="01101";
elsif(dcc="1001011")then
dcc1<="01110";
elsif(dcc="1011011")then
dcc1<="01111";
elsif(dcc="1001110")then
dcc1<="10000";
elsif(dcc="1011110")then
dcc1<="10001";
elsif(test='0')then
dcc1<="01111";
elsif(dcc="0111101")then
dcc1<="11111";
elsif(dcc="1111011")then
dcc1<="10011";
end if;
end if;
end process ;
end two;
模块仿真图:
7
2.密码控制模块
该模块是整个电路的控制中心~可以主要完成如下功能:
,1,如果输入数字键~第一个数字会从显示器的最右端开始显示~此后每新按一个数字时~
显示器上的数字必须往左移动一位。
,2,在密码更改~开锁之前必须先核对密码,若输入的数字与预置密码相同~则开锁指
示灯点亮~表示密码锁开锁成功,若输入的数字与预置密码不相同时~密码控制模块中的
计错计数器counter4将会加1~~直到输入三次错误密码时~密码控制模块中的计错计数器
counter4将会计满并产生一个信号arm使密码锁进入死锁状态并且报警~此时须按下复位键
ret密码锁才能继续工作状态。
,3, 密码变更:按下此键将目前输入的数字设定为新的密码。
,4,激活电锁:上锁~上锁之前必须先设定密码才能上锁。
,5,解除电锁:检查输入的密码是否正确~正确才开锁~密码器的密码可以设置成任意位。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity mmkz02 is
port(clr,status,rst,koff: in std_logic;
dcc1:in std_logic_vector(4 downto 0);
counter:std_logic_vector(2 downto 0);
segout:out std_logic_vector(0 to 6);
locks,unlocks,am: out std_logic); end mmkz02;
8
architecture three of mmkz02 is
component qdymq02
port( sin: in std_logic_vector(3 downto 0);
sout:out std_logic_vector(0 to 6));
end component;
signal
lock0,lock1,lock2,lock3,lock4,lock5,dc0,dc1,dc2,dc3,dc4,dc5:
std_logic_vector(3 downto 0);
signal counter3: std_logic_vector(1 downto 0):="00"; signal counter4: std_logic_vector(1 downto 0):="00"; signal d0,d1,d2,d3,d4,d5:std_logic_vector(0 to 6); signal t:std_logic;
begin
process(koff,clr,t )
begin
if(clr='0')then
dc0<="0000";
dc1<="0000";
dc2<="0000";
dc3<="0000";
dc4<="0000";
dc5<="0000";
locks<='0';
unlocks<='0';
am<='0';
elsif(koff'event and koff='1')then
if(dcc1="10000" and status='0')then
lock0<=dc0;
lock1<=dc1;
lock2<=dc2;
lock3<=dc3;
lock4<=dc4;
lock5<=dc5;
locks<='1';
unlocks<='0';
elsif(dcc1="10001" and status='1')then
9
if ( counter4="10") then
am<='1';
else counter4<=counter4+1;
end if;
if(dc0=lock0 and dc1=lock1 and dc2=lock2 and
dc3=lock3 and dc4=lock4 and dc5=lock5)then
locks<='0';
unlocks<='1';
counter4<="00";am<='0';
else counter3<=counter3+1;
end if;
elsif ( counter3="11") then
t<='1';
else
dc0<=dcc1(3 downto 0);
dc1<=dc0;
dc2<=dc1;
dc3<=dc2;
dc4<=dc3;
dc5<=dc4;
end if;
end if;
if(rst='1') then
counter3<="00";
counter4<="00";
end if;
if (dcc1="11111")then
dc0<="0000";
dc1<="0000";
dc2<="0000";
dc3<="0000";
dc4<="0000";
dc5<="0000";
end if;
10
end process ;
u1:qdymq02 port map(sin=>dc0,sout=>d0); u2:qdymq02 port map(sin=>dc1,sout=>d1); u3:qdymq02 port map(sin=>dc2,sout=>d2); u4:qdymq02 port map(sin=>dc3,sout=>d3); u5:qdymq02 port map(sin=>dc4,sout=>d4); u6:qdymq02 port map(sin=>dc5,sout=>d5); segout<=d0 when counter="000" else
d1 when counter="001" else
d2 when counter="010" else
d3 when counter="011" else
d4 when counter="100" else
d5 when counter="101" else
"0000000";
end three;
模块仿真图:
密码设置为012345~上锁指示灯点亮
输入密码为012345~开锁指示灯点亮
11
四(七段显示译码电路
七段显示译码电路的主要功能是将输入代码转换成相应的数字显示代码~并在数码管
上显示出来。
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all; entity qdymq02 is
port(sin:in std_logic_vector(3 downto 0);
sout:out std_logic_vector(0 to 6)); end qdymq02;
architecture a of qdymq02 is
begin
sout<="1111110" when sin="0000" else
"0110000" when sin="0001" else
"1101101" when sin="0010" else
"1111001" when sin="0011" else
"0110011" when sin="0100" else
"1011011" when sin="0101" else
"1011111" when sin="0110" else
"1110000" when sin="0111" else
"1111111" when sin="1000" else
"1111011" when sin="1001" else
"1110111" when sin="1010" else
"0011111" when sin="1011" else
"1001110" when sin="1100" else
"0111101" when sin="1101" else
"1001111" when sin="1110" else
"1000111" when sin="1111" else
12
"0000000";
end a;
模块仿真图:
六(系统仿真图
密码设置为012345~上锁指示灯亮
输入密码为012345~开锁指示灯点亮
13
七(硬件验证
芯片型号:本实验采用三星公司的cyclone下EP1C12Q240C8N芯片,用EDA600试验箱验证。 引脚图如下:
设置密码成功时~上锁指示灯点亮~此时密码设置为113366
14
输入密码正确时~开锁指示灯亮~此时输入密码为113366
15