news 2026/8/14 3:24:25

基于单片机与矩阵按键的门禁系统Proteus仿真程序:密码验证与电磁锁控制

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于单片机与矩阵按键的门禁系统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秒的启动延时,实测效果不错。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 15:53:08

COMSOL生成三维多孔介质

COMSOL生成三维多孔介质。 在仿真模拟领域&#xff0c;多孔介质建模总能让人又爱又恨。今天咱们用COMSOL搞点实在的——手搓三维多孔结构&#xff0c;整个过程就像搭乐高积木&#xff0c;只不过这次积木块会随机消失。下面这段代码先建个20mm的立方体当基质&#xff1a; mode…

作者头像 李华
网站建设 2026/7/14 15:53:24

COMSOL相场方法模拟裂缝多孔介质中的渗吸:“两相流动模拟算例及水平集与相场方法对比

COMSOL相场方法模拟裂缝多孔介质中的渗吸 提供COMSOL中基于相场方法模拟裂缝多孔介质中的渗吸算例&#xff0c;可用于学习简单几何模型和复杂几何模型中的两相流动模拟&#xff0c;比较采用相场方法守恒和不守恒条件下计算结果的差异&#xff0c;对比水平集方法和相场方法相场方…

作者头像 李华
网站建设 2026/7/14 15:53:22

阿里云云计算ACA - ACP认证考试模拟试卷一

目录 一、基本要求解读 &#xff08;一&#xff09;主流 ACP 方向&#xff08;云计算 / 云安全 / 大数据等&#xff09;题型 &#xff08;二&#xff09;大模型 ACP&#xff08;特殊&#xff09; &#xff08;三&#xff09;答题规则 二、阿里云云计算ACA - ACP认证考试模…

作者头像 李华
网站建设 2026/7/14 15:53:23

网络安全向日葵漏洞

1. 漏洞利用&#xff1a;向日葵远程控制软件 涉及版本 向日葵个人版 for Windows < 11.0.0.33 向日葵简约版 < V1.0.1.43315 (2021.12) 攻击视角 - 端口扫描 特征&#xff1a;软件运行时自动随机开启 > 40000 的端口。 范围&#xff1a;40000 - 65535。 命令&#xff…

作者头像 李华
网站建设 2026/7/14 15:53:21

Vue案例——面经

案例解析1.配置一级路由2.配置嵌套子路由在一级路由中有children。先在一级路由中配置规则&#xff0c;再配置二级路由出口Layout3.实现高亮4.拿到接口值&#xff0c;进行渲染5.注册点击事件&#xff0c;获取id6.重定向&#xff0c;返回上一页7.获取参数后动态渲染等待id获取后…

作者头像 李华