本设计主要任务
(1)共8位密码,每位的取值范围为1~8。
(2)用户可以自行设定和修改密码。
(3)按每个密码键时都有声、光提示。
(4)若键入的8位开锁密码不完全正确,则报警5秒钟,以提醒他人注意。
(5)开锁密码错3次要报警10分钟,报警期间输入密码无效,以防窃贼多次试探密码。
(6)键入的8位开锁密码完全正确才能开锁,开锁时要有1秒的提示音。
(7)密码键盘上只允许有8个密码按键和1个发光管。锁内有备用电池,只有内部上电复位时才能设置或修改密码,因此,仅在门外按键是不能修改或设置密码的。
(8)密码设定完毕后要有2秒的提示音。
以上是初步设定的电子密码锁的主要功能。
本系统主要由单片机系统、键盘、报警系统组成。系统能完成开锁、超时报警、超次锁定、管理员解密、修改用户密码基本的密码锁的功能。除上述基本的密码锁功能外,还具有调电存储、声光提示等功能,依据实际的情况还可以添加遥控功能。本系统成本低廉,功能实用。本设计要完成的软件任务主要有:一是键盘输入的识别;二是8位LED的显示;三是密码的比较、修改、存储;;四是报警和开锁控制电平的输出。
根据以上任务,结合硬件结构,可以将键盘输入的识别用来作为系统的监控程序(主程序),用显示程序来延时,不断查询键盘。如果有键按下,就得到相应的键值。结合当前系统所处的状态,调用不同的操作模块,实现相应的功能。而执行模块主要有数字输入模块、确定键模块、修改键模块、显示模块及报警模块。
存储单元的分配
该密码锁中RAM存储单元的分配方案如下:
31H~38H:依次存放8位设定的密码,首位密码存放在31H单元;
R0:指向密码地址;
R2:已经键入密码的位数;
R3:存放允许的错码次数3与实际错码次数的差值;
R4至R7:延时用;
00H:错码标志位。
对于ROM存储单元的分配,由于程序比较短,而且占用的存储空间比较少,因此,在无特殊要求时,可以从0030H单元(其它地址也可以)开始存放主程序。
若按键AN1~AN7分别代表数码1~7,按键AN0代表数码8。在没有键按下时,P1.0~P1.7全是高电平1,若某个键被按下,相应的口线就变为低电平0。假如设定的密码是61234578,当按键AN6被按下时,P1.6变为低电平,P1端口其余口线为高电平,此时从P1端口读入的数值为10111111,存到31H单元的密码值就是10111111,也就是BFH。依此类推,存到32H至38H单元的密码值分别是FDH、FBH、F7H、EFH、DFH、7FH、FEH。开锁时必须先按AN6,使从P1口读入的第一个密码值与31H单元存储的设定值相同,再顺序按AN1、AN2、AN3、AN4、AN5、AN7、AN0才能开锁。否则不能开锁,同时开始报警。
实物图:
proteus仿真原理图:
单片机源程序如下:
代码:
- //南阳理工学院
- //学习是遗忘的最好的方式
- //只花了很少时间写的,有很多不足的算法与编程序方式,见谅!
- #include"at89x51.h"
- #include"key.h"
- #include"lcd.h"
- uchar code show_0[]="Please input the password:";
- uchar code show_1[]="The cipher is:" ;
- uchar code show_2[]="********";
- uchar code show_3[]="The password is wrong!";
- uchar code show_4[]="This is the last time,";
- uchar code show_5[]="Please try it tomorrow!";
- uchar code show_6[]="you are right!";
- uchar code show_7[]="Please input the new cipher:";
- uchar code show_8[]="Input it again!";
- uchar code show_9[]="Establishes successful! ";
- uchar code show_10[]="(^_^)";
- uchar init_pswd[]={8,8,8,8,8,8,8,8};
- uchar pswd[8]={0};
- uchar pswd_1[8]={0};
- void play(uchar *j,uchar k) //K是显示的个数,j是地址
- {
- uchar i;
- for(i=0;i<k;i++)
- {
- dat_w(*(j+i));
- delay(20);
- }
- }
- main()
- {
- uchar j=0,i=0,sum_1=0;
- loop:init();
- clear();
- gotoxy(1,0);
- play(show_0,16);
- gotoxy(2,0);
- play(show_0+17,10);
- /****密码输入****/
- do
- {
- key();
- }
- while(ki!=15);
- clear();
- gotoxy(1,0);
- play(show_1,15);
- do
- {
- flag=0;
- key();
- gotoxy(2,0);
- if(flag==1&&ki<=9)
- {
- pswd[i]=ki;
- play(show_2,i);
- i++;
- }
- if(ki==14) //14则退出.
- break;
- }
- while(i<=8);
- for(i=0;i<=7;i++)
- {
- sum_1=init_pswd[i]-pswd[i]+sum_1;
- if(sum_1!=0)
- {
- clear();
- j++;
- if(j==3)
- {
- clear();
- gotoxy(1,0);
- play(show_4,16);
- gotoxy(2,0);
- play(show_4+16,14);
- delay(500);
- delay(500);
- clear();
- gotoxy(1,0);
- play(show_5+7,16);
- gotoxy(2,5);
- play(show_10,5);
- while(1); //三次输入密码失败,自锁
- }
- gotoxy(1,0);
- play(show_3,16);
- gotoxy(2,5);
- play(show_3+15,7);
- delay(500);
- clear();
- gotoxy(1,0);
- play(show_8,15);
- goto loop;
- }
- if(sum_1==0)
- {
-
- clear();
- gotoxy(1,0);
- play(show_6,15);
- do
- {
- key();
- }
- while(ki!=13);
- loop1:clear();
- gotoxy(1,0);
- play(show_7,13);
- gotoxy(2,0);
- play(show_7+13,15);
- /****第一次输密码***/
- i=0;
- do
- {
- flag=0;
- key();
- if(flag==1&&ki<=9)
- {
- pswd[i]=ki;
- i++;
- clear();
- gotoxy(1,0);
- play(show_2,i);
- }
- }while(i<=7);
- clear();
- gotoxy(1,0);
- play(show_8,15);
- /***第二次输密码****/
- i=0;
- sum_1=0;
- do
- {
- flag=0;
- key();
- if(flag==1&&ki<=9)
- {
- pswd_1[i]=ki;
- i++;
- clear();
- gotoxy(1,0);
- play(show_2,i);
- }
- }
- while(i<=7);
- for(i=0;i<=7;i++)
- {
- sum_1=sum_1+ pswd_1[i]-pswd[i];
- }
- if(sum_1==0)
- {
- clear();
- gotoxy(1,2);
- play(show_9,12);
- gotoxy(2,2);
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载: