51单片机电子密码锁功能描述(51单片机入门第7篇)
51单片机电子密码锁功能描述(51单片机入门第7篇)四位数码管 --proteus仿真器件硬件选择:我们在日常生活中都会看到用到电子密码锁,那么既然我们在学习单片机,是不是可以自己做一个密码锁。是的,你可以,那我们来尝试一下。首先进行功能分析:这些功能是一个密码锁最基本的功能,那么我们就来实现它。
51单片机系列文章再次更新,迷茫了几天,不知道到底该写些什么。从心出发,分享自己的知识,分享更多的实例。本文就为大家分享一个电子密码锁的实例。
电子密码锁
0、实例演示分享
首先介绍今天分享的实例实际使用效果。
proteus仿真版本
1、构思思路,功能分析。
我们在日常生活中都会看到用到电子密码锁,那么既然我们在学习单片机,是不是可以自己做一个密码锁。是的,你可以,那我们来尝试一下。
首先进行功能分析:
- 显示密码
- 输入密码
- 修改密码
- 输入正确、错误提示
- 开锁后的效果展示
- 具有初始密码,需要正确输入初始密码后才能修改密码
- 修改密码后再次修改密码同样也需要正确输入密码才能再次修改密码
这些功能是一个密码锁最基本的功能,那么我们就来实现它。
硬件选择:
- 显示部分我们采用八位共阴数码管
四位数码管 --proteus仿真器件
- 调整部分我们采用矩阵按键
矩阵按键 --proteus仿真器件
- 主控部分采用AT89C51单片机
AT89C51 --proteus仿真器件
- 效果提示部分采用LED小灯
LED小灯 --proteus仿真器件
2、硬件搭建硬件原理图 --proteus仿真模型
3、程序编写这个程序我们来进行一些分析,需要用到哪些知识。
- 显示部分,根据原理图的电路接法,我们应该采用动态数码管显示。
什么是动态数码管显示呢?
这里简单讲解一下,动态显示就是一次点亮一个数码管,但点亮时间很短,并不断的循环。因为人眼有视觉暂留效果,看起来就像是全部数码管都在点亮,这个有点像帧率的意思。
单片机是如何实现这个动态效果的呢?
多个共阴数码管组合在一起时,我们给数码管的段选的输入我们要显示的数的段码,但只给一个数码管的位选端输入低电平,那么就只有一个数码管在显示。然后在切换位选端的同时,切换段选端数据,就可以实现动态显示了。具体代码如下,硬件接法如上图。
#include <reg51.h> unsigned int code smgwei[] = {0xfe 0xfd 0xfb 0xf7}; // 共阴数码管位选选数据 unsigned int code smgduan[] = {0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f 0x80 0x40 0x73 0x79}; // 共阴数码管段选数据 // 延时函数 void delay(unsigned int t) { unsigned int x; for(x = 0; x < t; x ) { ; } } // 数码管显示函数 void dis(int s_wei int s_duan) { // 位选数据 P1 = smgwei[s_wei]; // 段选数据 P2 = smgduan[s_duan]; // 延时显示时长 delay(100); // 消隐,保证下次显示没有拖影显示 P2 = 0x00; } // 四个数码管动态显示 void dis_pw() { dis(0 0); dis(1 1); dis(2 2); dis(3 3); } // 主函数 void main() { while(1) { dis_pw() } }
- 输入部分,我们采用矩阵按键,在前面的文章中有讲到,这里就不再赘述了。
- 提示部分,我们采用的是LED小灯。
如何控制密码输入?看代码就好了
void judge() { /*判断当前按下的按键,分三种类型: 设置键 12 确认键 11 数字键 0-9 无效键 16 14 当按下设置键后进入设置密码模式 按下4次按键后显示设置成功 P 在设置的过程中按OK键无效,设置完成后按下OK键退出到主界面。 */ x = keyboard(); // 获取键值 dis_pw(); // 显示当前状态 WHITE = 0; // 常态白灯亮起 if(x != -1) // 判断有按键按下 { if(init_flag == 1) { if(x == 12) // 如果按下确认键(编码为12) { P0 = 0xf0; while(P0 != 0xf0); // 检测键盘是否被释放 set_passwd(); // 进入设置密码界面 } } if((x >= 0) && (x <= 9)) // 如果按下数字键(编码0-9) { pass[y] = x; y ; if(y == 4) { y = 0; } P0 = 0xf0; while(P0 != 0xf0); } if(x == 11) { pw_flag = 1; y = 0; for(t = 0; t < 4; t ) { if(pass[t] != passwd[t]) { pw_flag = 0; break; } else init_flag = 1; } pada(); } } }
这是一个按键判断函数,判断当前按下的按键是什么。
当没有按键按下时,只是显示和亮白灯,当有按键按下时又做对应的事情。
void set_passwd() { /*按下设置键后锁定显示状态显示 ---- 当按下数字键后显示数字并把显示位置向后移一位,等待输入 当四个数字设置完成后,显示P,1秒后显示 ----,进入等待输入状态 */ uint i; while(1) { YEELOW = 0; WHITE = 1; dis_pwinit(); i = keyboard(); if(i != -1) { if(i >= 0 && i <= 9) { inpass[m] = i; m ; if(m == 4) { m = 0; } P0 = 0xf0; while(P0 != 0xf0); } if(i == 11) { YEELOW = 1; for(t = 0; t < 4; t ) { passwd[t] = inpass[t]; } dis_correct(); break; } } } init_flag = 0; }
这是这是密码的函数,这这里属于关键代码,如何去设置密码也是比较重要的。
完整代码和仿真文件只需关注我,私信发送"02",即可分享给大家。
4、软硬件联调在上面视频中的展示即为调试效果。
5、写在最后
我们通过这个实例再一次了解了单片机的控制效果,以及单片机控制外围电路的方法,主要是矩阵按键以及数码管。希望大家可以在这个实例中发散出其他有趣的实例,分享出来,也可以在评论区发出自己想让小编做的案例,在我能力范围之内,一定满足。
小编能力有限,语言有不妥的地方,表达不清晰的地方希望大家可以指正。
点赞 关注 转发,是小编创作的动力,希望大家可以继续支持这枚小小科技仔。