密码锁设计毕业论文.doc 36页

  • 2.54 MB
  • 2022-04-22 11:18:05 发布

密码锁设计毕业论文.doc

  • 36页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'金华职业技术学院JINHUAPOLYTECHNIC毕业教学环节成果(2015届)题目学院专业班级学号姓名指导教师2015年1月1日 金华职业技术学院毕业教学成果目录摘要1英文摘要1引言21设计方案选择31.1设计概述31.2设计要求及功能31.3设计方案论证和比较32系统硬件框图及单元电路的模块设计42.1主控制模块设计42.1.1STC89C52单片机的介绍42.1.2晶振电路介绍52.1.3复位电路介绍52.2显示模块设计62.3键盘输入模块设计62.4继电器驱动模块设计72.5声光报警提示模块设计82.6电源模块设计83系统软件设计93.1程序结构分析93.2系统程序流程图93.3键盘功能程序流程图93.4确认密码程序流程图104系统联机调试与分析11结论与谢辞12参考文献13附件1.元器件清单14附件2.电路仿真图15附件3.原理图及PCB图16 附件4.实物图17附件5.程序18 电子密码锁的设计信息工程学院应用电子技术专业曾天昊摘要:本文介绍一种基于STC89C52单片机的电子密码锁,采用矩阵式键盘作为输入设备,通过LCD显示数据。用户使用键盘输入密码,如果输入密码正确,则由单片机控制继电器驱动电子锁弹开,从而实现电子密码锁的功能。可以自行修改密码,并有恢复用户初始密码的功能。开锁后LCD将显示时间,可作电子钟使用。关键词:单片机密码锁时间显示矩阵键盘TheDesignoftheElectronicCombinationLock(MajorofAppliedElectronicTechnology,InformationandEngineeringcollege,JinHuaCollegeofVocationAndTechnology,Zengtianhao)Abstract:ThispaperintroducesakindofCombinationlockbasedonSTC89C51chipmicrocomputer,thematrixtypekeyboardasaninputdevice,displaydatabyLCD.Userstousethekeyboardtoenterapassword,iftheinputpasswordiscorrect,iscontrolledbyasinglechipmicrocomputerrelaydriveelectroniclockopen,soastorealizetheelectronicpasswordlockfunction.Youcanmodifythepassword,andrestoretheinitialpassword.WhenthelocktoopentheLCDwilldisplaythetime,canbeusedaselectronicclock.Keyword:MCUCombinationlockDisplaytimeMatrixkeyboard12 引言随着社会物质财富的日益增长,安全防盗已成为社会问题。在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。人们常需携带多把钥匙, 使用极不方便, 如果钥匙丢失,安全性即大打折扣。且传统的机械锁由于其构造的简单,被撬的事件屡见不鲜,无法满足人们的需要。如何实现防盗和安全这一问题也变的尤其的突出,而锁自古以来就是把门户的将军,人们对其要求比较高,不仅要能够安全的防盗,而且还要使用方便,这是制锁者长期以来研制的主题。而电子锁由于用密码代替钥匙其保密性高,使用灵活性好,安全系数高,受到了广大用户的亲呢。当今社会随着计算机的迅猛发展,数字电子技术已经进入人们生活的各个领域,在国内外,电子产品的更新可谓如雨后的春笋层出不群,更多的电子产品也越来越多的应用于安全防范领域。具有防盗报警功能的电子密码锁逐渐代替传统的机械式密码锁,克服了机械式密码锁密码量少、安全性能差的缺点,使密码锁有了巨大的变革,无论在技术上还是在性能上都大大提高一步。现代的电子技术与机械技术相结合,产生了一大批的智能锁。随着大规模集成电路技术的发展,特别是单片机的问世,出现了带微处理器的智能密码锁,使密码锁具有很高的安全性、可靠性,应用日益广泛。目前这类密码锁种类繁多,且各具特色,像指纹锁、IC卡辨识、遥控锁、声控锁等。我相信这类产品会在今后的各个领域逐渐普及起来,为人们的生活带来更多的安全和便利。现在应用较广的电子密码锁是以芯片为核心,通过编程来实现的。其性能和安全性已大大超过了机械锁。本文介绍的电子密码锁由单片机系统、矩阵键盘、LCD显示等系统组成,能完成密码输入开锁的功能。设计成本低廉,功能实用,可广泛用于车辆、大门、保险柜等各种需上锁的场所。12 1系统方案设计1.1设计概述选用STC89C52单片机作为主控制器件,通过4*4矩阵式键盘作为输入设备输入密码,如果正确则由单片机控制继电器驱动电子锁自动弹开。开锁后LCD将显示年月日、时分秒、星期,作电子钟使用。用户还可自行修改密码。1.2设计要求及功能1)使用LCD显示器显示。显示格式为16x2点阵式,第一行显示“Inputpassword:”即输入密码,第二行则会显示输入的密码,为增加安全性,密码将成*型显示。2)4x4矩阵键盘包括0—9数字键和A、B、C、D、E、F六个功能键。A为输入密码键,B为修改密码键,C为位选键,D为加一键,E为减一键,F为回复初始密码键。初始密码为“000000”。3)输入密码正确继电器开锁,LED亮起,LCD将显示“Passwordok!”的字样,5秒后进入时钟显示界面,显示年月日、时分秒、星期,可使用C、D、E三个键改变时间。4)输入密码错误LCD将显示“Passworderror!”的字样,连续错误三次会显示“Lockscreen!!!”的字样,并自锁30秒。5)进入时钟显示界面,按B键LCD将显示“SetPassword:”的字样,输入新密码后再按B键确认,完成密码的修改。1.3设计方案论证和比较实现电子密码锁的方法主要有以下几种。方案一:采用纯硬件电路。该系统的优点在于速度较快,不需要编程,但是设计复杂、灵活性较小、线路复杂、调试和安装不方便,实现难度大。方案二:FPGA/CPLD或采用带有IP内核的FPGA/CPLD方式。即用FPGA/CPLD完成采集、存储、显示等功能,由IP核实现人机交互等功能。这种方案的优点在于系统结构紧凑,可以实现复杂的控制,操作方便;缺点是调试过程复杂,成本较高。方案三:以单片机为核心。即用单片机完成人机界面、系统控制、数据处理,密码存储,由矩阵键盘模块完成用户输入采集等。这种方案克服了方案一、二的缺点,所以本此设计使用基于单片机的方案实现本次电子密码锁的设计。综上所述,本次设计从各方面考虑,采用方案三最为合理,相对设计较简单,容易实现,而且性能等完全满足题设要求,在现有资源的条件下,本次设计选定使用方案三。12 2系统硬件框图及单元电路的模块设计电子密码锁系统核心用STC89C52单片机控制,因为该型单片机价格便宜,功能比较强大,性价比高,而且在市场上很容易买到。密码输入按键为4*4矩阵键盘16个按键实现密码输入,有0—9数字键和A、B、C、D、E、F六个功能键。0—9做为密码输入,A为输入密码键,B为修改密码键,C为位选键,D为加一键,E为减一键,F为回复初始密码键。初始密码为“000000”,使用闪存防止掉电丢失数据。液晶显示采用1602LCD实时显示工作状态。综上所述,本系统的电路设计方框图如图2-1所示。图2-1电子密码锁电路总体设计方案2.1主控制模块设计2.1.1STC89C52单片机的介绍STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。拥有8K字节程序存储空间,512字节数据存储空间,内带2K字节EEPROM存储空间,可直接使用串口下载。另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。STC89C52单片机的最小系统和引脚如图2-2所示。12 图2-2主控制最小系统电路2.1.2晶振电路介绍晶振为单片机提供时钟信号。单片机XIAL1和XIAL2分别接22pF的电容,中间再并个11.0592MHZ的晶振,形成单片机的晶振电路如图2-3所示。图2-3晶振电路2.1.3复位电路介绍单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。89系列单片机的复位信号是从RST引脚输入到芯片内的施密特触发器中的。当系统处于正常工作状态时,且振荡器稳定后,如果RST引脚上有一个高电平并维持2个机器周期(24个振荡周期)以上,则CPU就可以响应并将系统复位。单片机系统的复位方式有:手动按钮复位和上电复位。根据实际情况选择如图2-4所示的复位电路。12 图2-4复位电路2.2显示模块设计LCD1602显示器具有体积小、功耗低、显示内容丰富、超薄轻巧等优点。显示器由32个字符点阵块组成,每个字符点阵块由5*7或5*10个点阵组成,可以显示ASCII码表中的所有可视的字符,采用5V电源供电。8位双向数据总线与单片机P0口连接,RS(寄存器选择)、R/W(读/写信号)、EN/E(显示器模块使能信号输入端)和单片机P2口连接,电路如图2-5所示。图2-5显示电路2.3键盘输入模块设计键盘输入电路采用的是4*4的矩阵键盘,因为本设计所用到的按键数量较多而不适合用独立按键式键盘因此采用的是矩阵式按键键盘,它由行和列组成,也称行列式键盘,按键位于行线和列线的交叉点上,密码锁的密码输入由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个4*12 4键盘不但能完成密码的输入还能作特别功能键使用,设置功能等。键盘的每个按键功能在程序设计中设置。平时无按键按下时,行线电平状态将由与此电平相连的列线电平决定。列线电平如果为低,则行线电平为低;列线电平为高,则行线电平也为高。这是识别矩阵键盘是否被按下的关键所在。由于矩阵键盘中的行、列为多键公用,各按键均影响该按键所在行和列的电平,因此,各按键彼此将相互发生影响,所以必须将行列线信号配合起来,并作适当的处理,这样才能决定闭合键的位置。其按键结构以及与单片机P3口接法如图2-7所示。图2-6键盘电路接法2.4继电器驱动模块设计使用SONGLE/松乐牌继电器,5V直流供电,同时其磁场会对单片机的工作造成影响,应放置在离单片机较远的位置。密码输入正确时,单片机发送信号给继电器,继电器吸合(接常开触点),使解锁机构通电,打开门锁。图2-7继电器驱动电路12 2.5声光报警提示模块设计每按下键盘上的按钮,蜂鸣器就会响起。密码输入正确时,配合继电器LED会点亮。确保了密码锁的实用性和准确性。图2-8声光报警电路2.6电源模块设计使用USB接口数据线连接插头给系统供电,实物图如图2-8所示。图2-9电源连接图12 3系统软件设计3.1程序结构分析本系统软件设计由主程序、初始化程序、LCD显示程序、键盘扫描程序、键盘功能程序、确认密码程序、重置密码程序、设置密码程序、EEPROM读写程序、校时程序和延时程序等组成。3.2系统程序流程图主程序:先执行初始化程序,然后启动程序,执行键盘扫描程序,根据各个功能键执行相应的功能。图3-1主程序流程图3.3键盘功能程序流程图键盘功能程序:先扫描各个IO口,确定哪个键按下,然后调用相应的子程序。12 图3-2键盘功能程序流程图3.4确认密码程序流程图确认密码程序:密码正确,则LED点亮、开锁。不正确三次,则自锁30秒。图3-3确认密码流程图12 4系统联机调试与分析调试输入密码时,显示器显示乱码现象。进行密码比较时,不论输入任何密码(包括正确密码),都没有开锁。经过程序检查,发现有两处错误:错误之一是密码的初始地址没给;错误之二是液晶初始化和清零程序有问题。还有是在调试的过程中遇到不少问题,后来改正后,显示和按键统一。在整个程序设计是使用C语言,通过改正以上错误及对硬件电路做出调整后,再进行通电调试,最终在实物上调试完成。在本设计中,程序设计与编程时通过看书上的资料,通过老师和同学的帮助,完成的比较顺利。12 结论与谢辞在论文完成之际,我要忠心的感谢身边给予过我莫大帮助的老师、同学和朋友,致以他们最诚挚的谢意。 我在导师林洁老师她的亲切关怀和悉心指导下最终完成了我的毕业设计。在我做论文的过程中林老师总是不厌其烦的给我进行论文指导,为我指点迷津进,修改论文,帮我开拓了研究的思路。这一过程占用了她很多的私人时间,但她仍不忘记在指导论文的过程中给我提一些可行性的意见和建议,这让我在整个论文的撰写过程中学习到了很多关于课题研究方面的知识,再次感谢我的指导老师林老师。真诚的感谢参加论文评审和答辩的各位老师,感谢你们的辛勤劳动和即将从你们那里获得的有益教诲,感谢同学们在设计中给予我的指导和帮助,在我遇到难题的时候能够乐意、耐心地同我一起讨论、分析问题和查阅资料,为我提供我没能买到的电子元件、焊接的电路板子和测试用的一些实验仪器,并且帮助我解决了不少在实物制作过程中出现的技术问题。最后,感谢所有的学校领导、老师和我的同学,在这三年让我得到了人生最大的一笔财富。在此,也对他们表示衷心感谢。感谢母校对我的培养,我要用我的所学,来回报母校,回报社会。12 参考文献[1]马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社.2004.[2]先锋工作室.单片机程序设计实例.清华大学出版社.2003.3.[3]马汝星.单片机应用系统设计与制作.人民邮电出版社,2010[4]李广弟.单片机基础.北航出版社.2010[5]郭惠等.单片机C语言程序设计完全自学手册.电子工业出版社,2008.10.[6]郑惠群等.电子产品生产工艺与管理实训.浙江科学技术出版社.2012.8.[7]余红娟等.电子电路分析与调试实践指导.北京人民邮电出版社.2010.5.[8]余红娟等.电子技术基本技能.北京人民邮电出版社.2009.10.33 附件1.元器件清单物质名称规格型号数量(单位)单片机STC89C521块USB接口2.01个液晶屏LCD16021块电解电容10uF1个瓷片电容22pF2个按键SW-PB16只三极管85502个蜂鸣器1.6V1个LED灯红1个晶振11M1个电位器50K1个电阻10K2个电阻1K1个排阻RESPACK-81个继电器5V1个33 附件2.电路仿真图33 附件3.原理图及PCB图33 附件4.实物图33 附件5.程序#include//调用头文件(单片机内部的寄存器定义)#include//调用头文件(单片机内部的寄存器定义)#include"stc89c5x_eeprom.h"#include"stc89c5x.h"#defineucharunsignedchar#defineuintunsignedintsbitLED=P2^1;charSS,MM,HH,N,Y,R;charH,L;charflag=0;ucharcountt=0;ucharcounter1,x;uchartable1[5];//存储AC参数值基础运算数据单个最大6位longA;//A结果longGG=0;sbitJDQ=P1^0;/********模块变量定义区*******************************************/charSS,MM,HH,XQ,DA,MO,YE;uintcountt1=0;//定义秒钟产生的计数变量。charcounter11=0;//用于记录K1键选择的是哪个被设置变量ucharkey_value=0;//用于记录键盘扫描获得的键值/******************************************************************-函数名称:timer0_init()-隶属模块:time.h-函数属性:内部-参数说明:无返回值,无带入参数-返回说明:无-功能描述:对定时器T0进行初始化.*****************************************************************/voidtimer0_init()//定时器T0的初始化程序{TMOD=TMOD|0X01;//00000001T0工作于方式1,定时模式TH0=(65536-50000)/256;TL0=(65536-50000)%256;//定时50MSEA=1;ET0=1;//开启总中断,和分中断TR0=1;//启动定时器T033 }/******************************************************************-函数名称:timer0()interrupt1-隶属模块:time.h-函数属性:内部-参数说明:无返回值,无带入参数-返回说明:无-功能描述:中断自动响应函数,无需调用.中断产生成秒、分、时信息*****************************************************************/voidtimer0()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;//一定要重新赋初值countt1++;if(countt1==20)//如果count=1000表示产生了1秒钟{countt1=0;//清零计数变量,以便下一次计数使用SS++;if(SS>59){SS=0;MM++;if(MM>59){MM=0;HH++;if(HH>23){HH=0;DA++;if(DA>30){DA=1;MO++;if(MO>12){MO=1;YE++;if(YE>99){YE=0;}}}}}}}}/******************************************************************33 -函数名称:dis_timer()-隶属模块:time.h-函数属性:内部-参数说明:无返回值,无带入参数-返回说明:无-功能描述:系统时钟显示界面、设置时钟显示界面*****************************************************************/voiddis_timer()//时钟日期显示函数{ucharm;//定义一个变量用于闪烁临时计数m=SS&0x01;//通过m变量的取值来实现变量闪烁lcd_xy_puts(0,0,"20");//显示固定字符20/*------------------“年份”显示代码部分--------------------------*/if(counter11==7)//年变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将年显示出来{lcd_goto_xy(2,0);lcd_number(YE/10);lcd_number(YE%10);}else//则显示空格字符。{lcd_goto_xy(2,0);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示年{lcd_goto_xy(2,0);lcd_number(YE/10);lcd_number(YE%10);}/*------------------“间隔符”显示代码部分------------------------*/lcd_putc("/");//间隔符显示/*------------------“月份”显示代码部分--------------------------*/if(counter11==6)//月变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将月显示出来{lcd_goto_xy(5,0);lcd_number(MO/10);lcd_number(MO%10);}else//则显示空格字符。{lcd_goto_xy(5,0);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示月{lcd_goto_xy(5,0);lcd_number(MO/10);lcd_number(MO%10);}/*------------------“间隔符”显示代码部分------------------------*/lcd_putc("/");//间隔符显示/*-------------------“日”显示代码部分---------------------------*/if(counter11==5)//日变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将日显示出来{lcd_goto_xy(8,0);lcd_number(DA/10);lcd_number(DA%10);}else//则显示空格字符。{lcd_goto_xy(8,0);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示月33 {lcd_goto_xy(8,0);lcd_number(DA/10);lcd_number(DA%10);}/*------------------“间隔字符”显示代码部分----------------------*/lcd_puts("WEEK");//字符显示/*------------------“星期”显示代码部分--------------------------*/if(counter11==4)//星期变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将日显示出来{lcd_goto_xy(15,0);lcd_number(XQ%10);}else//则显示空格字符。{lcd_goto_xy(15,0);lcd_putc("");}}else//否则年变量不处于修改状态,直接显示月{lcd_goto_xy(15,0);lcd_number(XQ%10);}/*------------------“小时”显示代码部分---------------------------*/if(counter11==3)//小时变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将小时显示出来{lcd_goto_xy(4,1);lcd_number(HH/10);lcd_number(HH%10);}else//则显示空格字符。{lcd_goto_xy(4,1);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示月{lcd_goto_xy(4,1);lcd_number(HH/10);lcd_number(HH%10);}/*------------------“冒号”显示代码部分---------------------------*/if(counter11==0)//如果不处于设置状态冒号才交替闪烁{if(m==0)lcd_putc(":");elselcd_putc("");}elselcd_putc(":");//否则处于设置状态下,直接显示不闪烁提示/*------------------“分钟”显示代码部分---------------------------*/if(counter11==2)//分钟变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将分钟显示出来{lcd_goto_xy(7,1);lcd_number(MM/10);lcd_number(MM%10);}else//则显示空格字符。{lcd_goto_xy(7,1);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示分钟{lcd_goto_xy(7,1);lcd_number(MM/10);lcd_number(MM%10);}/*------------------“冒号”显示代码部分---------------------------*/if(counter11==0)//如果不处于设置状态冒号才交替闪烁{if(m==0)lcd_putc(":");elselcd_putc("");}elselcd_putc(":");//否则处于设置状态下,直接显示不闪烁提示/*------------------“秒钟”显示代码部分---------------------------*/if(counter11==1)//秒钟变量处于设置状态,1秒钟闪烁一次{if(m==0)//如果m=0,就将秒钟显示出来33 {lcd_goto_xy(10,1);lcd_number(SS/10);lcd_number(SS%10);}else//则显示空格字符。{lcd_goto_xy(10,1);lcd_putc("");lcd_putc("");}}else//否则年变量不处于修改状态,直接显示分钟{lcd_goto_xy(10,1);lcd_number(SS/10);lcd_number(SS%10);}}/******************************************************************-函数名称:set_time-隶属模块:sys_app.h-函数属性:内部-参数说明:无返回值,无带入参数无-返回说明:无-功能描述:系统时间设置函数,通过此函数设置时钟、日期功能。*****************************************************************/voidset_time(void)//系统菜单——设置时间函数{/*时钟设置界面显示*/dis_timer();/*键盘扫描获取键值*/num=keyscan();//反复扫描4*4键盘获得按键参数/*判断是否是一次有效的按键按下*//*------------------被设置变量选择代码部分---------------------*/if(num==12)//如果key_value=0代表“选择设置参数键按下”{num=255;counter11++;//让记录设置的参数的变量值+if(counter11>7)counter11=0;//因为只有7个参数需要修改}/*------------------秒钟设置程序部分代码部分-------------------*/if(counter11==1){if(num==13)//+{SS++;if(SS>59)SS=59;num=255;}if(num==14)//-{SS--;if(SS<0)SS=0;num=255;}}/*------------------分钟设置程序部分代码部分-------------------*/if(counter11==2){if(num==13)//+{MM++;if(MM>59)MM=59;num=255;}if(num==14)//-{MM--;if(MM<0)MM=0;num=255;}}/*------------------小时设置程序部分代码部分-------------------*/if(counter11==3){if(num==13)//+{HH++;if(HH>23)HH=23;num=255;}33 if(num==14)//-{HH--;if(HH<0)HH=0;num=255;}}/*------------------星期设置程序部分代码部分-------------------*/if(counter11==4)//设置秒钟XQ{if(num==13)//+{XQ++;if(XQ>7)XQ=7;num=255;}if(num==14)//-{XQ--;if(XQ<0)XQ=0;num=255;}}/*------------------日设置程序部分代码部分-------------------*/if(counter11==5){if(num==13)//+{DA++;if(HH>31)HH=31;num=255;}if(num==14)//_{DA--;if(DA<0)DA=0;num=255;}}/*------------------月份设置程序部分代码部分-------------------*/if(counter11==6){if(num==13)//+{MO++;if(MO>12)MO=12;num=255;}if(num==14)//-{MO--;if(MO<0)MO=0;num=255;}}/*------------------年份设置程序部分代码部分-------------------*/if(counter11==7){if(num==13)//+{YE++;if(YE>99)YE=99;num=255;}if(num==14)//-{YE--;if(YE<0)YE=0;num=255;}}}voidchange_word(){if(num==11){num=255;lcd_init();table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;A=GG=x=counter1=0;Beep_key();lcd_goto_xy(0,0);lcd_puts("Setpassword:");GG=0;while(1){num=keyscan();//反复扫描4*4键盘获得按键参数if((num<10)&&(x<6))//A{lcd_goto_xy(5+x,1);Beep_key();33 lcd_number(num);table1[counter1]=num;//0,1,2,3,4x++;counter1++;num=255;}if(num==11){num=255;Beep_key();if(counter1==1){GG=table1[0];counter1=0;table1[0]=0;}if(counter1==2){GG=table1[0]+table1[1];counter1=0;table1[0]=table1[1]=0;}if(counter1==3){GG=table1[0]+table1[1]+table1[2];counter1=0;table1[0]=table1[1]=table1[2]=0;}if(counter1==4){GG=table1[0]+table1[1]+table1[2]+table1[3];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=0;}if(counter1==5){GG=table1[0]+table1[1]+table1[2]+table1[3]+table1[4];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=0;}if(counter1==6){GG=table1[0]+table1[1]+table1[2]+table1[3]+table1[4]+table1[5];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;}SectorErase(0X2000);byte_write(0X2000,GG);lcd_init();break;}}}}voidshizhong1(){uintRR=0;uintBB=0;while(1){num=keyscan();lcd_goto_xy(0,0);lcd_puts("Lockscreen!!!");lcd_goto_xy(7,1);lcd_number(BB/10);lcd_number(BB%10);flag=0;if(BB>29){Beep_key();BB=RR=0;lcd_init();table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;LED=1;A=x=counter1=0;num=255;break;}if(num==15){Beep_key();lcd_init();MM=HH=SS=0;table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;LED=1;A=x=counter1=0;num=255;break;}RR++;if(RR==1000){RR=0;BB++;}33 }}voidmimasuo(){lcd_goto_xy(0,2);lcd_puts("Inputpassword:");if((num<10)&&(x<6))//A{lcd_goto_xy(5+x,1);Beep_key();lcd_putc("*");table1[counter1]=num;//0,1,2,3,4x++;counter1++;num=255;}if(num==10){num=255;Beep_key();if(counter1==1){A=table1[0];counter1=0;table1[0]=0;}if(counter1==2){A=table1[0]+table1[1];counter1=0;table1[0]=table1[1]=0;}if(counter1==3){A=table1[0]+table1[1]+table1[2];counter1=0;table1[0]=table1[1]=table1[2]=0;}if(counter1==4){A=table1[0]+table1[1]+table1[2]+table1[3];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=0;}if(counter1==5){A=table1[0]+table1[1]+table1[2]+table1[3]+table1[4];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=0;}if(counter1==6){A=table1[0]+table1[1]+table1[2]+table1[3]+table1[4]+table1[5];counter1=0;table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;}GG=byte_read(0x2000);if(A==GG){lcd_init();Beep_key();LED=0;JDQ=0;lcd_goto_xy(0,0);lcd_puts("Passwordok!");delay(5000);lcd_init();while(1){LED=0;num=keyscan();//反复扫描4*4键盘获得按键参数dis_timer();set_time();change_word();if(num==10){Beep_key();JDQ=1;lcd_init();table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;LED=1;A=x=counter1=0;num=255;break;}}}else{Beep_key();lcd_goto_xy(0,0);lcd_init();JDQ=1;lcd_puts("Passworderror!");delay(5000);lcd_init();flag++;if(flag==3)33 shizhong1();lcd_init();table1[0]=table1[1]=table1[2]=table1[3]=table1[4]=table1[5]=0;A=x=counter1=0;num=255;LED=1;beep=0;delay(500);beep=1;beep=0;delay(500);beep=1;beep=0;delay(500);beep=1;}}}voidtimer1_int()//定时器T0初始化函数{TMOD=0X10;//00000001TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET1=1;TR1=1;}voidtimer1()interrupt3//定时器T1中断函数{TH1=(65536-50000)/256;TL1=(65536-50000)%256;countt++;if(countt==20){countt=0;SS++;if(SS>59){SS=0;MM++;if(MM>59){MM=0;HH++;if(HH>23){HH=MM=SS=0;}}}}}voidmain(){N=12;Y=5;R=16;HH=22;MM=58;SS=GG=0;lcd_init();timer1_int();num=255;H=15;L=5;LED=beep=1;P3=0XFF;33 while(1){mimasuo();num=keyscan();//反复扫描4*4键盘获得按键参数if(num==15){num=255;Beep_key();SectorErase(0X2000);byte_write(0X2000,0);}}}#ifndef_lcd1602_H_#define_lcd1602_H_#include#include"stc89c5x.h"#defineucharunsignedchar#defineuintunsignedintsbitrs=P2^7;sbitrw=P2^6;sbitep=P2^5;codeucharLCDnumber[]="0123456789";voiddelay22(unsignedcharms){unsignedchari;while(ms--){for(i=0;i<250;i++){_nop_();_nop_();_nop_();_nop_();}}}bitlcd_bz(){bitresult;rs=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);ep=0;returnresult;}33 voidlcd_wcmd(unsignedcharcmd){while(lcd_bz());//判断LCD是否忙碌rs=0;rw=0;ep=0;_nop_();_nop_();P0=cmd;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidlcd_wdat(unsignedchardat){while(lcd_bz());//判断LCD是否忙碌rs=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0;}voidlcd_goto_xy(unsignedcharx,unsignedchary){if(y==1)x+=0x40;x+=0x80;lcd_wcmd(x);}voidlcd_putc(unsignedcharc)//33 写字符(传入的参数实际为所需显示字符的地址,即液晶字符产生器中字符的地址){rw=0;//RW置0,状态为写rs=1;//RS置1,写入数据lcd_wdat(c);}voidlcd_puts(unsignedchar*s)//写字符串函数{while(*s){lcd_wdat(*s);s++;}}/**********************************************************************函数名称:display_char**入口参数:x(unsignedchar型),y(unsignedchar型),dat(unsignedchar型)**出口参数:无**功能描述:在具体位置显示单个字符,x是列号,y是行号*********************************************************************/voidlcd_xy_putc(unsignedcharx,unsignedchary,unsignedchardat){lcd_goto_xy(x,y);lcd_wdat(dat);}/***********************************************************************函数名称:display_string**入口参数:x(unsignedchar型),y(unsignedchar型),s(指针型)**出口参数:无**功能描述:在具体位置显示字符串,以/0结束,x是列号,y是行号**********************************************************************/voidlcd_xy_puts(unsignedcharx,unsignedchary,unsignedchar*s){lcd_goto_xy(x,y);while(*s){lcd_wdat(*s);s++;}}voidlcd_number(unsignedchara)//变量数字显示{rw=0;//RW置0,状态为写rs=1;//RS置1,写入数据lcd_wdat(LCDnumber[a]);}33 voidlcd_init(){lcd_wcmd(0x38);delay22(1);lcd_wcmd(0x0c);delay22(1);lcd_wcmd(0x06);delay22(1);lcd_wcmd(0x01);delay22(1);}#endif#ifndef_key_H_#define_key_H_#defineucharunsignedchar#defineuintunsignedint#include"stc89c5x.h"uintnum;//按键键值uinttemp;//键盘参数记录变量uchartemp1;//高两位记录变量uchartemp2;//高两位记录变量charcounter=0;sbitbeep=P2^0;//2.1voiddelay13(intnum){//延时函数while(num--);}voidBeep_key(void){//扬声器--按键音unsignedchara;//定义变量用于发声的长度设置for(a=80;a>0;a--){//声音的长度beep=~beep;delay13(150);//音调设置延时}beep=1;//音乐结束后扬声器拉高关闭}voiddelay(unsignedinttc)//按键延时程序{while(tc!=0){unsignedinti;for(i=0;i<100;i++);tc--;}}33 unsignedcharkeyscan()//*jianpansaomiao*//{/*********第一行键盘的检测**********/P3=0xfe;//设置P1口的电平为11111110,也就是让P1.0口为低电平,其他的口为高电平temp=P3;//读取P1口的电平temp=temp&0xf0;//P1口的电平跟11110000做与操作while(temp!=0xf0)//检测到第一行上有键盘按下去了{delay(5);//延时5ms用来消除按键的抖动temp=P3;//再次读取P1口的电平temp=temp&0xf0;//P1口的电平跟11110000做与操作while(temp!=0xf0)//延时后确实有人按下了第一行的键盘(不是别的干扰导致的){temp=P3;//因为已经确定按下了键,这时就读取P1口的电平switch(temp){case0xee:num=0;//按下的是第一个键,我们就把1赋值给num1112121212break;//跳出switch语句case0xde:num=1;//按下的是第二个键,我们就把2赋值给num10108888888break;//跳出switch语句case0xbe:num=2;//按下的是第三个键,我们就把3赋值给num5555554444444444444break;//跳出switch语句case0x7e:num=3;//按下的是第四个键,我们就把4赋值给num00000break;//跳出switch语句}while(temp!=0xf0)//等待松手,如果按下去是一直按着的,没松手的话就一直循环,如果松了手的话,就可以跳出while语句了,回到最后的return语句,返回num的值,接着数码管执行显示num的值{temp=P3;temp=temp&0xf0;}}}/**************第二行键盘的检测*************/P3=0xfd;33 temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xed:num=4;//12131313break;case0xdd:num=5;//7777799999999999999break;case0xbd:num=6;//6666665555555555555555break;case0x7d:num=7;//1111111break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}/********第三行键盘的检测*********/P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xeb:num=8;//131414break;case0xdb:num=9;//88810break;case0xbb:num=10;//22226666666666666break;case0x7b:num=11;//222222222break;33 }while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}/*******第四行键盘的检测*******/P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case0xe7:num=12;//`14break;case0xd7:num=13;//999911111111break;case0xb7:num=14;//444444477777777777break;case0x77:num=15;//3333333333break;}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}returnnum;//返回num的值给主程序}#endif33'