当前位置: 首页 > news >正文

基于单片机与矩阵按键的门禁系统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 i=0;i<6;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.jsqmd.com/news/485300/

相关文章:

  • LLM与Agent术语大解析:从基础到前沿,测测你了解多少?
  • 梳理九江市有机肥生产企业,生物有机肥制造企业如何选择 - 工业品网
  • 纯前端实现科幻级交互!Three.js 结合 MediaPipe 打造 3D 手势粒子引擎 (附源码与在线演示)
  • windows下openclaw的操作指令有哪些?
  • COMSOL生成三维多孔介质
  • 孩子独立后,父母最难的一关:把卡住的人生“重启”
  • 科研虾LabClaw接管实验室!斯坦福和普林斯顿重新定义人机协作边界
  • 【C++】C++入门基础
  • 清单来了:9个AI论文工具测评!本科生毕业论文写作必备清单
  • STL——迭代器
  • BeanFactory与FactoryBean区别详解
  • 第二篇:大模型提示工程(Prompt Engineering)高级调优与前沿策略
  • 分享一款高颜值强大的uniapp组件库-图鸟组件库
  • 为什么四年级才建议开始学习C++?很多家长都问早了
  • 英伟达龙虾模型开源,12B激活登上成功率全球第四
  • vectorbt-案例学习-1 对出场条件的探索
  • 部署RHCSA9.7、并完成优化
  • SAM2:使用mask作为提示输入,实现VOS视频分割
  • Meta甩出4款推理芯片,软硬协同两年算力暴涨25倍
  • 笨鸟先飞之python基础总结
  • AI大模型教程(2026最新)从零基础入门到精通,一篇收藏全掌握!
  • 测试文章发布
  • MATLAB R2018A环境下基于基尼相关性的频域地震盲反褶积方法
  • 小程序毕业设计-基于微信小程序的乡村治理数字化平台的设计与实现
  • 政府科技管理部门如何高效整合区域创新资源?
  • 面试官最爱问的设计题:动态支付系统设计(策略模式 + 工厂模式 + Spring自动注册)
  • Python每日一题:四道易错题深度解析(变量作用域、逻辑运算、lambda、Py2/3区别)
  • OpenClaw玩转有道云笔记
  • 超越 Transformer 的架构前瞻
  • 2026年手机摄像头测试方案厂商技术强的品牌推荐 - mypinpai