基于51单片机的简易电子密码锁

发布时间:   来源:文档文库   
字号:

前言
随着电子技术的发展,具有防盗报警等功能的电子密码锁代替密码量少、全性差的机械式密码锁已是必然趋势。电子密码锁与普通机械锁相比,具有许多独特的优点:保密性好,防盗性强,可以不用钥匙,记住密码即可开锁等。目前使用的电子密码锁大部分是基于单片机技术,以单片机为主要器件,其编码器与解码器的生成为软件方式。
下面就是现在主流电子密码锁:目前常见的遥控式电子防盗锁主要有光遥控和无线电遥控两类。键盘式电子密码锁从目前的技术水平和市场认可程度看,使用最为广泛的是键盘式电子密码锁,该产品主要应用于保险箱、保险柜和金库,还有一部分应用于保管箱和运钞车。卡式电子防盗锁使用各种“卡”作为钥匙的电子防盗锁是当前最为活跃的产品,无论卡的种类如何多种多样,按照输入卡的操作方式,都可分为接触式卡和非接触式卡两大类。生物特征防盗锁人的某些与生俱来的个性特征(如手、眼睛、声音的特征)几乎不可重复,作为“钥匙”就是唯一的(除非被逼迫或伤害)。因此,利用生物特征做密码的电子防盗锁,也特别适合金融业注重“验明正身”的行业特点。
人们生活水平的提高和安全意识的加强,对安全的要求也就越来越高。锁自古以来就是把守护门的铁将军,人们对它要求甚高,既要安全可靠的防盗,又要使用方便,这也是制锁者长期以来研制的主题。随着电子技术的发展,各类电子产品应运而生,电子密码锁就是其中之一。据有关资料介绍,电子密码锁的研究20世纪30年代就开始了,在一些特殊场所早就有所应用。这种锁是通过键盘输入一组密码完成开锁过程。研究这种锁的初衷,就是为提高锁的安全性。于电子锁的密钥量(密码量)极大,可以与机械锁配合使用,并且可以避免因

钥匙被仿制而留下安全隐患。电子锁只需记住一组密码,无需携带金属钥匙,除了人们携带金属钥匙的烦恼,而被越来越多的人所欣赏。电子锁的种类繁多,例如数码锁,指纹锁,磁卡锁,IC卡锁,生物锁等。但较实用的还是按键式电子密码锁。20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,更加可靠的技术实现大门的管理。
在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用。
一、
作品功能:

1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。

2密码可以由用户自己修改设定(只支持6位密码)锁打开后才能修改密
码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。
3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输
入错误次数超过3次,蜂鸣器报警并且锁定键盘。4AT24C02保存密码,支持复位保存,掉电保存功能。二、按键说明

按键定义图
如图示:采用4X4键盘输入,键盘对应名称如下:
123A456B789C

*0#D
其中,09】为数字键,用于输入相应的密码,*】号键为取消当前操作


#】号键为确认D】键为修改密码其它键无功能及定义
三、操作说明:
密码锁初始密码为:000000.
1开锁:插上电源后,程序自动调入初始密码,此时依次输入:000000然后按【#(确认)键,此时锁会打开,可以看到显示open,密码锁打开。2退出并关锁:按下【*(取消)键,此时锁关闭,所有输入清除。3修改密码:在开锁状态下,再次输入正确的密码并按下【#(确认)键,此时听到两声提示,输入新的六位密码并按【D(重设)键,再重复输入一次新密码并按【D,会听到两声提示音,表示重设密码成功,内部保存新密码并存储到AT24C02(如两次输入的新密码不一样,则重设密码失败)4
报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内
又有按键,3秒再启动。5
当重置新密码时,新密码会保存于AT24C02存储器里。
四、框图及流程图
1、系统结构框图
键盘输入模块


AT89S52
显示模块


复位电路

密码存储模块
报警电路

开锁电路

2、主程序设计流程图
初始化
修改
开锁

密码正确
输入旧密码
N
Y
NN开锁出错报警



3、键功能程序流程图。

返回
原密码相同
Y
设新密码



键功能程序
键值=0~9密码输入程序

键值=设置?键值=开锁?N
Y

开锁程序
Y
设置程序

N
Y
键值=确认?

确认程序
N
Y
返回


N


4、开锁程序流程图
开锁

LCD初始化
按开锁键

N
确认程序
输入密码

输入密码正确?
报警程序

Y
返回
开锁成功





5.电子密码锁原理图




程序(c语言)
#include#include#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;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&0x80==0x80Sda=1;elseSda=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(Sdatemp=temp|0x01;elsetemp=temp&0xfe;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{
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;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恒定为1100000000=80
#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40//----------------延时函数,后面经常调用----------------------voiddelay(uintxms//延时函数,有参函数{uintx,y;for(x=xms;x>0;x--for(y=110;y>0;y--;}
//--------------------------写指令---------------------------write_1602com(ucharcom//****液晶写入指令函数****{lcd1602_rs=0;//数据/指令选择置为指令lcd1602_rw=0;//读写选择置为写P0=com;//送入数据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_1602com(0x38;//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数write_1602com(0x0c;//开显示不显示光标write_1602com(0x06;//整屏不移动,光标自动右移write_1602com(0x01;//清显示}
//==============将按键值编码为数值=========================

unsignedcharcoding(unsignedcharm{unsignedchark;switch(m{case(0x18:k=1;break;case(0x28:k=2;break;case(0x48:k=3;break;case(0x88:k='A';break;case(0x14:k=4;break;case(0x24:k=5;break;case(0x44:k=6;break;case(0x84:k='B';break;case(0x12:k=7;break;case(0x22:k=8;break;case(0x42:k=9;break;case(0x82:k='C';break;case(0x11:k='*';break;case(0x21:k=0;break;case(0x41:k='#';break;case(0x81:k='D';break;}return(k;}
//====================================================unsignedcharkeynum(void{
unsignedcharrow,col,i;P1=0xf0;
if((P1&0xf0!=0xf0{Delay5Ms(;Delay5Ms(;if((P1&0xf0!=0xf0{row=P1^0xf0;//确定行线i=0;P1=a[i];//精确定位while(i<4{if((P1&0xf0!=0xf0{


col=~(P1&0xff;//确定列线break;//已定位后提前退出}else{i++;P1=a[i];}}}else{return0;}while((P1&0xf0!=0xf0;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;}
//=====================NH便============================voidDisplayOne(void{
//DisplayOneChar(9+N,1,'*';write_1602com(yi+5+N;write_1602dat('*';}
//=======================显示提示输入=========================voidDisplayChar(void{unsignedchari;if(pass==1{//DisplayListChar(0,1,LockOpen;write_1602com(er;for(i=0;i<16;i++{write_1602dat(LockOpen[i];}}else{if(N==0{//DisplayListChar(0,1,Error;write_1602com(er;for(i=0;i<16;i++{write_1602dat(Error[i];}

}else{//DisplayListChar(0,1,start_line;write_1602com(er;for(i=0;i<16;i++{write_1602dat(start_line[i];}}}}
voidDisplayInput(void{unsignedchari;if(CorrectCont==1{//DisplayListChar(0,0,Input;write_1602com(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

{
码作对比24C02存储

ReInputCont++;if(ReInputCont==2{for(i=0;i<6;{if(TempPassword[i]==InputData[i]//将两次输入的新密
i++;else{//DisplayListChar(0,1,Error;write_1602com(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_1602com(er;for(j=0;j<16;j++{write_1602dat(ResetOK[j];}TwoAlam(;//操作成功提示

WrToROM(TempPassword,0,6;//
ReInputEn=0;
}ReInputCont=0;CorrectCont=0;}else{

OneAlam(;//DisplayListChar(0,1,again;//显示再次输入一次write_1602com(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=0x00;{ALAM=~ALAM;Delay5Ms(;}}
//===================================================================voidCancel(void{unsignedchari;unsignedcharj;//DisplayListChar(0,1,start_line;write_1602com(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_1602com(er;for(i=0;i<16;i++{

write_1602dat(Error[i];}doAlam_KeyUnable(;while(1;}else{TR0=1;//开启定时key_disable=1;//锁定键盘pass=0;break;}}}if(i==6{CorrectCont++;if(CorrectCont==1//正确输入计数,当只有一次正确输入时,开锁,{//DisplayListChar(0,1,LockOpen;write_1602com(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_1602com(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_1602com(er;for(j=0;j<16;j++{write_1602dat(initword[j];}TwoAlam(;Delay400Ms(;TwoAlam(;N=0;}else{//DisplayListChar(0,1,Error;write_1602com(er;for(j=0;j<16;j++{write_1602dat(Error[j];}ThreeAlam(;//提示音

pass=0;}}}else时,而按下开锁键,{//DisplayListChar(0,1,Er_try;write_1602com(er;for(j=0;j<16;j++{write_1602dat(Er_try[j];}ThreeAlam(;}}else{//DisplayListChar(0,1,Error;write_1602com(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=0xFF;TMOD=0x11;TL0=0xB0;
//当已经开启重置密码功
//错误提示音
//将输入数据计数器


TH0=0x3C;EA=1;ET0=1;TR0=0;
Delay400Ms(;//启动等待,等LCM讲入工作状态lcd_init(;//LCD初始化write_1602com(yi;//日历显示固定符号从第一行第0个位置之后开始显示for(i=0;i<16;i++{write_1602dat(name[i];//向液晶屏写日历显示的固定符号部分}write_1602com(er;//时间显示固定符号写入位置,从第2个位置后开始显示for(i=0;i<16;i++{write_1602dat(start_line[i];//写显示时间固定符号,两个冒号}write_1602com(er+9;//设置光标位置write_1602com(0x0f;//设置光标为闪烁Delay5Ms(;//延时片刻(可不要
N=0;//初始化数据输入位数
while(1{if(key_disable==1Alam_KeyUnable(;elseALAM=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('#':Ensure(;break;//确认键,default:{//DisplayListChar(0,1,Input;write_1602com(er;for(i=0;i<16;i++{write_1602dat(Input[i];}operation=0;if(N<6//入的密码少于6位时,接受输入并保存,大于6位时则无效。{OneAlam(;//提示音//DisplayOneChar(6+N,1,'*';for(j=0;j<=N;j++{write_1602com(er+6+j;write_1602dat('*';}InputData[N]=NUM;N++;}else//输入数据位数大于6后,忽略输入{N=6;break;}}}}}}}}
//*********************************中断服务函数**************************************

voidtime0_int(voidinterrupt1{
TL0=0xB0;TH0=0x3C;//TR0=1;countt0++;
if(countt0==20{countt0=0;second++;if(pass==1{if(second==1{open_led=1;TR0=0;TL0=0xB0;TH0=0x3C;second=0;}}else{if(second==3{TR0=0;second=0;key_disable=0;s3_keydown=0;TL0=0xB0;TH0=0x3C;}elseTR0=1;}}}

//关指示灯//关定时器


结论,致谢,参考文献,原理图放在程序前
毕业设计是学生即将完成学业的最后一次作业,它既是对所学知识的全面总结和综合应用,又是今后走向社会的实际操作应用铸就了一个良好开端,毕业设计是我对所学知识理论的检验与总结,此次毕业设计是一次非常难得的理论与实际相结合的机会,通过这次比较难完整的毕业设计,我摆脱了单纯的理论知识学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,同时也提高我查阅文献资料、设计手册、设计规范以及电脑制图等其它专业能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富,并且使我的意志和耐力都得到了不同的提升,这是我们

希望看到的也正是我们进行毕业设计的目的所在。
在此次试验中,我通过查阅大量的有关资料,与同学交流经验和自学,并向老师请教等方式完成的,
岁月如梭,三年的大学时光即将结束,这个实验和论文是在老师的指导与鼓励下完成的,老师们渊博的学识、严谨的治学态度、精益求精的工作态度和诲人不倦的高尚师德都深深感染和激励着我。在三年时光里,老师们不仅在学习上照顾我,同时也在思想和生活上给与我无微不至的关怀。

我还要感谢的是我的同班同学,是他们让我的大学生活变得更加丰富多彩,们给予了我生活和学习上的帮助。


本文来源:https://www.2haoxitong.net/k/doc/e632d5c96bdc5022aaea998fcc22bcd127ff4210.html

《基于51单片机的简易电子密码锁.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档

文档为doc格式