多功能电子密码锁
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多功能电子密码锁
一、作品简介:
电子密码锁具有安全性能高、成本低、功耗低、作简单等优点使其作为防盗卫士的角色越来越重要。从经济适用的角度出发,本作品采用89S52单片机作为控制核心,采用液晶屏实现了良好的人机交互,并且设置了掉电保护系统,保证了在意外断电的情况下密码仍然保留。
功能概述:
(1)、按“A”输入密码,初始密码为,输完后按确定键开锁,若输入的密码长度小于6位提示“less then 6!”并返回主菜单。清除键清除上次输入,每次按键有短“滴”声按键提示音。
(2)、密码输入正确后,输出一个电磁锁开锁信号与已开锁信号,电磁锁导通(本作品中用两个发光二极管代替电磁锁,发光二极管亮表示开锁)。2秒后开锁信号与已开锁指示清零。
(3)、密码输入错误时显示“error”,发出一声长“滴”声错误指示提示音,并且报警指示灯短暂闪烁。三次密码错误时,发出长鸣声报警,报警指示灯不停闪烁,按复位键清除报警。
(4)、按“B”修改密码,要求输入原密码,输入错误时显示“error”,发出一声长“滴”声,错误指示提示音报警指示灯亮短暂闪烁,然后返回主菜单。输入正确要求再次输入,两次输入一致提示“password has been changed”并返回主菜单。两次不一致提示“twice input is different!”,然后返回主菜单。
二、作品原理:
密码锁电路包含:键盘输入、密码修改、密码检测、开锁电路、执行电路、报警电路。
(1)、键盘输入模块:每一条水平行线与垂直线的交叉处不相通,通过一个按键来连通,利用这种行列式矩阵结构只需要4条行线和4条列线, 即可组成具有4×4个按键的键盘。行线所接的单片机4 个I/O 口作为输出端,而列线所接的I/O口则作为输入端。当按键没有被按下时所有的输出端都是高电平,代表无键按下。一旦有键按下,则输入线就会被拉低,这样通过读入输入线的状态就可知是否有键按下。
(2)、掉电保护模块:存储电路主要作用是存储密码,提供校验码以在密码判定的时候作为密码安全性的一道屏障。采用储存芯片AT24C04设计,传输方式为I2C总线。这样设计的优点在其简单性和处理的高效性上。A0、A1、WP 接VCC GND ,SCL、SDA 接上拉电阻。
(3)、液晶显示模块:SMC1602 液晶显示模块作为显示电路,具有显示信息丰富、功耗小等优点。1602 LCD 模块以总形方式将LCD 模块接在MCU 的外部总线上,当然MCS51 的总线是8080 的格式,而1602 LCD 的接口为6800 总线,两者有区别,只需要经过74ls00及74ls08门电路改造一下接口即可。当按开锁键后,显示器输出密码提信息。当输入的密码后,密码以“*”的形式出现在显示器上面,即直观又保护了密码的安全性。
三、作品方案设计:
1、作品整体方案:
2、相应模块流程图:1、主程序流程图:
2、键盘扫描程序流程图:
3、开锁程序流程图:
四、作品整体电路图:
五、作品成品照片:
六、部分源代码
部分代码:
1、系统初始化函数程序:
uchar step_choose(void)//系统初始化
{
uint i;
uchar key;
do{
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
lcm_setxy(5,1);
lcm_write_string("welcome! ");
lcm_setxy(0,2);
lcm_write_string(" A:open B:modify ");
for(i=0;i<30000;i++)
{
key=get_key();
if((key==open)||(key==modify)) break;
}
}
while((key!=open)&&(key!=modify));
return(key);
}
2、键盘扫描函数程序:
uchar get_key()//键盘扫描
{
uchar row_code;
uchar col_code;
P1=0xf0;
if(P1!=0xf0)
{
delayms(10);
if(P1!=0xf0)
{
row_code=0xfe;
while(row_code!=0xef)
{
P1=row_code;
if(P1!=row_code)
{
col_code=P1;
while(col_code==P1);
col_code=(col_code&0xf0)|0x0f;
return( (~col_code)|(~row_code));
}
row_code=((row_code<<1)|0x01);
}
}
}
return(0x00);
}
3、液晶屏初始化函数程序:
void lcm_init()//LCM初始化
{
delayms(20);
lcm_write_cmd_add=0x38;
delayms(4);
lcm_write_cmd_add=0x38;
delayms(1);
lcm_write_cmd_add=0x38;
lcm_write_cmd(0x38);
lcm_write_cmd(0x0f);
lcm_write_cmd(0x01);
lcm_write_cmd(0x06);
}
4、密码输入函数程序:
bit input_password(uchar *password)//密码输入
{
uchar counter;
uchar key;
lcm_setxy(0,2);
for(counter=0;counter<7;counter++)
{
longdelay(3);
if(counter<6)
{
do{
key=get_key();
}
while(key==0x00);
if((key!=backspace)&&(key!=enter))