基于51单片机的简易电子密码锁_第1页
基于51单片机的简易电子密码锁_第2页
基于51单片机的简易电子密码锁_第3页
基于51单片机的简易电子密码锁_第4页
基于51单片机的简易电子密码锁_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-.z前言随着电子技术的开展,具有防盗报警等功能的电子密码锁代替密码量少、平安性差的机械式密码锁已是必然趋势。电子密码锁与普通机械锁相比,具有许多独特的优点:**性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大局部是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。下面就是现在主流电子密码锁:目前常见的遥控式电子防盗锁主要有光遥控和无线电遥控两类。键盘式电子密码锁从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一局部应用于保管箱和运钞车。卡式电子防盗锁使用各种“卡〞作为钥匙的电子防盗锁是当前最为活泼的产品,无论卡的种类如何多种多样,按照输入卡的操作方式,都可分为接触式卡和非接触式卡两大类。生物特征防盗锁人的*些与生俱来的个性特征〔如手、眼睛、声音的特征〕几乎不可重复,作为“钥匙〞就是唯一的〔除非被逼迫或伤害〕。因此,利用生物特征做密码的电子防盗锁,也特别适合金融业注重“验明正身〞的行业特点。人们生活水平的提高和平安意识的加强,对平安的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要平安可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的开展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究从20世纪30年代就开场了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的平安性。由于电子锁的密钥量〔密码量〕极大,可以与机械锁配合使用,并且可以防止因钥匙被仿制而留下平安隐患。电子锁只需记住一组密码,无需携带金属钥匙,免除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,本钱较高,是适合使用在平安性要求较高的场合,且需要有电源提供能量,使用还局限在一定*围,难以普及,所以对它的研究一直没有明显进展。目前,在西方兴旺国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加平安,更加可靠的技术实现大门的管理。在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的本钱还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供给市场。但国内自行研制开发的电子锁,其市场构造尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,开展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。作品功能:1、设置6位密码,密码通过键盘输入,假设密码正确,则将锁翻开。2、密码可以由用户自己修改设定〔只支持6位密码〕,锁翻开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,假设密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。4、AT24C02保存密码,支持复位保存,掉电保存功能。二、按键说明按键定义图如图示:采用4*4键盘输入,键盘对应名称如下:123A456B789C*0*D其中, 【0—9】为数字键,用于输入相应的密码, 【*】号键为取消当前操作 【*】号键为确认 【D】键为修改密码 其它键无功能及定义三、操作说明:密码锁初始密码为:000000.开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000,然后按【*】〔确认〕键,此时锁会翻开,可以看到显示open,密码锁翻开。退出并关锁:按下【*】〔取消〕键,此时锁关闭,所有输入去除。修改密码:在开锁状态下,再次输入正确的密码并按下【*】〔确认〕键,此时听到两声提示,输入新的六位密码并按【D】〔重设〕键,再重复输入一次新密码并按【D】,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02。〔如两次输入的新密码不一样,则重设密码失败〕。报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。当重置新密码时,新密码会保存于AT24C02存储器里。四、框图及流程图1、系统构造框图AT89S52显示模块键盘输入模块AT89S52显示模块键盘输入模块报警电路复位电路报警电路复位电路开锁电路密码存储模块开锁电路密码存储模块2、主程序设计流程图初始化初始化修改开锁修改开锁密码正确密码正确输入旧密码输入旧密码 N原密码一样Y原密码一样开锁出错报警NN Y开锁出错报警设新密码设新密码返回返回3、键功能程序流程图。键功能程序键功能程序键值=0~9.键值=开锁.键值=确认.键值=设置.返回密码输入程序确认程序设置程序开锁程序 Y N Y N Y N Y N4、开锁程序流程图LCD初始化LCD初始化按开锁键按开锁键输入密码输入密码确认程序开锁确认程序开锁N输入密码正确.N输入密码正确.报警程序报警程序开锁成功返回 Y开锁成功返回5.电子密码锁原理图程序〔c语言〕*include<REG51.h>*include<intrins.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[]={0*FE,0*FD,0*FB,0*F7}; //控盘扫描控制表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;i<125;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&0*80)==0*80) Sda=1; else Sda=0; Scl=1; temp=Data<<1; 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|0*01; else temp=temp&0*fe; if(BitCounter-1) { temp1=temp<<1; temp=temp1; } BitCounter--; } while(BitCounter); return(temp); }voidWrToROM(ucharData[],ucharAddress,ucharNum){uchari;uchar*PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0*a0);Ack();Send(Address+i);Ack();Send(*(PData+i));Ack();Stop();mDelay(20);}}voidRdFromROM(ucharData[],ucharAddress,ucharNum){uchari;uchar*PData;PData=Data;for(i=0;i<Num;i++){Start();Send(0*a0);Ack();Send(Address+i);Ack();Start();Send(0*a1);Ack();*(PData+i)=Read();Scl=0;NoAck();Stop();}}//=======================================LCD1602=============================//*defineyi0*80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1〔100000000=80〕*defineer0*80+0*40//LCD第二行初始位置〔因为第二行第一个字符位置地址是0*40〕//----------------延时函数,后面经常调用----------------------voiddelay(uint*ms)//延时函数,有参函数{ uint*,y; for(*=*ms;*>0;*--) for(y=110;y>0;y--);}//--------------------------写指令---------------------------write_1602(uchar)//****液晶写入指令函数****{ lcd1602_rs=0;//数据/指令选择置为指令 lcd1602_rw=0;//读写选择置为写 P0=;//送入数据 delay(1); lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备 delay(1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}//-------------------------写数据-----------------------------write_1602dat(uchardat)//***液晶写入数据函数****{ lcd1602_rs=1;//数据/指令选择置为数据 lcd1602_rw=0;//读写选择置为写 P0=dat;//送入数据 delay(1); lcd1602_en=1;//en置高电平,为制造下降沿做准备 delay(1); lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}//-------------------------初始化-------------------------voidlcd_init(void){ write_1602(0*38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据 write_1602(0*0c);//开显示不显示光标 write_1602(0*06);//整屏不移动,光标自动右移 write_1602(0*01);//清显示}//==============将按键值编码为数值=========================unsignedcharcoding(unsignedcharm) { unsignedchark; switch(m) { case(0*18):k=1;break; case(0*28):k=2;break; case(0*48):k=3;break; case(0*88):k='A';break; case(0*14):k=4;break; case(0*24):k=5;break; case(0*44):k=6;break; case(0*84):k='B';break; case(0*12):k=7;break; case(0*22):k=8;break; case(0*42):k=9;break; case(0*82):k='C';break; case(0*11):k='*';break; case(0*21):k=0;break; case(0*41):k='*';break; case(0*81):k='D';break; } return(k);}//=====================按键检测并返回按键值===============================unsignedcharkeynum(void){ unsignedcharrow,col,i; P1=0*f0; if((P1&0*f0)!=0*f0) { Delay5Ms();Delay5Ms(); if((P1&0*f0)!=0*f0) { row=P1^0*f0;//确定行线 i=0; P1=a[i]; //准确定位 while(i<4) { if((P1&0*f0)!=0*f0) { col=~(P1&0*ff); //确定列线 break;//已定位后提前退出 } else { i++; P1=a[i]; } } } else { return0; } while((P1&0*f0)!=0*f0); return(row|col); //行线与列线组合后返回 } elsereturn0; //无键按下时返回0}//=======================一声提示音,表示有效输入========================voidOneAlam(void){ ALAM=0; Delay5Ms();ALAM=1;}//========================二声提示音,表示操作成功========================voidTwoAlam(void){ ALAM=0; Delay5Ms();ALAM=1;Delay5Ms(); ALAM=0; Delay5Ms();ALAM=1;}//========================三声提示音,表示错误========================voidThreeAlam(void){ ALAM=0; Delay5Ms();ALAM=1;Delay5Ms(); ALAM=0; Delay5Ms();ALAM=1;Delay5Ms(); ALAM=0; Delay5Ms();ALAM=1;}//=====================显示输入的N个数字,用H代替以便隐藏============================voidDisplayOne(void){// DisplayOneChar(9+N,1,'*'); write_1602(yi+5+N); write_1602dat('*');}//=======================显示提示输入=========================voidDisplayChar(void){ unsignedchari; if(pass==1) { //DisplayListChar(0,1,LockOpen); write_1602(er); for(i=0;i<16;i++) { write_1602dat(LockOpen[i]); } } else { if(N==0) { //DisplayListChar(0,1,Error); write_1602(er); for(i=0;i<16;i++) { write_1602dat(Error[i]); } } else { //DisplayListChar(0,1,start_line); write_1602(er); for(i=0;i<16;i++) { write_1602dat(start_line[i]); } } }}voidDisplayInput(void){ unsignedchari; if(CorrectCont==1) { //DisplayListChar(0,0,Input); write_1602(er); for(i=0;i<16;i++) { write_1602dat(Input[i]); } }}//========================重置密码==================================================//==================================================================================voidResetPassword(void){ unsignedchari; unsignedcharj; if(pass==0) { pass=0; DisplayChar(); ThreeAlam(); } else { if(ReInputEn==1) { if(N==6) { ReInputCont++; if(ReInputCont==2) { for(i=0;i<6;) { if(TempPassword[i]==InputData[i]) //将两次输入的新密码作比照 i++; else { //DisplayListChar(0,1,Error); write_1602(er); for(j=0;j<16;j++) { write_1602dat(Error[j]); } ThreeAlam(); //错误提示 pass=0; ReInputEn=0; //关闭重置功能, ReInputCont=0; DisplayChar(); break; } } if(i==6) { //DisplayListChar(0,1,ResetOK); write_1602(er); for(j=0;j<16;j++) { write_1602dat(ResetOK[j]); } TwoAlam(); //操作成功提示 WrToROM(TempPassword,0,6); //将新密码写入24C02存储 ReInputEn=0; } ReInputCont=0; CorrectCont=0; } else { OneAlam(); //DisplayListChar(0,1,again); //显示再次输入一次 write_1602(er); for(j=0;j<16;j++) { write_1602dat(again[j]); } for(i=0;i<6;i++) { TempPassword[i]=InputData[i]; //将第一次输入的数据暂存起来 } } N=0; //输入数据位数计数器清零 } } }}//=======================输入密码错误超过三过,报警并锁死键盘======================voidAlam_KeyUnable(void){ P1=0*00; { ALAM=~ALAM; Delay5Ms(); }}//=======================取消所有操作============================================voidCancel(void){ unsignedchari; unsignedcharj; //DisplayListChar(0,1,start_line); write_1602(er); for(j=0;j<16;j++) { write_1602dat(start_line[j]); } TwoAlam(); //提示音 for(i=0;i<6;i++) { InputData[i]=0; } KEY=1; //关闭锁 ALAM=1; //报警关 operation=0; //操作标志位清零 pass=0; //密码正确标志清零 ReInputEn=0; //重置输入充许标志清零 ErrorCont=0; //密码错误输入次数清零 CorrectCont=0; //密码正确输入次数清零 ReInputCont=0; //重置密码输入次数清零 open_led=1; s3_keydown=0; key_disable=0; N=0; //输入位数计数器清零}//==========================确认键,并通过相应标志位执行相应功能===============================voidEnsure(void){ unsignedchari,j; RdFromROM(CurrentPassword,0,6); //从24C02里读出存储密码if(N==6) { if(ReInputEn==0) //重置密码功能未开启 { for(i=0;i<6;) { if(CurrentPassword[i]==InputData[i]) { i++; } else { ErrorCont++; if(ErrorCont==3) //错误输入计数达三次时,报警并锁定键盘 { write_1602(er); for(i=0;i<16;i++) { write_1602dat(Error[i]); } do Alam_KeyUnable(); while(1); } else { TR0=1; //开启定时 key_disable=1; //锁定键盘 pass=0; break; } } } if(i==6) { CorrectCont++; if(CorrectCont==1) //正确输入计数,当只有一次正确输入时,开锁, { //DisplayListChar(0,1,LockOpen); write_1602(er); for(j=0;j<16;j++) { write_1602dat(LockOpen[j]); } TwoAlam(); //操作成功提示音 KEY=0; //开锁 pass=1; //置正确标志位 TR0=1; //开启定时 open_led=0; //开锁指示灯亮 for(j=0;j<6;j++) //将输入去除 { InputData[i]=0; } } else //当两次正确输入时,开启重置密码功能 { //DisplayListChar(0,1,SetNew); write_1602(er); for(j=0;j<16;j++) { write_1602dat(SetNew[j]); } TwoAlam(); //操作成功提示 ReInputEn=1; //允许重置密码输入 CorrectCont=0; //正确计数器清零 } } else //=========================当第一次使用或忘记密码时可以用131420对其密码初始化============ { if((InputData[0]==1)&&(InputData[1]==3)&&(InputData[2]==1)&&(InputData[3]==4)&&(InputData[4]==2)&&(InputData[5]==0)) { WrToROM(initpassword,0,6); //强制将初始密码写入24C02存储 //DisplayListChar(0,1,initword); //显示初始化密码 write_1602(er); for(j=0;j<16;j++) { write_1602dat(initword[j]); } TwoAlam(); Delay400Ms(); TwoAlam(); N=0; } else { //DisplayListChar(0,1,Error); write_1602(er); for(j=0;j<16;j++) { write_1602dat(Error[j]); } ThreeAlam(); //错误提示音 pass=0; } } } else //当已经开启重置密码功能时,而按下开锁键, { //DisplayListChar(0,1,Er_try); write_1602(er); for(j=0;j<16;j++) { write_1602dat(Er_try[j]); } ThreeAlam(); } } else { //DisplayListChar(0,1,Error); write_1602(er); for(j=0;j<16;j++) { write_1602dat(Error[j]); } ThreeAlam(); //错误提示音 pass=0; } N=0; //将输入数据计数器清零,为下一次输入作准备 operation=1;}//==============================主函数===============================voidmain(void){ unsignedcharKEY,NUM; unsignedchari,j; P1=0*FF; TMOD=0*11; TL0=0*B0; TH0=0*3C; EA=1; ET0=1; TR0=0; Delay400Ms(); //启动等待,等LCM讲入工作状态 lcd_init(); //LCD初始化 write_1602(yi);//日历显示固定符号从第一行第0个位置之后开场显示 for(i=0;i<16;i++) { write_1602dat(name[i]);//向液晶屏写日历显示的固定符号局部 } write_1602(er);//时间显示固定符号写入位置,从第2个位置后开场显示 for(i=0;i<16;i++) { write_1602dat(start_line[i]);//写显示时间固定符号,两个冒号 } write_1602(er+9); //设置光标位置 write_1602(0*0f); //设置光标为闪烁 Delay5Ms();//延时片刻(可不要) N=0; //初始化数据输入位数 while(1) { if(key_disable==1) Alam_KeyUnable(); else ALAM=1; //关报警 KEY=keynum(); if(KEY!=0) { if(key_disable==1) { second=0; } else { NUM=coding(KEY); { switch(NUM) { case('A'): ; break; case('B'): ; break; case('C'): ; break; case('D'):ResetPassword(); break;//重新设置密码 case('*'):Cancel(); break;//取消当前输入 case('*'

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论