资源描述
《单片机实训》仿真设计
说 明 书
专业名称:电子信息工程
班 级:11班
学 号:2010
姓 名:
指导教师:
日期: 2013年05月05日
目 录
一、设计的目的和意义 - 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—Falsh Programmable and Erasable Read Only Memory)的低电压,高性能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.0 RXD(串行输入口)
P3.1 TXD(串行输出口)
P3.2 /INT0(外部中断0)
P3.3 /INT1(外部中断1)
P3.4 T0(计时器0外部输入)
P3.5 T1(计时器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所示:
图1 AT89C51引脚图
(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所示:
图2 LCD显示屏引脚图
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)
{
case 1:Key_Num=0;break;
case 2:Key_Num=3;break;
case 4:Key_Num=6;break;
case 8:Key_Num=9;break;
}
P1=0xf0;
Delay(2);
tem=(P1>>4)^0x0f;
switch(tem)
{
case 1:Key_Num+=1;break;
case 2:Key_Num+=2;break;
case 4: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)软件部分
程序编写应用的软件为Keil uVision4。
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
本设计在程序编写时主要依靠以下几个模块:
①LCD显示模块
设计时为了方便编写,将该模块编写为头文件函数LCD1602.H,在编写其余主要程序时只需用include语句便可使用。该模块的重点是指定地址显示,通过LcdOutput函数完成,x设定为地址,y设定为行数。
void LcdOutput(unsigned char x,unsigned char y,unsigned char *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次不正确处理函数。
void Cipher_Judge(void)
{
uchar a=500,k,x=3;
uint ms=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);
}
else if(count==2)
{
LED_RED=~LED_RED;
LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN);
LcdOutput(0,0,Input_Last);
}
else if(count==3)
{
count=0;
LcdWrite(LCD_COMMAND,LCD_CLEAR_SCREEN);
Lock_Func();
}
}
else if(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;
}
}
}
③密码重置模块
重置时首先判断密码锁是否因三次密码错误被锁定,如果没有则判断改密码锁是否设置初始密码,如果没有则提示设置初始密码;如果已设置,则在更改密码时需输入正确密码,然后才可以更改新的密码。
void Cipher_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);
}
}
}
④密码锁复位模块
密码锁复位定义发生在密码错误三次的情况下,首先需要输入系统密码,然后函数判断密码是否正确,如果正确则密码锁复位,即重新设置初始密码;系统密码输入次数不限。
void Restoration(void)
{
uchar a,c,b=0;
uint ms=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," Input AGAIN");
}
}
}
⑤密码安全提示模块
该模块主要是为了防止输入的初始密码太过于简单,比如六位密码相同,或者类似000001,00200等。通过六位密码的异或相加,根据最后的结果判断密码是否过于简单。
void PassWord_Safe(void)
{
uint a,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)
六、附录
1
头文件LCD1602.h:
#ifndef _LCD_1602_H_
#define _LCD_1602_H_
#include<intrins.h>
#define BusyBit 0x80
#define Lcd_Data P0
#define LCD_COMMAND 0
#define LCD_DATA 1
#define LCD_CLEAR_SCREEN 0X01
#define LCD_SHOW 0x04
#define LCD_NO_CURSOR 0x00
#define LCD_AC_UP 0x02
#define LCD_NO_MOVE 0x00
sbit Lcd_RS=P2^0;
sbit Lcd_RW=P2^1;
sbit Lcd_E=P2^2;
unsigned char LcdRead()
{
Lcd_RS=0;
Lcd_RW=1;
_nop_();
Lcd_E=1;
_nop_();
//while(Lcd_Data&BusyBit);
Lcd_E=0;
return Lcd_Data;
}
void LcdWrite(bit mode,unsigned char cmd)
{
Lcd_E=0;
Lcd_RS=mode;
Lcd_RW=0;
_nop_();
Lcd_Data=cmd;
_nop_();
Lcd_E=1;
_nop_();
Lcd_E=0;
_nop_();
LcdRead();
}
void LcdInit()
{
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);
}
void LcdOutput(unsigned char x,unsigned char y,unsigned char *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>
#define uchar unsigned char
#define uint unsigned int
sbit LED_RED=P3^0;
sbit LED_GREEN=P3^1;
sbit LED_YELLOW=P3^2;
sbit SPK=P3^5;
uint Key_Num, count=0,Code_count=0,Lock=0,KeyPad_Lock=0,Res_Key=0,Res_Lock=0,Reset_Lock=0,First_Set=1,Reset;
uchar Time=1,add=0;
uchar code Xianshi1[]={" Set Password"};
uchar code Xianshi2[]={" Input Password"};
uchar code Xianshi3[]={" INPUT SYSTEM "};
uchar code Xianshi4[]={" PASSWORD "};
uchar code Error[]={" ERROR!"};
uchar code Input_Again[]={" THE SECOND TIME"};
uchar code Input_Last[]={" THE LAST TIME"};
uchar code Right[]={" RIGHT!"};
uchar code New_PassWord[]={" New Password"};
uchar code Youqingtishi1[]={" It is not SAFE"};
uchar code Youqingtishi2[]={" PLEASE CHANGE"};
uchar PassWord_First[7]={'\0'};
uchar PassWord[7]={'\0'};
uchar God_Num[12]={'2','0','1','0','0','3','0','2','0','0','8'};
uchar God_Num_Input[12]={'\0'};
void Clear_Func(void);
void Restoration(void);
void Cipher_Reset(void);
void Key_Num_Recognize(void);
void Delay(uchar x)
{
uchar y;
for(;x>0;x--)
{
for(y=500;y>0;y--)
{;}
}
}
void DelayMs(uint c)
{
while(--c);
}
void Speaker_Func(uint m)
{
uint i;
while(m--)
{
for(i=0;i<260;i++)
{
DelayMs(80);
SPK=!SPK;
}
SPK=1;
DelayMs(30000);
}
}
void Key_Input(void) //密码输入//
{
uint tem;
if(P1!=0x0f)
{
Delay(10);
if(P1!=0x0f)
{
tem=P1^0x0f;
switch(tem)
展开阅读全文