1、 密码锁设计报告 摘要:本系统是由PLD、EEPROM、LED显示、键盘和报警系统所组成的密码锁。系统完成键盘输入、开锁、超时报警、修改用户密码、输入位数显示、错误密码报警、复位等数字密码锁的基本功能。关键字:数字密码锁 GAL16V8 28C64 解锁与报警目录:一、 技术指标1、 系统功能要求 32、 系统结构要求 33、 电气指标 34、 设计条件 3二、 整体方案设计 4三、 单元电路设计1、 键盘录入 52、 键盘消抖电路 63、 计数与显示 84、 密码比较 85、 密码判断 96、 超时判断 107、 修改密码 118、 复位 12四、 整体电路和整机元件清单1、 整体电路 13
2、2、 所用元件清单 13五、 程序清单1、 第一片GAL 142、 第二片GAL 15六、 测试与调整1、 10进制数字输入 162、 CP脉冲 163、 密码比较 174、 延时判断 175、 程序测试(整体测试)17七、 设计小结1、 设计任务完成情况 182、 问题及改进 183、 心得体会 19一、技术指标1. 系统功能要求 密码锁:用数字键方式输入开锁密码,输入密码时开锁;如果输入密码有误或者输入时间过长,则发出警报。2. 系统结构要求密码锁的系统结构框图如下图 1-1 所示,其中数字键盘用于输入密码,密码锁用于判断密码的正误,也可用于修改密码。开锁LED1亮表示输入密码正确并开锁,
3、报警LED2亮表示密码有误或者输入时间超时。密 码 锁开锁LED1数字键盘输入密码报警LED2图1-1 密码锁系统结构框图3. 电气指标3.1 开锁密码为8位十进制数字,由按键输入,按“确认”键后,输入的数字有效。3.2 输入的8位数字与预设的密码相同时开锁,用绿灯亮,红灯灭表示。数据有误时或输入的密码时间过长即报警,红灯亮。3.3 密码可以通过键盘设定或修改。3.4 输入的数字间隔时间小于或等于15s。超过时限则报警,同时电子锁复位。3.5 具有手动、自动复位功能。4. 设计条件4.1 电源条件:稳压电源提供+5V电压。4.2 可供选择的元器件如表1-1所示型号名称及功能74374锁存器74
4、74D触发器28C64EEPROM 存贮器74854位比较器741614位二进制计数器741648位移位寄存器GAL16V8可编程逻辑器件F555定时器74123可重触发器表1-1 器件单门电路、电阻、电容以及发光二极管自定。二、整体方案设计 设计原理整体方案如下: 控制读写报警存储器地址数据判断控制比较器移存器开锁译码,CP 延时判断定时器clock数据cp按键次数显示输出出计数器按键输入图2-2 密码锁的工作原理框图由以上框图可知,当按下数字键0、1、2、3、4、5、6、7、8、9后,编码器逐一进行十二进制编码,此时产生按键信号。按键信号经计数器,产生存储器的地址信号。解锁时,存储器中相应
5、的数据输出与输入的密码经比较器比较后,将结果存入移存器。8位的比较结果送到GAL,判决是否正确,并开锁或报警。设定密码时,每输入一位,计数器加一,则可依次修改。三、单元电路设计1. 键盘录入 由于键盘有09,而ROM中数据以十进制存储,则要将案件进行10进制到2进制的转换。使用可编程逻辑器件GALl16V8,电路非常简单,连线少,比较实用。 将按键编号和输出四位二进制码相对应,列出真值表(表3-1)。序号按键D0D1D2D30A010101A100012A200103A300114A401005A501016A601107A701118A810009A91001表 3-1 按键编码真值表根据真
6、值表,用CUPL语言写出逻辑关系:D3=A0#A8#A9;D2=A4#A5#A6#A7;D1=A0#A2#A3#A6#A7;D0=A1#A3#A5#A7#A9; 电路设计:每个键按下,产生一个高电平脉冲,并把按下的数字键译码输出:图3-2键盘输入为保护电路,接入排阻。2. 键盘消抖电路机械键盘在使用过程中会产生机械抖动,即会产生多个脉冲信号(有稍高频的毛刺),使输出的时钟不稳定,影响后级工作。可让CP触发输出,消除高频毛刺。由于密码通过机械开关输入,频率很低(因本次实验提供的开关不大方便操作,一般按键频率不大于1hz),则触发低频略高即可,取510hz即可。用F555做定时器,设计电路如下:图
7、3-2-1 555定时电路555定时器的频率表达式为:f=1.43/((RA+2RB)*C)。取RB=3K,RA=2K,C=220u,测试得f=7.1hz,能达到要求。将clock接至G16V8的1脚,且使用触发输出:CP.D=A0#A1#A2#A3#A4#A5#A6#A7#A8#A9,此时在每次键按下时都会产生一个脉冲,且消除了毛刺。(注:GAL的一个函数表达式中或项不能超过7个,所以可写成CP.D=D0#A0#A2#A4#A6#A8,这样既满足条件,又节省了GAL的管脚资源。)消抖效果图如图3-2-1所示:CPIN为含毛刺的输入信号(因抖动,产生一些不正常的高频信号)GAL的时钟为CLOC
8、K,为110hzCPIN.D为消抖输出从图中看出,在D触发输出后,毛刺被有效去除了。图3-2-1消抖效果图3. 计数与显示将CP送入计数器,得到的是按键次数,也是ROM的地址信号。因8位密码较长,使用者在输入时可能忘记已输入密码的位数。为构建更好的人机界面,将计数结果用7448译码,用7段数码管输出。电路如下:图3-3 计数与显示编码器采用7448,为正常输出结果,使用共阴的数码管。4. 密码比较由于CP信号对于按键稍有延迟,如将按键的译码与从ROM中取出的数据进行比较,则会出错,所以在比较器之前加一级锁存器,在时钟CP的控制下,此时才能实现输入密码与原有密码的对应位同时到达比较器。电路如下:
9、图3-4-1 密码比较重要时序分析:密码锁从清零开始工作:当按下第一位密码时,按键的译码立即输出,CP滞后输出,在CP的上升沿,74374锁存器开始工作,锁入数据,此时送到锁存器口数据是键盘输入的译码和ROM地址0000(B)的数据,并不是地址0001的数据。所以在ROM中存入数据从地址0开始。时序如下图所示:图3-4-2 锁存时序图5. 密码判断经过7485,只能比较密码的1位,使用移存器就能将比较结果先储存,经过8个脉冲周期后同时输出。为节约GAL16V8的I/O口,可使用一片7485,先将5位比较结果处理,剩下的三位接到GAL,再比较。在密码全部输入后,要按下“确认”键,则GAL判断密码
10、是否正确。数据经7485等后,数据到达74164时,数据有一定的延时。假如74164的时钟=CP,当第一的CP到来时,第一位的比较结果还没从7485出来,即第一位锁进的不是第一位的比较结果。所以,锁存的时钟应比CP慢,可以定义CP2=!CP,此时,CP2比CP的上升沿晚的时间就是手按键的时间。从而保证锁存8次后输出的就是8位的比较结果。图3-5 8位密码比较结果处理假如输入正确密码,并按下确认键,则成功开锁。6. 超时判断指标要求当输入的数字间隔小于或等于15s时超时报警。设计采用74123可重触发器和7474 D触发器配合程序控制。电路图如下: 图3-6-1 74123可重触发器B端输入,O
11、T触发输出。tw=15s,tw=0.45RC,则设定R=150K,C=220u,则计算得出tw=14.8s。若要提高15s计时精度则选取更精确得电容和电阻,且系数0.45可能有相应更正。74123工作时序如下:图 3-6-2 74123工作时序在复位后,OT=0,开始输入后,当间隔时间小于15s时,OT=1,当间隔时间大于15s时,OT=0。 图3-6-3 D触发器 D=1,复位后输出KIN=0,当有键按下,在CP的第一个上升沿,KIN输出恒为1,直至下个复位信号。即KIN为有键按下的标记位。将OT和KIN信号送给GAL,则可得出输入延时的判断表达式:F2=!OT&KIN。7. 修改密码密码存
12、储在EEPROM中,修改密码,就是对28C64中的数据进行修改。28C64共有8K*8的存储容量。而本次密码锁需要的存储空间仅需8位*4b。其实是一个巨大的浪费。28C64有13根地址线(A0A12)和8根数据线(D0D7),为操作方便,将A3A12、D4D7全部置零。则数据存储在前8个单元。地址线与74161的输出相连。数据线从GAL的译码输出读出数据。因在进行密码比较时,要将GAL的译码数据和ROM中数据相比较,则GAL与ROM不能直接相连,可在之间加上模拟开关CD4066进行隔离。4066仅在修改密码时将GAL和ROM相连。具体连接电路如下:图3-7-1 28C64连接图具体逻辑分析:修
13、改密码:对28C64进行写操作,手册参考时序如下:图3-7-2 28C64写时序因GAL不能控制复杂的时序,所以修改密码时,操作比较繁琐。将 CE=0(一直工作),RO=1(输出禁止),CON=1(使GAL数据与28C64连接)。按下第一位密码,复位后,地址为0,然后按下“设置”键 ,通过GAL,给RW(低脉冲,写入数据),此时第一位密码就修改成功了。然后按下第二位密码,按下“设置”,依次设置8位密码。 当密码设置完成后,RO=0,CE=0,RW=1(写入禁止),为正常工作状态。8. 复位 复位功能包括手动复位和自动复位。手动复位:清除输入密码,将所有寄存器归零。则将74161、74164、7
14、4123、7474的清零端全部接在一起,复位键(RS)按下,GAL清零端CLR输出一个低电平脉冲,方程为:CLR=!RS。自动复位:如解锁完毕(即密码输入完成后,按下“ENT” ),开锁或报警后,所有寄存器清零。若将方程写成CLR=!ENT,此时是组合逻辑输出,一按下“ENT”,就复位了,此时报警结果还没输出,74164全零输入,则肯定会报警,失去密码锁判断的意义。所以复位一定在正确解锁后开始,可以借助GAL内部的触发器来完成这个功能:CLR.D=!ENT。GAL的时钟任为555的输出时钟,几hz的脉冲。则在开锁后几百ms后复位,开锁是个瞬时动作即可。为方程式的简洁,复位方程可表示为:CLR.
15、D=!(ENT#RS),此时手动复位稍有延迟(ms级),在实际应用中,延时是完全可以忽略的。四、 整体电路和整机元件清单1. 整体电路见附录2. 所用元件清单本设计除了老师建议的一些芯片,我还使用了少量其他数字芯片,完成了要求外的一些指标,使用的芯片如下:型号名称及功能数量74374锁存器17474D触发器128C64EEPROM 存贮器174854位比较器2741614位二进制计数器1741648位移位寄存器1GAL16V8可编程逻辑器件2F555定时器140664路模拟开关174123可重触发器17448显示译码器1表4-1 所用元件清单电容、电阻、发光二极管、导线若干,面包板一块。五、程
16、序清单设计中使用2片GAL16V8,第一片主要用于译码,第二片主要用于控制。1 第一片GAL功能:键盘解码,产生时序电路需要的CP及CP2管脚连接及命名: Name KEY-CODE-2 ;Partno ;Revision 1 ;Date 2009-9-23 ;Designer ZHUZI ;Company Altium Limited ;Assembly ;Location ;Device G16v8 ;Format ;PIN1,11=CLK,OE;/* Inputs */Pin 2,3,4,5,6,7,8,9,12,13 = A0,A1,A2,A3,A4,A5,A6,A7,A8,A9 ;/
17、* Outputs */PIN19,18,17,16=D3,D2,D1,D0;PIN14,15=CP2,CP;/* D3 D2 D1 D0 OUTPUT KEYCODE,CP OUTPUT CLOCK,F NO USE */D3=A0#A8#A9;D2=A4#A5#A6#A7;D1=A0#A2#A3#A6#A7;D0=A1#A3#A5#A7#A9;CP.D=D0#A0#A2#A4#A6#A8;CP2=!CP;/*END*/2 第二片GAL功能:处理密码比较结果、延时判断处理、控制28C64的读写操作、开锁和报警输出、电路复位管脚连接及命名:Name : GAL23;Date : 2009-9-
18、27;Revision : 1.3 ;Designer : ZHUZI;Company : NJUPT;/*INPUT*/PIN1,11=CLK,OE;PIN2,3,4,5=A,B,C,D;PIN 6=ENT;PIN 7=RS;PIN 8=SET;PIN 9=OT;PIN 14=KIN; /*OUTPUT*/PIN19,18=RO,RW; PIN17=CON; PIN16=CLR;PIN13=SUC; PIN12=FAL;PIN15=F2; /*EQUATIONS*/T=A&B&C&D; F1=!T&ENT&OT; F2.D=!OT&KIN; CLR.D=!(RS#ENT#FAL); RO=S
19、ET; RW=!SET; SUC=ENT&T&OT; FAL=F1#F2; CON=SET;/*END */五、 测试与调整1. 10进制数字输入测试:先复位,再按住数字键,用示波器检测第一片GAL的1916脚,按住数字键“0”,检测到D0D1D2D3=0101,则译码正确,以此类推,输入09,GAL输出全部测试正确。2. CP脉冲测试:将CP接到示波器一个通道观察,在有键按下时,观察到脉冲。且看到七段数码管得数字加1,则计数与显示部分没有问题。3. 密码比较用编程器在ROM中起始的8个单元写入原始密码:0X00,0X07,0X00,0X04,0X00,0X04,0X00,0X02。测试:1.
20、 复位后,依次输入正确密码(07040402),用示波器观察第一片7485的第6脚,若全为高,则正确,8位密码输入完毕后,测试74164的移存输出脚,若全为1,则正确。2. 输入错误密码07040400,7485在输入错误密码后,输出为0,且8位输入完毕后,74164的输出管脚中,第三脚为0,其余为1。则电路没有问题。4. 延时判断测试:1. 用示波器观察74123的输出管脚第13脚,复位时,输出为0,当有键按下,输出跳变为1,并保持。15秒内无键按下,则输出跳变为0,在15秒内有键按下,则输出一直保持高电平。2. 用示波器测试7474的输出管脚第5脚,复位时,输出为0,当有键按下,输出跳变为
21、1,一直保持。则延时电路没有问题。5. 程序测试(整体测试)1. 按下“复位”键,看到数码管立即显示为0,用示波器测试74161、74164、74123、7474的输出端全为低电平。说明手动复位功能正常。2. 输入正确密码07040402后,按下“ENT”,看到绿灯闪,几百毫秒后,绿灯熄灭,数码管显示为0;输入错误密码07040400后,按下“ENT”,看到红灯闪,几百毫秒后,红灯熄灭,数码管显示为0。说明密码判断正确,且自动复位功能正常。3. 复位后,按下第一位密码0,不再按任何键,15秒后,红灯闪,几百毫秒后,红灯熄灭,数码管显示为0。说明延时判断正确,并能报警,且能自动复位(程序CLR.
22、D=!(RS#ENT#FAL))。4. CON置为高电平,先按下想要设置的密码的第一位7,然后复位,按下“SET”,再输入第二位密码7,按下“SET”,依次再输入后6位密码777777。输入完毕,将28C64插到编程器,执行“READ”命令,查看ROM的存储内容,前8个存储单元内容为77777777,则密码修改成功。也可在电路中再次输入设定的新密码,若输入完毕后,绿灯亮,则新密码设置成功。七、 设计小结1. 设计任务完成情况几大指标:10进制键盘输入 密码正确输入时开锁,错误时报警 输入数字间隔小于15S时报警,并复位 手动和自动复位 修改密码全部完成,且界面友好,加上输入次数和正在修改密码位
23、数的显示,更加人性化,2. 问题及改进问题1:测试时74123输出不稳定,时有跳变原因:电源杂波较大,对电路的正常工作有较大干扰改进:在74123的电源和地之间并接一个较大的电解电容(220u)。注:用示波器观察电源电压,能明显看到很严重的杂波,则会引起数字电路工作异常,就会出现意想不到的错误,因此,为提高电路的稳定性和可靠性,在电路的电容和地之间应多加电容进行滤波。问题2:修改密码时,每输入一位密码后,都要按下“ENT”键,操作不方便原因:GAL不能像高级编程器件那样,只能写入简单的逻辑。用GAL不能达到28C64的复杂时序要求改进办法:1.不用GAL,换用其他稍高档次的芯片如CPLD和单片
24、机。2.借助其他外围辅助硬件电路因这次课程设计时间和所供应材料有限,问题没能彻底解决。问题3:硬件电路繁琐、作品性价比太低原因:用GAL16V8实现密码锁,所用器件和实现方法在报告中已经十分详尽。 让我们对比一下,若用单片机STC89C51来实现密码锁功能: 大致电路图如下:电路合理性对比:本次设计采用2片GAL,增加了编程和调试难度;还使用了EEROM这种高性能存储芯片,但仅用来存储8位密码,利用率极低;繁杂的其他硬件辅助电路(多达10片集成芯片),增加了电路设计的成本和装配困难(装配要求没有飞线,让这么多集成模块装配在一块面包板上,确实让人绞尽脑汁)。而若采用单片机,电路连接将变得十分简单
25、,一片MCU,和4*4的键盘,再附加一个显示用的数码管,功能的实现都集中在编程上,在软件辅助下在可实现在线调试,这将提高编程效率。性价比对比:据实验室老师讲一片GAL16V8的市场价格为4.5元,一片AT28C64的市场价格为10元,外围还有好多芯片,暂且不算。而低档的通用单片机STC89C51才7元一片。资源却很丰富,有4K的flash,外围几乎不需要其他数字芯片,成本极大的降低了。升级功能对比:GAL的资源少,不能用于复杂时序处理和较多的外围电路控制,外围电路众多,电路设计成功后,想要升级难度很大。而单片机资源多,管脚多,控制灵活,在硬件不变时,只要修改单片机程序,还能实现其他功能的扩展,
26、可维护性和可修改性极强,升级容易。改进方法:不限制器件范围,让大家自由发挥,提供更多芯片,给大家选择余地。3. 心得体会在此次课程设计中,我对数字电路系统的设计流程有了更深入的认识。以前在学数字电路时,对计数器、比较器、GAL、EEPROM等器件只有初泛的认识。而做一个数字系统,就必须对这器件娴熟和灵活运用。书本上的相关知识也是有限的,那就只能上网、查阅其他相关资料了。当然最有用的资料是芯片的数据手册本身。而手册都是英文的,找到自己想要的知识点也是不容易的。 在设计电路时,老师给了很多指导,为我们点明了思路,给了我们很大帮助。想要做出一般指标,就根据老师说的王下打,还是很容易的,。但要做的好一
27、些,实现更多的功能,最大限度的利用已有的硬件资源还是不易的。要自己去摸索,去研究。 比如自动复位老师没讲怎么实现,用GAL的组合逻辑功能根本不能实现,复位必须出现在开锁判断之后,不能同时进行,有人说用74123触发器 ,我仔细思考GAL的功能,发现用内部的触发器就能实现了,加个时钟,程序里多个“.D” (CLR.D=!(RS#ENT#FAL) ,就搞定了。比如想实现修改密码的功能,老师是作为一个扩展指标来看的。我看了28C64的手册就觉得还是能做出来的,手册上写它能在5V的电压下进行读和写,但怎么让它和GAL连接(直接连接会影响开锁功能),怎么控制它的时序,需要自己去思考。连接,我想到用CD4
28、066模拟开关来隔离(好在以前有些积累,自己有私藏的片子),时序也是慢慢写程序调试,多次试验。试验也遇到很多困难,就因为烧坏2片GAL(操作失误:选片子没选对),等换片子中间浪费了很多时间。然后自己设计的电路,在修改密码时,时序再严格,里面的东西怎么也改不了,问了很多老师,老师也说没试过,只能靠自己去试了。再验收的那天下午,终于找到一个老师,他说:“现在不能确定是你的时序问题还是片子本身的问题,我这边有一堆片子,你自己拿去再试试!”于是拿着老师给的5个片子,我分别接入电路试验,几乎在绝望的边缘,还真是有一片28C64能修改数据,只有那一片。那种喜悦,可以说不能用语言来表达了,熬了几天,比别人多付出的辛劳终于得到了回报。当然,除了感谢这位老师,我也要认真思考其中原因。都是ATMEL公司的片子,型号都是AT28C64B,除了速度一些特点,性能应该基本相同。那编程器怎么能给所有的AT28C64B写数据的呢?是怎么做到的呢?那肯定也是用时序电路,唯一的差别就是频率更高点,电平可能不一样。手册上读写操作都可以在5V时实现,但为什么擦除电压必须要12V呢?虽然设计做完了,好多疑问还没得到解答。总的说来,这次设计增强了自己思考和动手解决问题的能力。学无止境,这次设计还没解决的问题,以后的学习中还要自己去探索。21