基于单片机与矩阵按键的门禁系统Proteus仿真程序:密码验证与电磁锁控制
单片机1602矩阵按键 门禁系统Proteus仿真程序 -------------------------------------------- | 第1列 第2列 第3列 第4列 | |第1行 0 1 2 3 | |第2行 4 5 6 7 | 初始密码:123456 |第3行 8 9 10 11 | |第4行 12 13 14 15 | ------------------------------------------ 1.密码只有6位 123456 2.按键10: 开锁按键: 输入6位密码后按下开锁按键,开始比对存储的密码,正确则打开电磁锁 否则提示错误次数,输错3次锁定键盘10S,并且报警,10S后才能重新输入 3.按键11: 上锁按键: 无论处于任何状态,按下上锁按键后,关闭电磁锁,清除输入的数值 4.按键12: 更改密码: 合法用户按下修改密码按键显示New Password提示用户输入新密码 否则显示No Rights !提示操作错误 5.按键13: 保存密码: 合法用户输入新密码后按下保存密码,显示 Saving...... 提示保存密码中..... 然后显示 save successful 提示保存成功 显示 ^_^ ^_^ ^_^ 提示更改密码成功 非法用户则显示No Rights ! 提示操作错误 6.按键14: 重新输入: 清除之前输入的密码或门牌号 7.按键15: 呼叫按键: 直接输入门牌号(3位)后按下呼叫按钮,蜂鸣器发出叮咚门铃声提示用户有访客 此时访客直接按下开锁键,开锁3S,3s后关闭这个基于51单片机的门禁系统仿真案例非常适合刚接触硬件编程的小伙伴练手。先看硬件配置1602液晶显示矩阵按键状态4x4矩阵键盘控制门禁操作电磁锁和蜂鸣器作为输出设备。咱们直接上干货聊聊几个核心功能的实现。矩阵键盘扫描这块有个小技巧用P1口做行列扫描。代码里先把所有行置低电平然后逐列检测uchar KeyScan() { P1 0x0f; if(P1 ! 0x0f) { delay(5); if(P1 ! 0x0f) { row P1 0x0f; P1 row | 0xf0; col P1 0xf0; return row | col; } } return 0xff; }这段代码通过两次电平变化判断真实按键有效防止抖动。返回的键值经过换算就能得到具体按键编号。单片机1602矩阵按键 门禁系统Proteus仿真程序 -------------------------------------------- | 第1列 第2列 第3列 第4列 | |第1行 0 1 2 3 | |第2行 4 5 6 7 | 初始密码:123456 |第3行 8 9 10 11 | |第4行 12 13 14 15 | ------------------------------------------ 1.密码只有6位 123456 2.按键10: 开锁按键: 输入6位密码后按下开锁按键,开始比对存储的密码,正确则打开电磁锁 否则提示错误次数,输错3次锁定键盘10S,并且报警,10S后才能重新输入 3.按键11: 上锁按键: 无论处于任何状态,按下上锁按键后,关闭电磁锁,清除输入的数值 4.按键12: 更改密码: 合法用户按下修改密码按键显示New Password提示用户输入新密码 否则显示No Rights !提示操作错误 5.按键13: 保存密码: 合法用户输入新密码后按下保存密码,显示 Saving...... 提示保存密码中..... 然后显示 save successful 提示保存成功 显示 ^_^ ^_^ ^_^ 提示更改密码成功 非法用户则显示No Rights ! 提示操作错误 6.按键14: 重新输入: 清除之前输入的密码或门牌号 7.按键15: 呼叫按键: 直接输入门牌号(3位)后按下呼叫按钮,蜂鸣器发出叮咚门铃声提示用户有访客 此时访客直接按下开锁键,开锁3S,3s后关闭密码验证流程需要特别注意状态管理。当用户按下开锁键键10时系统进入密码比对模式if(inputCount 6) { if(memcmp(inputBuf, password, 6) 0) { lock 1; //开锁 LCD_ShowString(0,1,Welcome Home! ); } else { errorCount; if(errorCount 3) { LockSystem(); //锁定10秒 } } }这里用memcmp直接对比数组比逐个比对更高效。错误计数器累加到3次时触发锁定函数这个函数会启动定时器中断进行10秒倒计时。修改密码功能涉及权限验证代码里用了个flag标记合法用户if(key 12) { //修改密码键 if(authFlag) { LCD_Clear(); LCD_ShowString(0,0,New Password:); inputMode 2; //进入新密码输入模式 } else { LCD_ShowString(0,1,No Rights !); } }authFlag在用户通过原始密码验证后置位这种状态机管理方式让流程更清晰。保存密码时记得写入EEPROM这里用了AT24C02的I2C操作void SavePassword() { I2C_Start(); I2C_SendByte(0xA0); for(uchar i0;i6;i){ I2C_SendByte(newPassword[i]); } I2C_Stop(); }呼叫功能实现有个有意思的地方——输入门牌号后直接按开锁键生效。代码里用callFlag标记呼叫状态if(key 15){ //呼叫键 if(inputCount 3){ callFlag 1; Beep(500); //叮咚声 } } if(callFlag key 10){ //呼叫模式下开锁 OpenLock(3000); //开锁3秒 }定时器中断处理锁定和开锁时长是关键注意在中断里不能做复杂操作void Timer0() interrupt 1 { if(lockTime 0) lockTime--; if(openTime 0) openTime--; else lock 0; //自动上锁 }整个系统通过状态变量管理不同模式这种设计比纯顺序执行更灵活。仿真时注意Proteus中LCD的初始化时间要留够不然容易出现显示异常。代码里加了个5秒的启动延时实测效果不错。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2416116.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!