前言随着电子技术的发展,具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。电子密码锁与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。下面就是现在主流电子密码锁:目前常见的遥控式电子防盗锁主要有光遥控和无线电遥控两类。键盘式电子密码锁从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。卡式电子防盗锁使用各种“卡”作为钥匙的电子防盗锁是当前最为活跃的产品,无论卡的种类如何多种多样,按照输入卡的操作方式,都可分为接触式卡和非接触式卡两大类。生物特征防盗锁人的某些与生俱来的个性特征(如手、眼睛、声音的特征)几乎不可重复,作为“钥匙”就是唯一的(除非被逼迫或伤害)。因此,利用生物特征做密码的电子防盗锁,也特别适合金融业注重“验明正身”的行业特点。人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究从20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。由于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因钥匙被仿制而留下安全隐患。电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管理。在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。一、作品功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。4、AT24C02保存密码,支持复位保存,掉电保存功能。二、按键说明按键定义图如图示:采用4X4键盘输入,键盘对应名称如下:123A456B789C*0#D其中,【0—9】为数字键,用于输入相应的密码,【*】号键为取消当前操作【#】号键为确认【D】键为修改密码其它键无功能及定义三、操作说明:密码锁初始密码为:000000.1、开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。2、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。3、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此4、5、6、时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。(如两次输入的新密码不一样,则重设密码失败)。7、报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。8、当重置新密码时,新密码会保存于AT24C02存储器里。四、框图及流程图1、系统结构框图2、主程序设计流程图NYNNYAT89S52显示模块报警电路开锁电路密码存储模块复位电路键盘输入模块初始化密码正确输入旧密码出错报警开锁原密码相同设新密码返回开锁修改3、键功能程序流程图。YNYNYNYN键功能程序键值=0~9?键值=开锁?键值=确认?键值=设置?返回密码输入程序确认程序设置程序开锁程序4、开锁程序流程图Y开锁LCD初始化输入密码按开锁键报警程序确认程序输入密码正确?开锁成功返回N5.电子密码锁原理图程序(c语言)#includeREG51.h#includeintrins.h#defineLCM_DataP0#defineucharunsignedchar#defineuintunsignedint#definew6//定义密码位数sbitlcd1602_rs=P2^5;sbitlcd1602_rw=P2^6;sbitlcd1602_en=P2^7;sbitScl=P3^4;//24C02串行时钟sbitSda=P3^5;//24C02串行数据sbitALAM=P2^1;//报警sbitKEY=P2^0;//开锁sbitopen_led=P2^2;//开锁指示灯bitoperation=0;//操作标志位bitpass=0;//密码正确标志bitReInputEn=0;//重置输入充许标志bits3_keydown=0;//3秒按键标志位bitkey_disable=0;//锁定键盘标志unsignedcharcountt0,second;//t0中断计数器,秒计数器voidDelay5Ms(void);unsignedcharcodea[]={0xFE,0xFD,0xFB,0xF7};//控盘扫描控制表unsignedcharcodestart_line[]={password:};unsignedcharcodename[]={===CodedLock===};//显示名称unsignedcharcodeCorrect[]={correct};//输入正确unsignedcharcodeError[]={error};//输入错误unsignedcharcodecodepass[]={pass};unsignedcharcodeLockOpen[]={open};//OPENunsignedcharcodeSetNew[]={SetNewWordEnable};unsignedcharcodeInput[]={input:};//INPUTunsignedcharcodeResetOK[]={ResetPasswordOK};unsignedcharcodeinitword[]={Initpassword...};unsignedcharcodeEr_try[]={error,tryagain!};unsignedcharcodeagain[]={inputagain};unsignedcharInputData[6];//输入密码暂存区unsignedcharCurrentPassword[6]={1,3,1,4,2,0};//当前密码值unsignedcharTempPassword[6];unsignedcharN=0;//密码输入位数记数unsignedcharErrorCont;//错误次数计数unsignedcharCorrectCont;//正确输入计数unsignedcharReInputCont;//重新输入计数unsignedcharcodeinitpassword[6]={0,0,0,0,0,0};//=====================5ms延时==============================voidDelay5Ms(void){unsignedintTempCyc=5552;while(TempCyc--);}//===================400ms延时==============================voidDelay400Ms(void){unsignedcharTempCycA=5;unsignedintTempCycB;while(TempCycA--){TempCycB=7269;while(TempCycB--);}}//================================24C02======================================voidmDelay(uintt)//延时{uchari;while(t--){for(i=0;i125;i++){;}}}voidNop(void)//空操作{_nop_();_nop_();_nop_();_nop_();}/*起始条件*/voidStart(void){Sda=1;Scl=1;Nop();Sda=0;Nop();}/*停止条件*/voidStop(void){Sda=0;Scl=1;Nop();Sda=1;Nop();}/*应答位*/voidAck(void){Sda=0;Nop();Scl=1;Nop();Scl=0;}/*反向应答位*/voidNoAck(void){Sda=1;Nop();Scl=1;Nop();Scl=0;}/*发送数据子程序,Data为要求发送的数据*/voidSend(ucharData){ucharBitCounter=8;uchartemp;do{temp=Data;Scl=0;Nop();if((temp&0x80)==0x80)Sda=1;elseSda=0;Scl=1;temp=Data1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*读一字节的数据,并返回该字节值*/ucharRead(void){uchartemp=0;uchartemp1=0;ucharBitCounter=8;Sda=1;do{Scl=0;Nop();Scl=1;Nop();if(Sda)temp=temp|0x01;elsetemp=temp&0xfe;if(BitCounter-1){temp1=temp1;temp=temp1;}BitCounter--;}while(BitCounter);return(temp);}voidWrToROM(ucharData[],ucharAddress,ucharNum){uchari;uchar*PData;PData=Data;for(i=0;iNum;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}voidRdFromROM(ucharData[],ucharAddress,ucharNum){uchari;uchar*PData;PData=Data;for(i=0;iNum;i++){Start();Send(0xa0);Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}//=======================================LCD1602=============================//#defineyi0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=8