在坛子里浏览了几天了。作为对论坛的支持,我也把我曾经发表在《电子报》上的一篇我设计的“电子密码锁”这篇文章奉献给广大的坛友和锁具爱好者。供有兴趣的坛友交流。
: T) v! ?5 ^3 u( |/ x( w* ?用PIC16F877A单片机制作的4位电子密码锁 电子密码锁是一个很有趣的电子制作项目,它能培养、锻炼人的设计能力、构思其逻辑思维关系,验证电路设计的正确与否以及动手制作电子装置的乐趣。用硬件电路制作的电子锁虽然也具有不错的保密性,但是它存在密码编制组数少,编制、更改密码不够方便等不足,密码一旦被局外人识破、获取,修改密码的工作也需要一定的时间和过程,不利于安全防范的继续,还会给密码锁的使用者带来不安全的心理疑虑,故而,实用性相对较差。本文用PIC16F877A单片机制作的电子密码锁可以完全满足一般使用者的需要,它用4位LED数码管显示当前密码组的数字,具有显示醒目、清晰、亮丽,它还具有很好的保密性和操作的便利性,修改、更换密码可随时进行,简便、快捷,不受任何约束、限制。本文介绍的密码锁具有多达16,000组的密码组合数,完全能够满足一般家庭和工作场所对物品保管的需要。 PIC16F877A是一个40pin引脚的8位单片机,其振荡器的工作频率高达20MHz。它具有33个I/O输入/输出端口线可用,具有输出端口驱动能力强的特点,可直接用PIC单片机的I/O输出端口驱动LED数码管,同时PIC16F877A单片机片还内含有256字节×8位地址的EEPROM存储器(也称E2PROM存储器),这也是用其制作电子密码锁的重要资源之一。用PIC单片机片内的EEPROM存储器存储数据与某些单片机用片外数据存储芯片(如常用的24C02、24C04、93C46等数据存储器芯片)存储数据相比不仅减少了硬件配置,不占用单片机的I/O端口线,从而降低了系统的总造价,简化了PCB电路板的设计工作量和PCB电路板的面积等优点,此外,不象外挂EPROM、EEPROM芯片那样可从电路板上取下芯片,并对其内部数据进行读取、拷贝,所以,相比之下其数据的保密性更好,数据更不容易被拷贝、读出、破解,可以获得更高的数据保密性和软件代码知识产权的自我保护。 用PIC16F877A单片机制作的4位电子密码锁硬件电路如图1所示。! ?# C% F" a! V) `( J+ ]
图1 图1电路中PIC16F877A的PROTA端口RA0~RA5设置为输出端口。其中RA0端口通过1KΩ电阻R13接于Q5的b极,用于驱动Q5 2SD882中功率三极管(高电平使能),进而控制密码锁电磁铁L1的吸合与释放(或者开/关锁减速电机的动作),RA4、RA5、RA2、RA3分别用于驱动4位共阳极数码管的个位、十位、百位、千位的“位码”(低电平使能),(自定义最右边的数码管为个位。其实在本制作中原则上是不分个、十、百、千位的,4个数码管之间是没有数制、数值逻辑进位关系的,这里称呼个、十、百、千位的目的只是为了叙述方便而已)。单片机的PORTB端口的RB0~RB5设置为输入端口。其中:RB0通过10KΩ上拉电阻R1所接的按键S1为密码保存、修改/存储按键;RB1~RB4分别通过各自的10KΩ上拉电阻R4~R7接于个位~千位数码值预置按键S3~S6,同时RB1端口所接的按键S3还兼有密码隐含控制功能,当长按S3按键1.2秒钟以上时,数码管从当前的显示码变为“0000”,故而,隐含了数码管的开锁密码,RB5所接的按键S7为读取密码按键或者称开锁确认按键。单片机的①脚为1/MCLR复位端口,该端口与按键S2相接(低电平使能),每按下复位键S2一次,单片机系统即会立刻自动复位。复位后存储在单片机EEPROM中的开锁密码不会消失、改变。单片机的PORTC端口的RC7~RC0设置为输出端口。其中:RC0~RC6分别通过R14~R20各自所接的470Ω限流电阻与数码管的a~g段码相连,用于段码驱动(低电平使能);RC7则通过1KΩ的限流电阻R13接于蜂鸣器驱动三极管Q6的b极(高电平使能)。单片机的PORTD、PORTE两个端口空置,电路上电后系统默认为输入端口。 本密码锁的工作原理:本密码锁是将数码管显示的当前数码值存入单片机的EEPROM存储单元作为开锁密码,用电磁铁作为执行元件控制保险箱的锁闭状态的,电磁铁在非吸合状态下将保险箱锁死。开锁时,首先输入开锁密码,在操作人员按下开锁确认键S7后,单片机将数码管显示的当前数码值与存储在单片机EEPROM中的原始码进行比对,若开锁人输入的当前开锁数码与存储在单片机EEPROM中的数码相一致,则认为开锁密码正确,同时单片机的RA0端口输出高电平,进而驱动开锁电池铁动作开锁;否则,在当前显示数码与存储在单片机中的原始数码比对后不相等,则开锁电磁铁不动作,若要三次输入的开锁数码值与存储在单片机中的开锁密码不一致的情况下又三次的按下了开锁按键S7,单片机即认为是非法开锁。在进入非法开锁的情况下单片机程序控制会将面板所有按键锁死,故而,表现的按键状态是失灵,同时蜂鸣器鸣响报警,杜绝了继续猜码开锁的可能性。 密码锁的初次使用: 电路首次上电后,四位数码管分别显示:“0000”四个数码值,蜂鸣器不响,电磁铁处于释放状态,对应被保护的“保险箱”处于锁闭状态。此时,使用者可随意按动密码锁数码值预置按键S3~S6或者按动密码值保存按键S1。上述各按键每按动一次,蜂鸣器都会发出一声“嘀”的提示音,同时数码管则有对应的数码值变化。假若此时按下的是S3~S6中的任意一个数码值预置按键,除了蜂鸣器发出 “嘀”的一声音响外,其对应的数码管显示值则会以“N+1”的计数模式递增变化,其中:千位(左边第一位数码)数值是从“0→1→2→3→…→F→0”循环显示;个位~百位数码值变化为:“0→1→2→3→…→9→0”循环显示,当我们选定一组数字码,如:2010作为密码,并按下密码保存按键S1时,蜂鸣器会“嘀”的响一声;同时数码管显示:“E000”,表示此组数字密码储存成功。在数码管显示任何数值码的情况下,每按下密码保存键S1一次,这个当前显示的数字组合码值都会被当作当前最新开锁密码保存在单片机内的EEPROM中,并作为开锁密码。在开锁时,我们要输入正确的、对应的四位组合数码,如:2010后再按下开锁确认键S7,则蜂鸣器“嘀”的响一声,同时电磁铁L1吸合,密码锁即会被打开,保险箱门随即可以开启。当关闭保险箱门时,为了快速的隐含当前的开锁密码,需要按住S3(个位数字预置/显示密码隐含)键 1.2秒钟以上的时间,当再一次听到“嘀”的一声响后释放S3按键,此时,数码管显示“0000”,同时密码锁电磁铁释放,保险箱门还原于锁闭状态,故而,开锁密码会快速的被隐含起来。也可以随意按一下或几下、一次或几次S3~S6数码管显示值、预置键,同样可以将保险箱门锁上。在保险箱处于锁闭状态下,如果开锁的人输入了错误的组合密码,同时又按下了S7开锁键,此时除了在每按下一次开锁按键时蜂鸣器会发出“嘀”的响声外,保险箱门是不会被打开的,在输入3次错误密码的情况下,又3次按下了S7开锁确认键,则本密码锁将自动锁死,同时蜂鸣器连续、长时间的鸣响,同时密码锁面板上的所有可操作按键被锁死、失灵,从而可以安全、可靠、有效地保护了保险箱中物品的遗失。在密码锁被锁死的状态下,只有主人采用机械的主、辅钥匙同时配合的方法才能将保险箱打开。现行市面上销售的商品保险柜就是采用这种方法“跳开电子密码锁”开启保险箱的。在保险箱打开的状态下,按下主电路板上的复位键S2(K-reset)方能消除蜂鸣器的报警。同时,密码锁显示码再次回复到初始上电时的状态,4位数码管再次显示0000四位数字吗。而最后设定保存在单片机EEPROM中的开锁密码仍然有效。若要修改开锁密码,重复上述操作方法即可实现。 本密码锁可设置、编组、修改的密码组合数理论上可以做到164=65,536组,考虑到多数人对16进制数不是很习惯,并且本密码锁硬件电路及程序设计在16进制数的情况下输入一个正确密码也是很繁琐的一件事,所以程序中,除了在千位数码值采用0~F~0十六进制数循环的计数方式外,个位~百位数码仍是采用了传统的人们习惯使用的十进制的计数方式,这样获得的密码编码的组合数是16×10×10×10=16,000组,密码锁被非法开启的概率数就是1/16,000分之一乘以3次,由于密码被非法开启次数的限定设置只有3次机会,可见,其保密性和可靠性还是足够高的,16,000这一数字组合值是可以满足一般情况下应用密码锁的使用要求的。 |