2.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);
}