设计说明书(密码锁)_第1页
设计说明书(密码锁)_第2页
设计说明书(密码锁)_第3页
设计说明书(密码锁)_第4页
设计说明书(密码锁)_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

PAGEPAGE1《单片机实训》仿真设计说明书 专业名称:电子信息工程 班级:11班 学号:2010 姓名: 指导教师: 日期:201目录一、设计的目的和意义 -3-1、设计背景 -3-2、设计的目的及意义 -3-二、设计原理及规模 -5-1、器件的简介 -5-(1)AT89C51的简介 -5-(2)LCD显示屏简介 -7-2、软件程序设计 -9-三、正文 -10-1、方案的论证 -10-2、主要参数的计算 -10-3、功能的实现 -11-(1)硬件部分 -11-①矩阵键盘 -11-②LCD显示电路 -12-③键盘的消抖 -13-④仿真电路 -13-(2)软件部分 -13-①LCD显示模块 -14-②密码判断模块 -14-③密码重置模块 -17-④密码锁复位模块 -18-⑤密码安全提示模块 -19-四、结论 -20-五、参考书目 -21-六、附录 -22-一、设计的目的和意义1、设计背景在现今社会中,安全防盗已经成为严重的社会问题,锁具自古以来就是防盗的重要工具。目前国内很多人都还在使用传统的机械锁,机械锁存在很大的弊端。所以新型的电子密码锁有了更大的发展空间。从现在的技术水平和市场认可度上来分析,目前使用最为广泛的按键式电子密码锁。电子密码锁一般用于保险柜,取款机等重要地方。由于电子密码锁的实用,涌现出了更多的电子智能密码锁,如:指纹识别的电子密码锁等高科技含量的锁具。但是此类密码锁在公共场所容易损坏,成本也比较高,所以键盘式的电子密码锁依然是防盗的主流产品。键盘式电子密码锁突出的优点是密码在授权人的脑袋里记着,即准确有可靠。很难丢失。此外电子密码锁还有很多特点。如:密码可变。用户可以随时的更改密码。防止密码泄露。误码输入保护,当密码输入错误时,系统会自动报警。电子密码锁不同于机械锁。电子密码锁没有活动零件,不会磨损,寿命长,电子密码锁的操作也非常简单。现在锁具在原有锁的基础上充分运用了现代科技,出现了磁控锁,声控锁,遥控锁,红外锁,电子卡片锁,超声波锁,电磁波锁,指纹锁等高科技含量的锁具。大大提高了锁的安全性,可靠性。2、设计的目的及意义(1)设计目的①掌握单片机控制知识,学习扩展外部设备的基本技能。②通过设计学以致用,加强单片机的实践操作能力。(2)设计意义在现代文明社会,随着人们生活水平和自身防范意识的提高,个人财产安全和人身安全的问题也越来越受到人们的重视,拥有一把能够有效保证居民财产安全和人身安全的锁具也越发的重要起来。锁具的起源可以追朔到人类社会财产私有化的出现,锁具从其出现到发展至今天的高科技化、信息化,已经有若干年的历史了。经过若干年的使用和研究,人们对锁具的结构、机理也了解得相当透彻了,因此,不使用钥匙就能将锁打开的方法也层出不穷。特别是传统的机械锁,由于其构造简单,在惯偷面前,甚至能够只用一根铁丝就直接将其打开,使其失去了保障用户个人财产安全的意义。在信息现代化的今天,锁具也应该向高精度、高安全性的智能化、信息化发展。自20世纪70年代第一块单片机芯片TMS-1000于美国德克萨斯仪器公司面世以来,基于其体积小、价格低廉、个性突出等特点,越来越多的电子产品开始采用单片机芯片作为核心控制部件。在这样的大环境下,基于单片机的电子密码锁也应运而生。这种电子密码锁是以单片机为核心,配以相应的硬件电路和软件程序,实现密码的设置、存贮、识别和显示,以及报警信号的接收和发送等功能,具有操作快、修改密码简单、安全性高、功耗低等优点。基于单片机的电子密码锁的面世使人们的自身财产安全有了更多的保障,同时也促进了安全信息系统的发展,是安全信息系统的一大进步。基于单片机的电子密码锁的出现,在一定程度上解决了用户私人财产安全的问题。但是,时代在发展,社会在进步,任何事物只有不断地进步才能适应时代发展的需求。电子密码锁虽然有安全性高、操作简单等优点,因此,研究基于单片机的电子密码锁的设计是很有必要且具有现实意义的。二、设计原理及规模在本次实验中,使用了单片机和数字电路两种仿真方式设计出了较为合理的密码锁方案,我们也对传统密码锁进行了适当改进,使其更适应当今复杂多变社会的防盗环境。通过AT89C51单片机进行模拟控制,LCD显示屏和发光二极管进行时间和状态的显示,实现智能密码锁的控制。1、器件的简介(1)AT89C51的简介AT89C51是一种带4K字节闪烁可编程可擦除只读存储器(FPEROM—FalshProgrammableandErasableReadOnlyMemory)的低电压,高性能CMOS8位微处理器,俗称单片机。AT89C2051是一种带2K字节闪烁可编程可擦除只读存储器的单片机。单片机的可擦除只读存储器可以反复擦除100次。该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,AT89C2051是它的一种精简版本。AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。与MCS-51兼容,4K字节可编程闪烁存储器,寿命:1000写/擦循环,数据保留时间:10年,全静态工作:0Hz-24Hz,三级程序存储器锁定,128*8位内部RAM,32可编程I/O线,两个16位定时器/计数器,5个中断源(两个外部中断源和3个内部中断源),可编程串行通道,低功耗的闲置和掉电模式,片内振荡器和时钟电路。管脚说明:VCC:供电电压。GND:接地。P0口:P0口为一个8位漏级开路双向I/O口,当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据地址的低八位。在FIASH编程时,P0口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。并因此作为输入时,P2口的管脚被外部拉低,将输出电流。这是由于内部上拉的缘故。P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。P2口在FLASH编程和校验时接收高八位地址信号和控制信号。P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。P3口也可作为AT89C51的一些特殊功能口:P3.0RXD(串行输入口)P3.1TXD(串行输出口)P3.2/INT0(外部中断0)P3.3/INT1(外部中断1)P3.4T0(计时器0外部输入)P3.5T1(计时器1外部输入)P3.6/WR(外部数据存储器写选通)P3.7/RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。RST:复位输入。当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的低位字节。PSEN:外部程序存储器的选通信号。在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。EA/VPP:当/EA保持低电平时,则在此期间外部程序存储器(0000H-FFFFH),不管是否有内部程序存储器。注意加密方式1时,/EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。XTAL2:来自反向振荡器的输出。引脚图如图1所示:图1AT89C51引脚图(2)LCD显示屏简介1602液晶也叫1602字符型液晶,它是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义CGRAM,显示效果也不好)。1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。目前市面上字符液晶大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。LCD1602引脚说明第1脚:VSS为电源地第2脚:VCC接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。显示屏引脚图如图2所示:图2LCD显示屏引脚图2、软件程序设计硬件设计完毕后,根据电路图以及程序设计流程进行程序编写,编写时大至可分为四个模块,第一个模块为密码输入及LCD返现,第二个模块为密码判断识别,第三个模块为密码修改,第四个模块为密码锁复位设置。设计第一个模块时,通过Key_Input(),Key_Num_Recognize()两个函数密码输入及返现,通过Clear_Func()函数进行密码清除设置;设计第二个模块时,首先通过编写一个函数PassWord_Safe()对密码进行检验,如果密码太简单则提示更改,然后编写Cipher_Judge()将输入的密码与开始设置的密码进行对比,从而完成对密码的判断,最后编写Lock_Func()函数对三次密码输入错误采取措施;设计第三个模块时,通过编写Cipher_Reset()函数进行密码更改;设计第四个模块,通过编写Restoration()函数完成。最后建立主函数将以上函数串联起来完成设计。三、正文1、方案的论证根据设计的基本要求,经过多方面的查证与对比,以充分发挥资源和提高系统性价比为原则,本系统采用AT89C51单片机为控制电路,使用LCD液晶显示屏及蜂鸣器电路来实现功能。具体设计方案的论证如下:方案一:采用数字电路控制用以74LS112双JK触发器构成的数字逻辑电路作为密码锁的核心控制,将密码保存在JK触发器中,与输入密码通过比较器比较,判断结果是否相符合。采用数字电路设计的方案好处就是设计简单,但控制的准确性和灵活性差,故不采用。方案二:采用以单片机为核心的控制方案选用单片机作为系统的核心部件,实现控制与处理的功能。单片机具有资源丰富、速度快、编程容易等优点。利用单片机内部的随机存储器(RAM)和只读存储器(ROM)及其引脚资源,外接液晶显示(LCD),键盘输入等实现数据的处理传输和显示功能,具有较好的灵活性,基本上能实现设计指标。因此综合考虑,本系统采用方案二。2、主要参数的计算本设计涉及的主要计算为键盘输入后系统解析为数字的计算。首先扫描按下按键在矩阵的位置然后通过程序计算将其转换为相应数字。键盘扫描应用了反转法,通过两次更改AT89C51的I/O口电平,然后与按下按键后的电平相异或得到按键在矩阵的地址。通过switch语句将其变为相应数字。计算程序如下:tem=P1^0x0f; switch(tem) { case1:Key_Num=0;break; case2:Key_Num=3;break; case4:Key_Num=6;break; case8:Key_Num=9;break; } P1=0xf0; Delay(2); tem=(P1>>4)^0x0f; switch(tem) { case1:Key_Num+=1;break; case2:Key_Num+=2;break; case4:Key_Num+=3;break; } 3、功能的实现(1)硬件部分①矩阵键盘由于本设计所用到的按键数量较多而不适合用独立按键式键盘。采用的是矩阵式按键键盘,它由行线和列线组成,也称行列式键盘,按键位于行列的交叉点上,密码锁的密码由键盘输入完成,与独立式按键键盘相比,要节省很多I/O口。本设计中使用的这个键盘不但能完成密码的输入还能作特别功能键使用。键盘的每个按键功能在程序设计中设置。其大体功能(看键盘按键上的标记)及与单片机引脚接法如图3所示:图3矩阵键盘②LCD显示电路本设计的显示部分由液晶显示器LCD1602取代普通的数码管来完成。当需要对密码锁进行开锁时,按下键盘上的开锁按键后利用键盘上的数字键0-9输入密码,每按下一个数字键后在显示器上显示一个*,输入多少位就显示多少个*。当密码输入完成时,按下确认键,如果输入的密码正确的话,LCD子显示“Right”,亮绿色LED,如果密码不正确,LCD显示屏会显示“ERROR”,亮红色LED.显示电路如图4所示:图4显示电路③键盘的消抖键盘实质上是一组按键开关的集合。通常,键盘开关利用了机械触点的合、断作用。键的闭合与否,反映在行线输出电压上就是呈高电平或低电平,如果高电平表示键断开,低电平则表示键闭合,反之也可。通过对行线电平高低状态的检测,便可确认按键按下与否。为了确保CPU对一次按键动作只确认一次按键有效,还必须消除抖动键盘的消抖常用的方法有两种,一是用软件延时来消除按键抖动,基本思想是:在检测到有按键按下时,该键所对应的行线为低电平,执行一段延时10ms的子程序后,确认该行线是否仍为低电平,如果仍为低电平,则确认该行确实有按键按下。当松开按键时,行线的低电平变为高电平,执行一次延时10ms的子程序后,检测该行线为高电平,说明按键确实已经松开。二是采用专用键盘/显示器接口芯片,这类芯片都有自动去抖动的硬件电路。④仿真电路图5仿真电路(2)软件部分程序编写应用的软件为KeiluVision4。KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。本设计在程序编写时主要依靠以下几个模块:①LCD显示模块设计时为了方便编写,将该模块编写为头文件函数LCD1602.H,在编写其余主要程序时只需用include语句便可使用。该模块的重点是指定地址显示,通过LcdOutput函数完成,x设定为地址,y设定为行数。voidLcdOutput(unsignedcharx,unsignedchary,unsignedchar*str){ if(y) x|=0x40; x|=0x80; LcdWrite(LCD_COMMAND,x);while(*str!='\0') { LcdWrite(LCD_DATA,*str); str++; }}②密码判断模块本模块为设计的重点,通过Cipher_Judge函数完成。定义count为密码输入错误次数,通过strcmp语句进行密码对比,然后判读密码是否正确,密码错误次数超过3次会触发密码3次不正确处理函数。voidCipher_Judge(void){ uchara=500,k,x=3; uintms=25; count++; k=strcmp(PassWord,PassWord_First); if(k!=0) { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Error); LED_RED=~LED_RED; Speaker_Func(5); while(ms--) { Delay(900); } if(count==1) { LED_RED=~LED_RED; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Input_Again); } elseif(count==2) { LED_RED=~LED_RED; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Input_Last); } elseif(count==3) { count=0; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); Lock_Func(); } } elseif(k==0) { if(Reset_Lock==0) { Lock=0; LED_GREEN=0; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Right); while(a--) { Delay(40000); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); LED_GREEN=1; count=0; } else { PassWord_First[5]='\0'; First_Set=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,New_PassWord); Reset_Lock=0; Reset=0; LED_YELLOW=~LED_YELLOW; } }}③密码重置模块重置时首先判断密码锁是否因三次密码错误被锁定,如果没有则判断改密码锁是否设置初始密码,如果没有则提示设置初始密码;如果已设置,则在更改密码时需输入正确密码,然后才可以更改新的密码。voidCipher_Reset(void){if(Lock==0) { LED_YELLOW=~LED_YELLOW; if(PassWord_First[5]=='\0') { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,New_PassWord); Reset=0; LED_YELLOW=~LED_YELLOW; } else { Reset_Lock=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); } }}④密码锁复位模块密码锁复位定义发生在密码错误三次的情况下,首先需要输入系统密码,然后函数判断密码是否正确,如果正确则密码锁复位,即重新设置初始密码;系统密码输入次数不限。voidRestoration(void){ uchara,c,b=0; uintms=25; if(Lock==1) { for(a=0;a<11;a++) { c=(God_Num[a]^God_Num_Input[a])<<4; b=b|c; } if(b==0) { Lock=0; KeyPad_Lock=0; Res_Lock=0; TR0=0; Time=1; LED_RED=~LED_RED; PassWord_First[5]='\0'; First_Set=1; Cipher_Reset(); } else { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Error); while(ms--) { Delay(900); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,"InputAGAIN"); } }}⑤密码安全提示模块该模块主要是为了防止输入的初始密码太过于简单,比如六位密码相同,或者类似000001,00200等。通过六位密码的异或相加,根据最后的结果判断密码是否过于简单。voidPassWord_Safe(void){ uinta,b=0,ms=25; for(a=1;a<6;a++) { b+=PassWord_First[a]^PassWord_First[a-1]; } if(b<4) { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Youqingtishi1); LcdOutput(0,1,Youqingtishi2); Delay(200); PassWord_First[5]='\0'; First_Set=1; LED_YELLOW=0; Speaker_Func(3); } else { LED_YELLOW=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,"Success!"); while(ms--) { Delay(1000); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); }}四、结论本设计运行结果:1、第一次启动需先设置初始密码,键盘输入设置了防止因长时间按下数字连续输入的功能。输入密码后系统会进行判断,如果密码过于简单,系统会提示,并有黄灯亮起以及蜂鸣器警报提示;若密码设置成功会在LCD显示“Success”。2、密码输入三次机会,输入正确,绿灯亮起表示解锁成功;输入错误,红灯亮起并有蜂鸣器警报提示;一旦三次全部错误,系统会自动锁定,锁定时间为1小时,期间只能进行系统复位功能。3、密码锁被锁定后可以输入系统密码,系统会判定是否正确,正确则系统复位,密码重置;不正确可继续输入,系统密码无输入次数限制。4、密码锁可进行密码重置,如果没有设置初始密码则直接进入更改密码界面;如果已设置了密码,则须输入正确密码后才能进入更改密码的界面进行密码更改。5、输入密码可以被按位清除,即每按清除键一次可清除一位。五、参考书目[1]叶启明.单片机制作的新型安全密码锁[J].家庭电子.2000,第六期:24-27[2]胡汉才.单片机原理及其接口技术(第2版)[M].北京:清华大学出版社,2004[3]江志红.51单片机技术与应用系统开发[M].清华大学出版社,2008[4]何力民.I2C总线应用系统设计[M].北京航空航天大学出版社.2004[5]黄子强.液晶显示原理[J].国防工业出版社.2008[6]任艳艳.基于AT89C51单片机多功能密码锁的研究[J].重庆职业技术学院学报.2008.5[7]周鑫,何建新,刘琥.基于单片机的电子密码锁控制电路设计[J]成都信息工程学院学报.2009,(08)六、附录头文件LCD1602.h:#ifndef_LCD_1602_H_#define_LCD_1602_H_#include<intrins.h>#defineBusyBit0x80#defineLcd_DataP0#defineLCD_COMMAND0#defineLCD_DATA1#defineLCD_CLEAR_SCREEN0X01#defineLCD_SHOW0x04#defineLCD_NO_CURSOR0x00#defineLCD_AC_UP0x02#defineLCD_NO_MOVE0x00sbitLcd_RS=P2^0;sbitLcd_RW=P2^1;sbitLcd_E=P2^2;unsignedcharLcdRead(){ Lcd_RS=0; Lcd_RW=1; _nop_(); Lcd_E=1; _nop_(); //while(Lcd_Data&BusyBit); Lcd_E=0; returnLcd_Data;}voidLcdWrite(bitmode,unsignedcharcmd){ Lcd_E=0; Lcd_RS=mode; Lcd_RW=0; _nop_(); Lcd_Data=cmd; _nop_(); Lcd_E=1; _nop_(); Lcd_E=0; _nop_(); LcdRead();}voidLcdInit(){ Lcd_E=0; LcdWrite(LCD_COMMAND,0x38); LcdWrite(LCD_COMMAND,0x38); LcdWrite(LCD_COMMAND,0x08|LCD_SHOW|LCD_NO_CURSOR); LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdWrite(LCD_COMMAND,0x04|LCD_AC_UP|LCD_NO_MOVE);}voidLcdOutput(unsignedcharx,unsignedchary,unsignedchar*str){ if(y) x|=0x40; x|=0x80; LcdWrite(LCD_COMMAND,x); while(*str!='\0') { LcdWrite(LCD_DATA,*str); str++; }}#endif密码锁程序:#include<reg51.h>#include<lcd1602.h>#include<string.h>#defineucharunsignedchar#defineuintunsignedintsbitLED_RED=P3^0;sbitLED_GREEN=P3^1;sbitLED_YELLOW=P3^2;sbitSPK=P3^5;uintKey_Num,count=0,Code_count=0,Lock=0,KeyPad_Lock=0,Res_Key=0,Res_Lock=0,Reset_Lock=0,First_Set=1,Reset;ucharTime=1,add=0;ucharcodeXianshi1[]={"SetPassword"};ucharcodeXianshi2[]={"InputPassword"};ucharcodeXianshi3[]={"INPUTSYSTEM"};ucharcodeXianshi4[]={"PASSWORD"};ucharcodeError[]={"ERROR!"};ucharcodeInput_Again[]={"THESECONDTIME"};ucharcodeInput_Last[]={"THELASTTIME"};ucharcodeRight[]={"RIGHT!"};ucharcodeNew_PassWord[]={"NewPassword"};ucharcodeYouqingtishi1[]={"ItisnotSAFE"};ucharcodeYouqingtishi2[]={"PLEASECHANGE"};ucharPassWord_First[7]={'\0'};ucharPassWord[7]={'\0'};ucharGod_Num[12]={'2','0','1','0','0','3','0','2','0','0','8'};ucharGod_Num_Input[12]={'\0'};voidClear_Func(void);voidRestoration(void);voidCipher_Reset(void);voidKey_Num_Recognize(void);voidDelay(ucharx){ uchary; for(;x>0;x--) { for(y=500;y>0;y--) {;} }}voidDelayMs(uintc){ while(--c);}voidSpeaker_Func(uintm){ uinti; while(m--) { for(i=0;i<260;i++) { DelayMs(80); SPK=!SPK; } SPK=1; DelayMs(30000); }}voidKey_Input(void)//密码输入//{ uinttem; if(P1!=0x0f) { Delay(10); if(P1!=0x0f) { tem=P1^0x0f; switch(tem) { case1:Key_Num=0;break; case2:Key_Num=3;break; case4:Key_Num=6;break; case8:Key_Num=9;break; } P1=0xf0; Delay(2); tem=(P1>>4)^0x0f; switch(tem) { case1:Key_Num+=1;break; case2:Key_Num+=2;break; case4:Key_Num+=3;break; } } if(Key_Num==10) { Reset=100; while(Reset--) { Delay(60000); } if(P1!=0xf0) { Cipher_Reset(); } } while(P1!=0xf0); if((Key_Num>0)&&(Key_Num<10)) { Key_Num_Recognize(); } if(Key_Num==11) { Key_Num=0; Key_Num_Recognize(); } if(Key_Num==12) { Delay(10); if(P1!=0X0B) { Clear_Func(); } } }}voidClear_Func(void)//清除一位//{ if(Code_count!=0) { add--; Code_count--; LcdOutput(add,1,""); } else { add=0; Code_count=0; }}voidRestoration(void)//复位//{ uchara,c,b=0; uintms=25; if(Lock==1) { for(a=0;a<11;a++) { c=(God_Num[a]^God_Num_Input[a])<<4; b=b|c; } if(b==0) { Lock=0; KeyPad_Lock=0; Res_Lock=0; TR0=0; Time=1; LED_RED=~LED_RED; PassWord_First[5]='\0'; First_Set=1; Cipher_Reset(); } else { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Error); while(ms--) { Delay(900); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,"InputAGAIN"); } }}voidCipher_Reset(void)//密码重置//{ if(Lock==0) { LED_YELLOW=~LED_YELLOW; if(PassWord_First[5]=='\0') { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,New_PassWord); Reset=0; LED_YELLOW=~LED_YELLOW; } else { Reset_Lock=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); } }}voidLock_Func(void)//密码三次不正确处理函数//{ TR0=1; Lock=1; KeyPad_Lock=1; Res_Lock=1; LED_RED=0; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,"YouFail!"); LcdOutput(0,1,"Waitonehour"); Delay(200); Speaker_Func(4); if(Time%72000==0) { Lock=0; KeyPad_Lock=0; Res_Lock=0; LED_RED=1; TR0=0; Time=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); }}voidCipher_Judge(void)//密码判断//{ uchara=500,k,x=3; uintms=25; count++; k=strcmp(PassWord,PassWord_First); if(k!=0) { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); Delay(200); LcdOutput(0,0,Error); LED_RED=~LED_RED; Speaker_Func(5); while(ms--) { Delay(900); } if(count==1) { LED_RED=~LED_RED; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Input_Again); } elseif(count==2) { LED_RED=~LED_RED; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Input_Last); } elseif(count==3) { count=0; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); Lock_Func();//密码三次不正确处理函数// } } elseif(k==0) { if(Reset_Lock==0) { Lock=0; LED_GREEN=0; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Right); while(a--) { Delay(40000); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); LED_GREEN=1; count=0; } else { PassWord_First[5]='\0'; First_Set=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,New_PassWord); Reset_Lock=0; Reset=0; count=0; LED_YELLOW=~LED_YELLOW; } }}voidPassWord_Safe(void)//不安全密码提示//{ uinta,b=0,ms=25; for(a=1;a<6;a++) { b+=PassWord_First[a]^PassWord_First[a-1]; } if(b<4) { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Youqingtishi1); LcdOutput(0,1,Youqingtishi2); Delay(200); PassWord_First[5]='\0'; First_Set=1; LED_YELLOW=0; Speaker_Func(3); } else { LED_YELLOW=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,"Success!"); while(ms--) { Delay(1000); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi2); }}voidKey_Num_Recognize(void)//密码输入方式识别//{ if(PassWord_First[5]=='\0'&&First_Set==1) { PassWord_First[Code_count]=Key_Num; if(add==0) { LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi1); } LcdOutput(add,1,"*"); add++; Code_count++; Delay(500); if(Code_count==6) { First_Set=0; add=0; Code_count=0; PassWord_Safe(); } } else { if(KeyPad_Lock==0) { PassWord[Code_count]=Key_Num; LcdOutput(add,1,"*"); add++; Code_count++; Delay(500); if(Code_count==6) { add=0; Code_count=0; Cipher_Judge(); } } if(KeyPad_Lock==1&&Res_Key==1) { God_Num_Input[Code_count]=Key_Num; LcdOutput(add,1,"*"); add++; Code_count++; Delay(500); if(Code_count==11) { add=0; Code_count=0; Restoration(); } } } }voidTimer0_Contral(void)interrupt1{ TH0=0x3C; TL0=0xAF; Time++;}voidmain(){ uintms; P3=0xff; TMOD=0x01; TH0=0x3C; TL0=0xAF; EA=1;ET0=1; LcdInit(); LcdOutput(0,0,Xianshi1); while(1) { P1=0X0f; Key_Input(); if((Lock==1)&&(Key_Num==12)&&(Res_Lock==1)) { Delay(600); Res_Key=1; LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); LcdOutput(0,0,Xianshi3); LcdOutput(0,1,Xianshi4); ms=25; while(ms--) { Delay(1000); } LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN); Res_Lock=0; } }基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统

温馨提示

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

评论

0/150

提交评论