电子密码锁.docx
《电子密码锁.docx》由会员分享,可在线阅读,更多相关《电子密码锁.docx(10页珍藏版)》请在冰豆网上搜索。
电子密码锁
基本要求:
1、设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;
2、在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关(设置成8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,开锁;
3、从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号,并输出一个信号推动LED不断闪烁。
一、总体设计思想
1.基本原理
本次设计的主要内容是设计一个密码锁的控制电路,第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,当输入正确代码时,输出开锁信号以推动执行机构工作。
此密码锁的基本要求是:
设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关的输入代码等于储存代码时,开锁;从第一个按钮触动后的5秒内若未将锁打开,则电路自动复位并进入自锁状态,使之无法再打开,并由扬声器发出持续20秒的报警信号,并输出一个信号推动LED不断闪烁。
随着电子产品向智能化和微型化的不断发展,EDA技术作为现代电子设计最新技术的结晶,给电子系统的设计带来了革命性的变化。
本设计一种电子密码锁系统,该系统具有软硬件设计简单、易于开发、成本低、安全可靠、操作方便等特点,可作为产品进行开发,应用于住宅,办公室的保险箱及档案等需要防盗的场所,有较强的实用性。
本系统由QuartusII软件、矩阵键盘、LED显示和报警系统组成。
4*4键盘组成0~9数字键,每按下一个键,相关键的值在数码管上显示,并依次左移;能够清除密码输入,并设置预置密码为“1234”;修改密码时,将当前输入设为新的密码;能完成上锁和开锁功能;当输入密码和预置密码一样时即可开锁。
具有确认、取消、修改、开锁、闭锁功能,用7段数码管组成显示电路提示信息。
2.设计框图
本次设计是采用一种是用QuartusII软件编程,利用VHDL描述数字系统的结构,行为,功能和接口,及其控制的准确性,来实现密码锁的设计。
VHDL编程有较大的活动空间,不但能实现锁要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级。
在安全技术防范领域,具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,客服了机械式密码锁密码量少、安全性能差的缺点,使密码锁无论在技术上还是在性能上都有大大提高一步。
随着大规模集成电路技术的发展,特别是VHDL的问世,出现了带微处理的智能密码锁,它除具有电子密码锁的功能外,还引入了智能化管理、专家分析系统等功能,从而使密码锁具有很高的安全性、可靠性,应用日益广泛。
具体设计框图如下图所示:
二、设计步骤和调试过程
1、总体设计电路
2、模块设计和相应模块程序
主程序作为整个系统中最重要的部分,设计相当繁琐,而且还承担着其它子程序的连接任务,所以显得尤为重要,如果这个部分出了问题,那整个系统将会瘫痪。
首先是键盘输入电路,键盘的输入电路部分又分为键盘去抖电路和密码锁输入电路,下面先介绍键盘去抖电路部分。
键盘消抖部分是由两个小的模块集成为一个去抖电路的,所以在此分开介绍此两个模块。
第一个是DCFQ模块,如左图所示,模块外部信号端口为,CLK:
时钟脉冲输入端口,为电路提供原始始终信号,CLRM:
清零信号输入端口,PRN:
置位信号输入端口,Q:
信号输出端口。
DCFQ模块的主要程序为如下,此段程序作用是判断输入信号是否有效,如有效则输出,无效清零。
IFCLRN='0'ANDPRN='1'THENQ<='0';
ELSIFCLRN='1'ANDPRN='0'THENQ<='1';
ELSIFCLK'EVENTANDCLK='1'THENQ<=D;ENDIF;
第二个是,DEBOUNCING模块模块外部信号端口如左图所示,其中D-IN:
信号输入端口,CLK:
时钟脉冲输入端口。
模块的内部信号有:
VCC:
模块内部信号,控制清零,Q0:
寄存D触发器处理过的信号,Q1:
与Q0信号做差分处,D1:
模块内部信号,D0:
模块内部信号,QQ0,QQ1,D_OUT1,DD0,DD1是为便于仿真时观察中间,结果而增加的观测点的输出端口(删除无影响)。
DEBOUNCING模块主要程序如下:
U1:
DCFQPORTMAP(CLK=>CLK,CLRN=>INV_D,PRN=>VCC,D=>VCC,Q=>Q0);U2:
DCFQPORTMAP(CLK=>CLK,CLRN=>Q0,PRN=>VCC,D=>VCC,Q=>Q1);PROCESS(CLK)BEGINIFCLK'EVENTANDCLK='1'THEND0<=NOTQ1;D1<=D0;ENDIF;ENDPROCESS;DD0<=D0;DD1<=D1;QQ1<=Q1;QQ0<=Q0;
D_OUT<=NOT(D1ANDNOTD0);
D_OUT1<=NOTQ1ENDARCHITECTUREART;
这段程序的作用就是通过对信号的分频处理,从而将按键产生的不规则信号转换为便于识别的按键信号,达到消除抖动的目的。
其次是密码锁输入电路,密码锁输入电路元件如右图所示:
其中模块外部信号端口有:
CLK-1K:
时钟脉冲输入端口,KEY-IN:
按键输入端口,CLK_SCAN:
键盘扫描序列(仿真时用),DATA_N:
数字输出端口,DATA_F:
功能输出端口,FLAG_N:
:
数字输出标志,FLAG_F:
功能输出标志,CLK_CTR:
控制电路工作时钟信号,CLK_DEBOUNCE:
去抖电路工作时钟信号(仿真时用)
其中模块内部信号:
CLK:
电路工作时钟脉冲,C_KEYBOARD:
键扫信号“00-01-10-11”寄存器,C_DEBOUNCE:
去抖时钟信号,C:
键盘输入去抖后的寄存器,N,F:
数字、功能按键译码值的寄存器,FN,FF:
数字、功能按键标志值数字、功能按键,SEL:
模块内部信号,Z:
按键位置信号,密码锁输入电路主要程序为:
KEY_DECODER:
BLOCKSIGNALZ:
STD_LOGIC_VECTOR(4DOWNTO0);
BEGINPROCESS(CLK)BEGINZ<=C_KEYBOARD&C;
IFCLK'EVENTANDCLK='1'THENCASEZISWHEN"11101"=>N<="0000";
WHEN"00011"=>N<="0001";WHEN"00101"=>N<="0010";WHEN"00110"=>N<="0011";WHEN"01011"=>N<="0100";WHEN"01101"=>N<="0101";WHEN"01110"=>N<="0110";WHEN"10011"=>N<="0111";WHEN"10101"=>N<="1000";WHEN"10110"=>N<="1001";WHENOTHERS=>N<="1111";
ENDCASE;ENDIF;IFCLK'EVENTANDCLK='1'THENCASEZIS
WHEN"11011"=>F<="0100";WHEN"11110"=>F<="0001";WHENOTHERS=>F<="1000";ENDCASE;ENDIF;ENDPROCESS;
这段程序的作用是通过按键产生的信号进行译码,判断按键是数字还是上锁、解锁控制信号。
其中还包括密码锁控制电路,密码锁控制电路组成有:
模块外部信号端口:
CLK:
时钟脉冲输入端口,DATA_N:
数字输入端口,DATA_F:
功能输入端口,FLAG_N:
数字输入标志,FLAG_F:
功能输入标,EMLOCK:
密码锁控制信号输出端口,DATA-BCD:
按键显示输出端口
模块内部信号有:
ACC:
暂存键盘输入信息,REG:
密码存储位置,RR2:
寄存器清零信号,R1,R0:
模块内部信号,二者差分生成清零信号,NC:
移位寄存,
QA,QB:
上锁、解锁控制信号。
密码锁控制电路主要程序为:
KEYIN_PROCESS:
BLOCKISSIGNALRST,D0,D1:
STD_LOGIC;BEGINRST<=RR2;PROCESS(FLAG_N,RST)ISBEGIN
IFRST='1'THENACC<="0000000000000000";NC<="000";ELSE
IFFLAG_N'EVENTANDFLAG_N='1'THENIFNC<4THENACC<=ACC(11DOWNTO0)&DATA_N;NC<=NC+1;ENDIF;ENDIF;ENDIF;ENDPROCESS;
ENDBLOCKKEYIN_PROCESS;
以上程序的作用是清除、暂存按键输入数据,每输入一个数字,在数码管显示时都左移一位,直到输入位数达到4位,4位以后不再显示。
LOCK_PROCESS:
BLOCKISBEGIN
PROCESS(CLK,DATA_F)IS
BEGIN
IF(CLK'EVENTANDCLK='1')THEN
IFNC=4THEN
IFDATA_F
(2)='1'THEN--上锁控制信号有效
REG<=ACC;--密码存储QA<='1';QB<='0';
ELSIFDATA_F(0)='1'THEN--开锁控制信号有效
IFREG=ACCTHEN--密码核对
QA<='0';QB<='1';
ENDIF;
ELSIFACC="1000100010001000"THEN
QA<='0';QB<='1';
ENDIF;
这段程序的作用是在按下*键时将输入的密码跟已经存储的密码进行对比,如果一样,则密码锁开锁。
而在通过密码验证后可以按#键重新设定密码。
在这里值得注意的是有一个密码“8888”作为万用密码,也就是不论当前密码是什么,只要输入的密码为8888,则都可通过密码锁。
此次设计中还有必不可少的密码锁显示电路如下图所示:
其中模块外部信号端口为:
DATA-BCD:
密码信号输入端口,BLOCK:
密码锁状态信号显示灯。
根据设计要求,总程序为:
libraryieee;useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
entitylockisport(clk_1k:
instd_logic;--频率输入管脚
enter_2,enter_1:
instd_logic;--设密码确认及输入密码确认datain:
instd_logic_vector(3downto0);--密码数据输入
speaker:
outstd_logic;--喇叭
led_g,led_r:
outstd_logic);--绿灯及红灯
endentitylock;
architecturebehaveoflockis
signalram:
std_logic_vector(3downto0);
signaljudge:
std_logic;
signalclk:
std_logic;
signalturn_on,turn_off:
std_logic;
begin
process(Clk_1k)
variableclk_count:
std_logic_vector(8downto0):
="000000000";
begin
ifclk_1k'eventandclk_1k='1'then--分频
ifclk_count<511then
clk_count:
=clk_count+1;
else
clk_count:
="000000000";
clk<=notclk;endif;endif;endprocess;
process(datain,enter_1)--设置密码
begin
ifenter_1'eventandenter_1='1'then
ram<=datain;
endif;endprocess;
process(clk_1k)--判断第一位密码按下时开始计时
begin
ifclk_1k'eventandclk_1k='1'thenifenter_1='0'thenjudge<='0';endif;
ifjudge='0'andenter_1='1'then
ifdatain/=ramthenjudge<='1';endif;endif;endif;endprocess;
process(judge,clk,enter_2)
variablecount:
std_logic_vector(4downto0):
="00000";
variablejudge_sh:
std_logic_vector(1downto0):
="00";
variableswitch:
std_logic:
='0';--判断是否锁定键盘
begin
ifclk'eventandclk='1'then
ifenter_1='0'then--数据复位
count:
="00000";judge_sh:
="00";switch:
='0';
endif;
ifswitch='0'then
ifjudge='1'then
ifcount<"0101"thencount:
=count+1;
ifenter_2='1'then
ifdatain=ramthen
turn_on<='1';turn_off<='0';switch:
='1';--开锁
elseifjudge_sh<"10"thenjudge_sh:
=judge_sh+1;turn_on<='1';turn_off<='1';switch:
='0';
elseturn_on<='0';turn_off<='1';switch:
='1';endif;endif;elseturn_on<='0';turn_off<='0';switch:
='0';--等待下次输入
endif;elseturn_on<='0';turn_off<='1';switch:
='1';
endif;endif;endif;endif;endprocess;
process(clk,clk_1k,turn_on)
beginifclk'eventandclk='1'then
ifenter_1='0'then--数据复位
count:
="0000";count_sh:
="00";temp:
='0';temp_sh:
='0';
endif;ifturn_on='0'andturn_off='1'then
ifcount<"10100"then--响20秒
count:
=count+1;temp:
='1';led_g<='0';led_r<='1';
elsetemp:
='0';endif;endif;
speaker<=(temportemp_sh)andclk_1k;--驱动喇叭
endprocess;endbehave;
3、仿真及仿真结果分析
弹跳消除仿真破型:
密码锁输入模块仿真波形图:
控制电路仿真波形:
显示模块仿真波形:
本次的设计基本完成了设计的要求,设计出的密码锁有4*4键盘输入,LED数码显示,蜂鸣器设置。
具有数字键和确认删除功能,同时用户可根据需要修改密码,密码超次报警功能。
基本完成了预期的目标,系统硬件调试花费时间较长,最终基本达到了预期的目标,配合软件仿真的实现。
本次设计较为完善。
本次设计在键盘操作,及数码管显示电路的研究较为详细。
实时显示方面做的比较好。
但是由于时间仓促、条件有限,设计成果并不是很完美,但对于这一整个电子密码锁系统,设计的程序已经基本实现
三、结论及心得体会
通过这次设计,使我对EDA产生了浓厚的兴趣。
特别是当每一个子模块编写调试成功时,心里特别的开心。
这次EDA课程设计历时一个星期,在这些日子里,可以说是苦多于甜,但是可以学的到很多很多的东西,同时不仅可以巩固以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
这次设计的密码锁还是比较成功的,虽然在设计中遇到了很多问题,最后在同学的帮助下外加上自己的努力,终于都得到了解决,因此很有成就感,终于觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的。
参考资料
[1]潘松著.EDA技术实用教程(第二版).北京:
科学出版社,2005.
参考文献:
[2]刘常澍,赵雅兴.数字电路与FPGA[M].北京:
人民邮电出版社,
2004.
[3]任晓东,文博.CPLD/FPGA高级应用开发指南[M].北京:
电子工
业出版社,2003.
[4]汉泽西.EDA技术及其应用[M].北京:
北京航空航天大学出版
社,2004.
[5]王小军.VHDL简明教程[M].北京:
清华大学出版社,1997.