设计四数字电子密码锁docWord下载.docx
- 文档编号:20472856
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:21
- 大小:222.08KB
设计四数字电子密码锁docWord下载.docx
《设计四数字电子密码锁docWord下载.docx》由会员分享,可在线阅读,更多相关《设计四数字电子密码锁docWord下载.docx(21页珍藏版)》请在冰豆网上搜索。
图1
(1)矩阵式键盘工作原理:
矩阵式键盘是一种常见的输入装置,在计算机、电话、手机、微波炉等各工电子产品中被广泛应用。
如图2所示为一4×
4矩阵式键盘。
矩阵式键盘以行、列形式排列,图中为4行4列,键盘上的每一个按键盘其实是一个开关电路,当某键被按下时,该按键所对应的位置就呈现逻辑0的状态,键盘的扫描可以以行扫或列扫方式进行,图中为行扫方式,KEYR3—KEYR0为扫描信号,其中的某一位为0即扫描其中的一行,具体见表1。
表1键盘扫描与其对应的键值的关系
KEYR3..0
KEYC3..0
对应的按键
0111
7
1101
1
1011
8
2
9
3
1110
开锁键
密码修改键
4
5
#
6
退格键
上锁键
确认键
键盘扫描信号KEYR3与第一行相连,KEYR2与第二行相连,依此类推。
很显然,扫描信号的变化顺序为:
0111、1011、1101、1110,周而复始。
在扫描的过程中,当有键按下时,对应的键位就为逻辑0状态,从而从KEYC3..0读出的键值相应列为0,具体情况如表1所示。
若从KEYC3..0读出的值全为1时,表示没有键被按下,则不进行按键的处理。
如果的键被按下,则将KEYC3..0读出的送至键盘译码电路进行译码。
(2)时钟产生电路
在一个系统的设计中,往往需要多种时钟信号,最方便的方法是利用一个自由计数器来产生各种需要的频率。
本电路需要:
系统主时钟CLK、扫描状态产生时钟clkouta和动态扫描时钟clkoutb,其中系统主时钟CLK为输入时钟,由20MHZ晶振产生。
程序清单:
LIBRARYieee;
USEieee.std_logic_1164.ALL;
USEIEEE.STD_LOGIC_ARITH.ALL;
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITYclkdivIS
PORT(CLK:
INSTD_LOGIC;
clkouta,clkoutb:
OUTSTD_LOGIC);
ENDclkdiV;
ARCHITECTURErtlOFclkdiVIS
SIGNALCLKA:
STD_LOGIC;
Begin
PROCESS(CLK)
VARIABLES:
INTEGERRANGE200DOWNTO0;
IFCLK'
EventANDCLK='
1'
then
IFS<
200THEN
S:
=S+1;
CLKA<
='
0'
;
ELSES:
=0;
ENDIF;
ENDIF;
ENDPROCESS;
PROCESS(CLKA)
INTEGERRANGE100DOWNTO0;
IFCLKA'
EventANDCLKA='
10THEN
CLKOUTa<
clkoutb<
ELSIFS<
20THEN
=S+1;
CLKOUTb<
50THEN
70THEN
100THEN
endrtl;
说明:
CLK时钟经过两次分频,得到扫描状态产生时钟clkouta和动态扫描时钟clkoutb均是1KHZ,但是扫描状态产生时钟clkouta的高电平部分完全包含动态扫描时钟clkoutb的高电平部分,目的在于先使用时钟clkouta的上升沿产生扫描状态的变化,再使用时钟clkoutb的上升沿产生键盘扫描信号。
仿真波形:
(3)键盘扫描电路
目标:
提供键盘扫描信号SCAN_OUT,即表1中的KEYR3..0,变化顺序依次为0111、1011、1101、1110....依次重复出现。
ENTITYscanIS
PORT(CLKA,CLKB:
SCAN_STATE:
OUTSTD_LOGIC_VECTOR(1DOWNTO0);
SCAN_OUT:
OUTSTD_LOGIC_VECTOR(3downto0));
ENDscan;
ARCHITECTURErtlOFscanIS
SIGNALS:
STD_LOGIC_VECTOR(1DOWNTO0);
S<
PROCESS(CLKB,S)
IFCLKB'
EventANDCLKB='
CASESIS
WHEN"
00"
=>
SCAN_OUT<
="
1110"
01"
="
1101"
10"
1011"
11"
0111"
WHENOTHERS=>
1111"
ENDCASE;
SCAN_STATE<
=S;
ENDrtl;
程序中,S信号是用来产生扫描信号的四个状态SCAN_STATE:
00、01、10、11,再利用动态扫描时钟的上升沿产生扫描信号:
0111、1011、1101、1110。
(4)键盘消抖电路
因为按键大多是机械式开关,在开关切换的瞬间会在接解点出现来回弹跳的现象,其现象可用图3表示。
由图可见,虽然只是按了一次键,实际产生的按键信号却不只跳动一次,将会造成误码判,认为是按了两次键。
如果调整取样时钟周期,可以发现抖现象得到了改善。
通过时序图可见:
在按键过程中可能有三种情况发生,
抖动发生在时钟的某个上升沿,此时的输入信号为低电平,则输出为低电平;
抖动发生在时钟的某个上升沿,但此时的输入信号抖动为高电平,由于按键(低电平)时间通常在200ms以上,则在下一个上升沿输出为低电平;
抖动发生在时钟信号的两个相邻上升沿之间,则在第二个上升沿输出高电平。
释放键盘时的情况类似,可见,只要时钟周期大于抖动时间而远小于按键时间,去抖电路即可正确识读按键次数。
一般键盘在被按下和释放时会造成持续时间不大于10ms的信号抖动,而按键时间通常在200ms以上,所以可以使用较低频率的时钟信号作为消抖时钟。
程序清单:
ENTITYdebouncingIS
PORT
(clkSCAN:
INSTD_LOGIC;
d_in:
INSTD_LOGIC_VECTOR(3DOWNTO0);
d_out:
OUTSTD_LOGIC_VECTOR(3DOWNTO0));
ENDdebouncing;
ARCHITECTUREaOFdebouncingIS
signalTEMPA,TEMPB,TEMPC,TEMPD,TEMPE:
STD_LOGIC_VECTOR(3DOWNTO0);
signalCOUNT:
BEGIN
process(clkSCAN)
begin
ifclkSCAN'
eventandclkSCAN='
TEMPA<
=D_IN;
IFTEMPE=D_INTHEN
IFCOUNT>
1000"
THEN
COUNT<
D_OUT<
ELSE
=COUNT+1;
ELSE
0000"
endprocess;
TEMPB<
=TEMPA;
TEMPC<
=TEMPB;
TEMPD<
=TEMPC;
TEMPE<
=TEMPD;
ENDa;
将d_in信号去抖后送给D_OUT,其中d_in信号的变化规律是四个扫描时钟周期内仅有一个时钟周期为输入按键值,其余时间保持为“1111”。
(5)键盘译码电路
从前面的键盘扫描电路的输出可以看出,扫描得到的信号规律性不强,例如数字键主要用来输入数字,但键盘扫描输出无法拿来直接使用,必须对其进行译码才能使用,如表1所示。
ENTITYKEYBOARD_DECIS
PORT(
clkSCAN:
S:
INSTD_LOGIC_VECTOR(1downto0);
d_IN:
INSTD_LOGIC_VECTOR(3downto0);
--keycodeafterdebounce
out_numb:
OUTSTD_LOGIC_VECTOR(3downto0));
ENDKEYBOARD_DEC;
--******************************************************
ARCHITECTUREaOFKEYBOARD_DECIS
signalZ:
std_logic_VECTOR(5downto0);
--SCANCODE
Z<
=S&
d_IN;
PROCESS(clkSCAN)
IFCLKSCAN'
EVENTANDCLKSCAN='
THEN
caseZis
when"
110111"
=>
out_numb<
;
--0
100111"
0001"
--1
101011"
0010"
--2
101101"
0011"
--3
010111"
0100"
--4
011011"
0101"
--5
011101"
0110"
--6
000111"
--7
001011"
--8
001101"
1001"
--9
111101"
1010"
--BACKSPACE
111110"
--ENTER
101110"
1100"
--MODIFYNUM
011110"
--LOCK;
001110"
--UNLOCK;
whenothers=>
endcase;
ENDIF;
键盘译码电路根据键盘输入数据d_IN和扫描状态S进行译码out_numb,数字键为:
0、1、2、3、4、5、6、7、8、9,功能键为:
退格键、确认键、修改键、上锁键和解锁键,out_numb=“1111”表示无任何操作。
(6)按键存储电路
键盘译码后,可以看出,译码值不等于“1111”时表示有按键动作发生,当译码值等于长时间“1111”时,表示无按键动作发生,所以可以根据译码值产生按键动作发生的标示信号和按键的译码值。
ENTITYnum_or_fun_DECIS
in_num:
change_clk:
outSTD_LOGIC;
out_num:
ENDnum_or_fun_DEC;
ARCHITECTUREaOFnum_or_fun_DECIS
signaltemp_num:
STD_LOGIC_VECTOR(3downto0);
variablecount,counta:
std_logic_vector(2downto0);
ifin_num="
then
ifcount<
7then
count:
=count+1;
else
change_clk<
111"
counta:
000"
endif;
else
temp_num<
=in_num;
if(counta<
3)then
=counta+1;
011"
out_num<
=temp_num;
当按键译码值in_num不等于“1111”时,按键发生标示信号change_clk='
,按键译码输出值out_num等于按键译码值。
2、电锁控制电路设计
电锁控制电路是整个电路的控制中心,主要完成如下功能:
1、数字按键输入部分
如果输入数字键,第一个数字会从显示器的最右端开始显示,此后每新按一个数字时,显示
器上的数字必须往左移动一位。
若想要更改输入的数字,可按退格键来清除前一个输入的数字,或按清除键清除输入的所有
数字,再重新输入3位数字。
既然设计的是三位电子密码锁,当输入的数字键超过3位时,电路不应理会。
2、功能键输入部分
退格键:
清除前一个输入的数字,如果数字全部清除,则回到前一个状态(例如上锁或者解锁等)。
密码核对:
在密码更改,开锁之前必须先核对密码。
密码修改:
按下此键先输入原密码,核对后将新输入的数字设定为新的密码。
上锁:
按上锁键可以直接上锁。
解锁:
检查输入的密码是否正确,正确才开锁。
万用密码:
电锁维护者使用。
三位电子密码锁
ENTITYcontrolIS
PORT(reset,d_clk:
instd_logic;
led_alarm:
outstd_logic;
led_flag,leda,ledb,ledc:
inoutSTD_LOGIC_VECTOR(3downto0)
);
ENDcontrol;
ARCHITECTUREaOFcontrolIS
TYPESTATE_TYPEIS(lock_idle,lock,unlock_idle,unlock,modify,new_num,alarm,num_one,
num_two,num_three);
SIGNALstate:
STATE_TYPE;
signallock_rega,lock_regb,lock_regc:
std_logic_vector(3downto0);
signallocked,unlock_modify_flag:
std_logic;
PROCESS(reset,state,d_in,d_clk)
variablealarmcnt:
std_logic_vector(1downto0);
ifreset='
state<
=lock_idle;
leda<
ledb<
ledc<
alarmcnt:
locked<
led_flag<
unlock_modify_flag<
lock_rega<
lock_regb<
lock_regc<
elsif(d_clk'
eventandd_clk='
)then
iflocked='
CASEstateIS
WHENlock_idle=>
IFd_in="
then--unlock
=unlock;
ELSifd_in="
then--modify
=modify;
ELSE
WHENunlock=>
ifd_in="
then--lock_idle
=lock_IDLE;
ELSifd_in<
"
then--num_one
=num_one;
=d_in;
WHENnum_one=>
then--backspace
caseled_flagis
when"
state<
=lock;
=new_num;
whenothers=>
null;
endcase;
then--num_two
=num_two;
=d_in;
=leda;
WHENnum_two
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 数字 电子 密码锁 doc