
多功能电子密码锁.doc
8页多功能电子密码锁一、作品简介:电子密码锁具有安全性能高、成本低、功耗低、作简单等优点使其作为防盗卫士的角色越来越重要 从经济适用的角度出发,本作品采用89S52单片机作为控制核心,采用液晶屏实现了良好的人机交互,并且设置了掉电保护系统,保证了在意外断电的情况下密码仍然保留功能概述:(1)、按“A”输入密码,初始密码为000000,输完后按确定键开锁,若输入的密码长度小于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)) { lcm_write_data('*'); keysound(); password[counter]=key; } if(key==backspace) { if(counter>0) { lcm_setxy(--counter,2); lcm_write_data(' '); password[counter]=0x00; lcm_setxy(counter,2); counter--; keysound(); } } if(key==enter) { lcm_setxy(0,1); keysound(); return(0); } } if(counter==6) { do{ key=get_key(); } while((key!=backspace)&&(key!=enter)); if(key==backspace) { lcm_setxy(--counter,2); lcm_write_data(' '); password[counter]=0x00; lcm_setxy(counter,2); counter--; keysound(); } if(key==enter) { keysound(); return(1); } } }。












