2.1 设计分析
一个电子密码锁,应该能实现以下功能:
(1)能够从键盘中输入密码,并相应地在显示器上显示‘*’;
(2)能够判断密码是否正确,正确则开锁,错误则输出相应信息;
(3)能够实现密码的修改;
(4)断电或者单片机复位后能够保存之前的操作,比如密码的修改;
(5)在操作错误达到一定次数后能够报警。
根据以上分析,本次电子密码锁设计的主要重点是以下几个部分:4x4矩阵键盘设计、LCD信息显示、密码的掉电存储和密码的比较和处理。当然,除了这几个部分外还有LED指示和报警等功能模块。
本设计应该按以下步骤去实现:
第一步:选择材料和器件。
第二步:根据单片机原理和模拟电子技术基础等理论知识在PROTEUS
中画出仿真图。
第三步:检查仿真图,确保其能够实现所有功能。
第四步:根据需要实现的功能逻辑画出程序流程图。
第五步:根据程序流程图和PROTEUS仿真图,使用KEIL软件进行程序的编写和调试。
第六步:将KEIL和PROTEUS联合仿真、调试,查看是否实现所有功能。
基于实际情况,在设计中,用发光二极管代替电磁锁,二极管亮则代表锁开,二极管不亮则代表锁关。
while(1)
{
KeyDown(); 按键扫描
///===========正常输入密码操作======================
if (KeyValue<=9 && !set_flg && !LOCK_flg) //有按键按下
{
input_Value[i]=KeyValue;
if (Right_flg0)
{ clear_window();
Right_flg0=0;
}
LcdWriteCom(0x80+i); //显示当前按键的值
LcdWriteData('*');
i++;
if(i>=4) //判断
{
Right_flg0=0;
for (j=0;j<4;j++)
{
if (input_Value[j]!=saved_Value[j])
Right_flg0=1;
}
clear_window();
if(!Right_flg0) 密码输入正确
{
BUZZER=0; //声音报警
delay_ddll = 1;
LcdWriteCom(0x80+i+2);
LcdWriteData('O');
LcdWriteData('K');
At24c02Write(6,0); 清除错误输入次数
}
else
{
BUZZER=1;
LcdWriteCom(0x80+i+2);
LcdWriteData('E');
LcdWriteData('R');
temp00=At24c02Read(6); 存储输入错误次数
if (temp00>=2) //连续输入错误超过3次
{
LOCK_flg=1;
RELAY=0; /指示灯起来
LcdWriteCom(0x80+i+2);
LcdWriteData('L');
LcdWriteData('K');
}
At24c02Write(6,temp00+1);
}
i=0;
}
}
///===========正常输入密码操作 end======================
///===========修改密码操作======================
if (KeyValue<=9 && set_flg && !LOCK_flg) //有按键按下 KeyValue!=66
{
input_Value[k]=KeyValue;
LcdWriteCom(0x80+k); //显示当前按键的值
LcdWriteData('*');
k++;
if(k>=4) //判断
{
if (set_flg==2)
{
for (j=0;j<4;j++)
{
saved_Value[j]=input_Value[j];
At24c02Write(j+1,saved_Value[j]);
}
clear_window();
set_flg=0;
LED = 0; //设置状态指示灯亮起来
delay_ddll =1;
// LcdWriteCom(0x80+k+2);
// LcdWriteData('O');
// LcdWriteData('K');
}
if (set_flg==1)
{///============================================
Right_flg=0;
for (j=0;j<4;j++)
{
if(input_Value[j]!=saved_Value[j])
Right_flg=1;
}
clear_window();
if(!Right_flg) ///旧密码输入正确
{
set_flg=2; ///可以进行下一步操作
LcdWriteCom(0x80+0x40); //
LcdWriteData('N');
LcdWriteData('E');
LcdWriteData('W');
}
else
{
LcdWriteCom(0x80+k+2);
LcdWriteData('E');
LcdWriteData('R');
temp00=At24c02Read(6); 存储输入错误次数
if (temp00>=2)
{
LOCK_flg=1;
RELAY=0; /指示灯起来
LcdWriteCom(0x80+i+2);
LcdWriteData('L');
LcdWriteData('K');
}
At24c02Write(6,temp00+1);
}
} ///============================================
k=0;
}
}
///===========修改密码操作 end======================
if (KeyValue==0x0A && !LOCK_flg) //有按键按下
{
clear_window();
set_flg=1;
LcdWriteCom(0x80+0x40); //
LcdWriteData('O');
LcdWriteData('L');
LcdWriteData('D');
k=0; //=================
}
=============############================================
else if (KeyValue==0x0B && !LOCK_flg) //有按键按下,关上锁,清除窗口!LCK
{
BUZZER=1;
clear_window();
}
if (delay_ddll)
{
delay_ddll++;
if (delay_ddll>2000)
{
LED = 1;
BUZZER = 1;
delay_ddll = 0;
}
}
=============================================
Lcd1602_Delay1ms(1);
}