1 / 37
文档名称:

电子密码锁 总结报告 李超 电气09-3班.pdf

格式:pdf   大小:3,465KB   页数:37页
下载后只包含 1 个 PDF 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

电子密码锁 总结报告 李超 电气09-3班.pdf

上传人:青山代下 2024/5/21 文件大小:3.38 MB

下载得到文件列表

电子密码锁 总结报告 李超 电气09-3班.pdf

相关文档

文档介绍

文档介绍:该【电子密码锁 总结报告 李超 电气09-3班 】是由【青山代下】上传分享,文档一共【37】页,该文档可以免费在线阅读,需要了解更多关于【电子密码锁 总结报告 李超 电气09-3班 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。:..基于单片机的电子密码锁设计TheDesignofElectronicPassword-lockwithSCM学生姓名:刘根鑫、王浩、许锦玮所在院系:电气与信息工程学院所学专业:信息工程所在班级:10-4学号:04101800、04101806、04101810时间:2012-11-13指导教师:..第一章课题任务基于51单片机的简易电子密码锁一、实现功能:1、设置6位密码,密码通过键盘输入,若密码正确,则将锁打开。2、密码可以由用户自己修改设定(只支持6位密码),锁打开后才能修改密码。修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作。3、报警、锁定键盘功能。密码输入错误显示器会出现错误提示,若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘。4、AT24C02保存密码,支持复位保存,掉电保存功能。2:..第2章系统总体方案设计方案一:采用数字电路控制。其原理方框图如图2-1所示。图2-1数字密码锁电路方案采用数字密码锁电路的好处就是设计简单。用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,共设了9个用户输入键,其中只有4个是有效的密码按键,其它的都是干扰按键,若按下干扰键,键盘输入电路自动清零,原先输入的密码无效,需要重新输入;如果用户输入密码的时间超过40秒(一般情况下,用户不会超过40秒,若用户觉得不便,还可以修改)电路将报警80秒,若电路连续报警三次,电路将锁定键盘5分钟,防止他人的非法操作。电路由两大部分组成:密码锁电路和备用电源(UPS),其中设置UPS电源是为了防止因为停电造成的密码锁电路失效,使用户免遭麻烦。密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路、键盘输入次数锁定电路。方案二:采用一种是用以AT89S51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的IO端口,及其控制的准确性,不但能实现基本的密码锁功能,还能添加调电存储、声光提示甚至添加遥控控制功能。其原理如图2-2所示。3:..键盘输入模块显示模块报警电路复位电路AT89C51密码存储模块开锁电路图2-2单片机控制方案通过比较以上两种方案,单片机方案有较大的活动空间,不但能实现所要求的功能而且能在很大的程度上扩展功能,而且还可以方便的对系统进行升级,所以我们采用后一种方案。本方案采用一种是用以89c51为核心的单片机控制方案。利用单片机灵活的编程设计和丰富的I/O端口,及其控制的准确性,实现基本的密码锁功能。作用说明:开锁:插上电源后,输入正确密码,然后按【#】(确认)键,此时锁会打开,可以看到显示open,密码锁打开。1、退出并关锁:按下【*】(取消)键,此时锁关闭,所有输入清除。2、修改密码:在开锁状态下,再次输入正确的密码并按下【#】(确认)键,此时听到两声提示,输入新的六位密码并按【D】(重设)键,再重复输入一次新密码并按【D】,会听到报警并锁定键盘:当输入密码错误后,报警并锁定键盘3秒,如3秒内又有按键,3秒再启动。当重置新密码时,新密码会保存于AT24C02存储器里。4:..,所以本设计就采用行列式键盘,同时也能减少键盘与单片机接口时所占用的I/O线的数目,在按键比较多的时候,通常采用这样方法。。(行线)与垂直线(列线)的交叉处不相通,而是通过一个按键来连通,利用这种行列式矩阵结构只需要N条行线和M条列线,即可组成具有N×M个按键的键盘。在这种行列式矩阵键盘非键盘编码的单片机系统中,键盘处理程序首先执行等待按键并确认有无按键按下的程序段。当确认有按键按下后,下一步就要识别哪一个按键按下。对键的识别通常有两种方法:一种是常用的逐行扫描查询法;另一种是速度较快的线反转法。×4键盘,说明线反转个工作原理。首先辨别键盘中有无键按下,有单片机I/O口向键盘送全扫描字,然后读入行线状态来判断。方法是:向行线输出全扫描字00H,把全部列线置为低电平,然后将列线的电平状态读入5:..累加器A中。如果有按键按下,总会有一根行线电平被拉至低电平从而使行线不全为1。判断键盘中哪一个键被按下使通过将列线逐列置低电平后,检查行输入状态来实现的。方法是:依次给列线送低电平,然后查所有行线状态,如果全为1,则所按下的键不在此列;如果不全为1,则所按下的键必在此列,而且是在与零电平行线相交的交点上的那个键。具体的功能设计如下按键说明采用4X4键盘输入,键盘对应名称如下:123A456B789C*0#D其中,【0—9】为数字键,用于输入相应的密码,【*】号键为取消当前操作【#】、线圈、衔铁、触点簧片等组成的。只要在线圈两端加上一定的电压,线圈中就会流过一定的电流,从而产生电磁效应,衔铁就会在电磁力吸引的作用下克服返回弹簧的拉力吸向铁芯,从而带动衔铁的动触点与静触点(常开触点)吸合。当线圈断电后,电磁的吸力也随之消失,衔铁就会在弹簧的反作用力返回原来的位置,使动触点与原来的静触点(常闭触点)吸合。这样吸合、释放,从而达到了在电路中的导通、切断的目的。对于继电器的“常开、常闭”触点,可以这样来区分:继电器线圈未通电时处于断开状态的静触点,称为“常开触点”;处于接通状态的静触点称为“常闭触点”。当输入正确密码时,二极管导通发光。输入错误密码时,二极管不能导通。6:..,电路中蜂鸣器开始报警。当输入密码错误三次时,蜂鸣器持续报警,,存储在AT24C02中,从而实现掉电保护7:..,使单片机从一种确定的状态开始运行。当8XX51单片机的复位引脚RST出现5ms以上的高电平时单片机就完成了复位操作。如果RST持续为高电平,单片机就处于循环复位状态,而无法执行程序。因此要求复位后能脱离复位状态。根据应用的要求,复位操作通常有两种基本形式:上电复位、开关复位。上电复位要求接通电源后,自动实现复位操作。8:..第四章程序设计主程序设计流程图如图5-1所示。开始初始化修改开锁输入旧密码密码正确NYNN原密码相同Y开锁出错报警设新密码返回图5-1主程序流程图9:..键功能程序流程图如图5-2所示。键功能程序Y键值=0~9?密码输入程序NY键值=开锁?开锁程序NY键值=设置?设置程序NY键值=确认?确认程序N返回图5-2键功能流程图10:..5-3所示。开锁LCD初始化按开锁键输入密码确认程序N输入密码正确?报警程序Y返回开锁成功图5-3开锁流程图11:..系统调试先在proteus中仿真出来结果,能够达到预期目标。通过自己的焊接,使得实物的密码锁也成功满足要求。当输入正确密码时,液晶显示屏上显示open,且绿灯亮。当输入密码错误时,屏上显示error,且发出滴滴滴的报警声。12:..第六章总结我觉得做利用单片机做电子综合设计设计是十分有意义的,而且是十分必要的。在已度过的大学时间里,我们大多数接触的是专业基础课。我们在课堂上掌握的仅仅是专业课的理论知识,如何去锻炼我们的实践能力?如何把我们所学的专业基础课理论知识运用到实践中去呢?我想做类似的电子综合设计就为我们提供了良好的实践平台。在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做电子综合设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:protel99制图、汇编语言、c语言等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。最后,要做好一个电子综合设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。在焊接完成了调试的过程中,也出现了一些问题,一开始,液晶屏不亮,则根据情况找出原因是没有调节滑动变阻器改变灰度。当屏幕有显示之后,发现密码总是存不进去,则进一步找出是AT24c02连接有问题,经过反复的检查电路,发现其正极没有连接,经过连接之后,终于实现了理想的功能。在整个电子设计的过程当中,发现问题,并解决问题,才是我们急需锻炼的能力。另外,这次课程设计让我感到了团队合作的重要性。在团队中,我们互帮互助,对整个课程设计来说,这是至关重要的,缺少每一个人都会对我们的设计产生影响。几周的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。同时意识到自己还有很多不足的地方,以后还得继续改进,争取做到越来越好。13:..14:..(模拟部分).-:天津大学出版社,:北京航空航天大学出版社,:..附录:A程序如下:#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”};16:..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)//延时{17:..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;18:..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=Data<<1;Data=temp;BitCounter--;}while(BitCounter);Scl=0;}/*读一字节的数据,并返回该字节值*/ucharRead(void){uchartemp=0;uchartemp1=0;ucharBitCounter=8;Sda=1;do{Scl=0;19:..Nop();Scl=1;Nop();if(Sda)temp=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<Num;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<Num;i++){Start();Send(0xa0);20:..Ack();Send(Address+i);Ack();Start();Send(0xa1);Ack();*(Pdata+i)=Read();Scl=0;NoAck();Stop();}}//==================================================================================================//=======================================LCD1602====================================================//==================================================================================================#defineyi0x80//LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#defineer0x80+0x40//LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//----------------延时函数,后面经常调用----------------------voiddelay(uintxms)//延时函数,有参函数{uintx,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);}//--------------------------写指令---------------------------()//****液晶写入指令函数****{lcd1602_rs=0;//数据/指令选择置为指令lcd1602_rw=0;//读写选择置为写;//送入数据delay(1);lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令}21:..//-------------------------写数据-----------------------------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){(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据(0x0c);//开显示不显示光标(0x06);//整屏不移动,光标自动右移(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;22:..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);//行线与列线组合后返回23:..}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)24:..{//DisplayOneChar(9+N,1,’*’);(yi+5+N);write_1602dat(‘*’);}//=======================显示提示输入=========================voidDisplayChar(void){unsignedcharI;if(pass==1){//DisplayListChar(0,1,LockOpen);(er);for(i=0;i<16;i++){write_1602dat(LockOpen[i]);}}else{if(N==0){//DisplayListChar(0,1,Error);(er);for(i=0;i<16;i++){write_1602dat(Error[i]);}}else{//DisplayListChar(0,1,start_line);(er);for(i=0;i<16;i++){write_1602dat(start_line[i]);}}}}voidDisplayInput(void){unsignedcharI;if(CorrectCont==1)25:..{//DisplayListChar(0,0,Input);(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);(er);for(j=0;j<16;j++){write_1602dat(Error[j]);}26:..ThreeAlam();//pass=0;ReInputEn=0;//关闭重置功能,ReInputCont=0;DisplayChar();break;}}if(i==6){//DisplayListChar(0,1,ResetOK);(er);for(j=0;j<16;j++){write_1602dat(ResetOK[j]);}TwoAlam();//操作成功提示WrToROM(TempPassword,0,6);//将新密码写入24C02