`自己利用空闲时间制作的电子密码锁,有PCB、原理图,PCB印制电路板。此设计用外部存储器,支持修改密码,本来想添加指纹识别模块,但是12864的数据口被使用了,gpio口不够用。在实际中我发现12864还是用串口比较好,因为用并口的话使用会影响同GPIO口的其他位口。毕竟是业余时间做的,可能在有些方面不是很完善。
一、功能介绍:
1、输入6位密码,即可开锁。
2、输入7次纯数字,系统会自动恢复初始状态。
3、没有输入完6位密码,按下确认键,系统不会应答。
4、密码输入错误三次,锁定键盘并且蜂鸣器提醒10秒。
5、输入错误可以退格、清零。
6、开机后12864模块会有60秒定时显示,没操作键盘60秒后,清除数据并且恢复初始状态。如果在记时期间有按键按下,这停止倒计时,并且在没有操作键盘8秒左右,重新开启倒计时12864休眠功能。
7、在功能模式下可以修改密码,也可以做其他功能选择(其他功能你们根据自身能力添加)。
8、程序有密码数值存储在数组,可用于显示等操作。(修改密码时可以显示)
9、有人体感应模块,感应到有人吗,并且12864处于关屏休眠模式下,即可打开12864屏幕。
10、有外部存储器24C02,支持修改密码,密码断电不丢失。
11、步进电机模块。
12、继电器模块。
13、温度模块,倒计时期间可以测量7805和1117芯片温度或者外部温度,并实时显示。
二、资料展示
1.原理图

2.PCB印制电路板


因为自己做的板,所以在布线的时候那那么专业,能用就好。

3.实物图

外观大概就这样,工作状态
4、说明
我是用的KT板面上贴了一层贴纸,把这些弄到了一起,自己准备在包装一下,做一个密码箱完全没有问题。可以用来放放自己的小秘密,哈哈哈 。

5、部分代码
按键模块的键值内容判断

#include "key_control.h"
#include "delay.h"
#include "key.h"
#include "12864.h"
#include "Relay.h"
#include "buzzer.h"
#include "time.h"
#include "24c02.h"
#include "uln2003.h"u8 password[]={0x30,0x30,0x30,0x30,0x30,0x30};u8 new_password[]={0x30,0x30,0x30,0x30,0x30,0x30};uchar display[]={0x2A,0x2A,0x2A,0x2A,0x2A,0x2A};  u8 nkv=0,sign=0,fkv,noe=0,Function_menu_flag=0,Move_down_flag=0,
Move_up_flag=1,Revise_the_password_flag=0,New_password_flag=0,
Number_of_new_passwords=0;
u16 mc=1;
extern uchar mima[];
extern u8 Countdown;void Key_Number(void)
{
u8 num=0,i;
num=Key_Scan();if(num==16&&Countdown==0&&GPIO_ReadOutputDataBit (GPIOB,GPIO_Pin_9)==1) //没有按键按下且没有开启定时器 没有黑屏
{
mc++;delay_ms(10);if(mc==1001){mc=1;TIM3_Int_Init(9999,7199);//计时60S}if(mc==50001)mc=1;}if(num!=16&&num<=9)  //数字键按下{LCD_Display_Specify_Words(0,0,"00");TIM3_STOP();      //停止计时Countdown=0;       //计时标志位清零Key_Init();mc=1;sign=0;          //按键标识标志位if(Function_menu_flag==0)                //功能标志位{nkv++;                                 //数字按键次数标志位if(nkv==7)LCD_Display_Specify_Words(2,5,"      ");else{//buzzer_On_off();LCD_Display_Words(2,5,display,nkv);//显示*号for(i=nkv-1;i<nkv;i++)             //´存储密码password[i]=num+0x30;}Key_Init();}else if(Function_menu_flag==1&&(Revise_the_password_flag==1||New_password_flag==1)) {nkv++;//buzzer_On_off();LCD_Display_Words(3,5,display,nkv);for(i=nkv-1;i<nkv;i++)          password[i]=num+0x30;Key_Init();}
}else if(num!=16&&num>9){Countdown=0;LCD_Display_Specify_Words(0,0,"00");Key_Init();TIM3_STOP();mc=1;             sign=1;         fkv=num;         //功能按键记下}
}

按键内容判断处理函数

void Key_Function(void)
{u8 h=0;uint i;if(sign==1)                //如果是功能按键按下{switch(fkv){case 15:            //功能键{                                                   switch(New_password_flag)   //新密码标志位{case 0:                                                    {                                            if(nkv==6)           //已经输入了6位密码{    nkv=0;for(i=0;i<6;i++)         //比较密码{if(mima[i]==password[i])                                                              {h++;if(h==6){switch (Revise_the_password_flag)  //修改密码标志位{case 0:                             {LCD_Display_Specify_Words(2,5,"      ");LCD_Display_Specify_Words(2,5,"Open!");   LCD_Display_Specify_Words(2,5,"      ");Relay_on();delay_ms(2000);              Relay_off();            //继电器开锁noe=0;                  //错误次数清零ULN2003_init();       //步进电机模块Unlocking();}break; case 1:                           {LCD_Display_Specify_Words(3,5,"      ");LCD_Display_Specify_Words(3,5,"yes ok");LCD_Display_Specify_Words(3,0,"ÐÂÃÜÂë:         ");New_password_flag=1;          // 新密码标志位}break;}}} else    //密码输入错误{switch (Revise_the_password_flag)    {case 0:                          {h=1;LCD_Display_Specify_Words(2,5,"      ");LCD_Display_Specify_Words(2,5,"Error!");LCD_Display_Specify_Words(2,5,"      ");buzzer_On_off();noe++;                      if(noe==3){noe=0;TIM2_Int_Init(9999,7199);//十秒倒计时Time2_10_seconds_countdown();}break;case 1:           //在修改密码中{h=1;LCD_Display_Specify_Words(3,5,"      ");LCD_Display_Specify_Words(3,5,"Error!");LCD_Display_Specify_Words(3,5,"      ");buzzer_On_off();}break;}break;}}}}break;case 1:                                   { if(nkv==6) {nkv=0;Number_of_new_passwords++;           switch(Number_of_new_passwords)      {case 1:{LCD_Display_Specify_Words(3,5,"        ");for(i=0;i<6;i++)new_password[i]=password[i];     }break;case 2:                           {for(i=0;i<6;i++){if(password[i]==new_password[i])  {h++;if(h==6)                         {AT24CXX_Write(0,(u8*)new_password,6);delay_ms(20);AT24CXX_Read(0,mima,6);LCD_Display_Words(3,5,new_password,6);LCD_Display_Specify_Words(3,0,"ÐÞ¸ÄÃÜÂë³É¹¦£¡");                                                              LCD_Display_Specify_Words(2,0,"                ");LCD_Display_Specify_Words(3,0,"                ");                                                     LCD_Display_Specify_Words(2,0,"password: ");Function_menu_flag=0;  //Move_down_flag=0;     Revise_the_password_flag=0;      New_password_flag=0;       Number_of_new_passwords=0;                                                    }}else{LCD_Display_Specify_Words(3,5,"        ");LCD_Display_Specify_Words(3,5,"Error!");    LCD_Display_Specify_Words(3,5,"        ");                                                                                 Number_of_new_passwords=0; break;}}}break;}}                                                                    }break;}switch(Move_down_flag)                  {case 1:{LCD_Display_Specify_Words(2,0,"                ");LCD_Display_Specify_Words(3,0,"                ");LCD_Display_Specify_Words(2,0,"¹¦ÄÜ:   ÐÞ¸ÄÃÜÂë");LCD_Display_Specify_Words(3,0,"Ô­ÃÜÂ룺");Move_down_flag=2;                 Revise_the_password_flag=1;        }break;}}break;    case 14:                                     {switch(Revise_the_password_flag)         {case 0:{LCD_Display_Specify_Words(2,5,"      ");nkv=0;}break;case 1:{LCD_Display_Specify_Words(3,5,"      ");nkv=0;}break;    }}break;case 11:                             {switch(Revise_the_password_flag){case 0:{if(nkv==1)LCD_Display_Specify_Words(2,5,"      ");else if(nkv==2||nkv==4||nkv==6){i=nkv/2-1;LCD_Display_Specify_Words(2,5+i,"* ");}else if(nkv==3||nkv==5){i=nkv/2;LCD_Display_Specify_Words(2,5+i,"  ");}nkv--;}break;                                           case 1:{if(nkv==1)LCD_Display_Specify_Words(3,5,"      ");else if(nkv==2||nkv==4||nkv==6){i=nkv/2-1;LCD_Display_Specify_Words(3,5+i,"* ");}else if(nkv==3||nkv==5){i=nkv/2;LCD_Display_Specify_Words(3,5+i,"  ");} nkv--;}break;} }break;case 13:                                      { if(nkv==0){Move_down_flag=0;                    Function_menu_flag++;              switch(Function_menu_flag)      {case 1:{LCD_Display_Specify_Words(2,0,"        ");LCD_Display_Specify_Words(2,0,"²Ëµ¥: ");LCD_Display_Specify_Words(2,3,">>");LCD_Display_Specify_Words(2,4,"¼ÆËãÆ÷");LCD_Display_Specify_Words(3,4,"ÃÜÂëËø");}break;case 2:{LCD_Display_Specify_Words(2,0,"                ");LCD_Display_Specify_Words(3,0,"                ");LCD_Display_Specify_Words(2,0,"password:");Function_menu_flag=0;Move_down_flag=0;Revise_the_password_flag=0;New_password_flag=0;Number_of_new_passwords=0;}break;}}}break;case 10:                                    //ÏÂÒÆ{if(Function_menu_flag==1){switch(Move_down_flag){case 0:{Move_down_flag=1;LCD_Display_Specify_Words(2,3,"  ");LCD_Display_Specify_Words(3,3,">>");}break;}}}break;case 12:                                         //ÉÏÒÆ{ if(Function_menu_flag==1){switch(Move_down_flag){case 1:{Move_down_flag=0;LCD_Display_Specify_Words(2,3,">>");LCD_Display_Specify_Words(3,3,"  ");}break;}}}break;                                 }fkv=0;                 Key_Init();}
}void open_close(void)
{Function_menu_flag=0;  Move_down_flag=0;     Revise_the_password_flag=0;    New_password_flag=0;            Number_of_new_passwords=0;nkv=0;fkv=0;
}

代码太多了,我把主要的按键综合代码写出来了,上面的注释看不到,可以程序里面看。在资料里有单独的DS18B20、24c02、定时器的一些单一代码,直接修改一下就能移植。

三、最后说几句
1、有电子相关专业(专科)的同学们,可以用这个作为毕业设计,可以去掉步进电机,再添加一个指纹模块后,应该能够通过。
2、我原本想用指纹模块来控制步进电机来打开老式的拉锁,现在我还没有试,不知道能不能成功。
3、因为我的按键模块、12864模块、DS18B20之间的gpio口有点干扰,因为矩阵键盘的列需要输入探测是用了一整个GPIO的操作函数,所以用了它后,另外两个它也会受到影响。
4、资料里包含了四个文件夹,PCB设计、程序、串口调试工具、资料(相关芯片,外设的资料)

5、在密码锁的基础上 我又增加了一项功能,利用18B20制作的自动控温功能:第一个是温度到达30度,风扇自动开启,并且持续降温,直到温度降到20度,风扇就停止转动。第二个是可以自己设置温度,到达温度后自动停止降温。本来我还想再添加一个控制暖风机工作的功能,但是由于我的继电器在设计之初,就没有考虑用交流电设备,所以继电器不能用来控制强电。而且我的电源和地线的布线宽度有点低,只有30mil,PTC的加热片的瞬间功率能达到13A之多,所以无奈只能取消此功能。但是也是可以通过修改PCB的线路来搞定,有点复杂我也没有去做。但是也可以外接继电器模块来达到控制家用220V电器,有时间了我在继续更新!
实物图:


现在我附上我的控温的视频:
1.自定义温度控温:https://www.bilibili.com/video/BV1HY411x7tM/(哔哩哔哩)
2.30度自控温:https://v点douyin点com/R9g398R/

完整资料下载:
https://download.csdn.net/download/qq_31309951/39573366

2021年12月6日更新
我之前说的控制强电设备,现在已经可以了,我重新弄了一块小的继电器PCB板,就可用用我的继电器输出口提供12V的电源来控制下一级继电器工作,从而达到控制暖风机这种家用220V的电器。
新的继电器PCB板


实物图

视频链接:https://www.bilibili.com/video/BV1rr4y1k7Ve/(哔哩哔哩)

2022年10月19日更新
这次把操作界面修改了一下,第一增加了初次使用的设置,修改了电子密码锁的判断机制,增加了管理员密码,通过管理员密码才能修改密码或者指纹管理,后续还可以增加其他功能。第二增加了系统掉电信息存储,在增加了其他功能以后,就可以达到断电后,再次上电直接恢复到断电前的功能界面。由于现在没有添加,显示效果不明显。
现在程序还在完善中,先发布一下视频吧。大神们可以给给建议。
这次给它制作了一个稍微好点的外壳,3D打印的,虽说是边角料搞得,还是一般化,先将就着。
视频如下

基于stm32的多功能电子密码系统

2022年11月3日更新
1、增加指纹识别功能
演示演示

整体演示

资料下载地址:https://download.csdn.net/download/qq_31309951/86888094

此贴后续会持续更新
接下来将会新开贴,分享制作的语音控制设备。

利用stm32做一个升级版的电子多功能密码锁相关推荐

  1. python自己做个定时器_技术图文:如何利用 Python 做一个简单的定时器类?

    原标题:技术图文:如何利用 Python 做一个简单的定时器类? 背景 今天在B站上看有关 Python 最火的一个教学视频 -- "零基础入门学习 Python",这也是我们 P ...

  2. 利用pgzero做一个接球的小游戏

    利用pgzero做一个接球的小游戏 说明 pgzero为python的一个用于游戏制作的库,它基于pygame模块 可用如下命令去安装 pip install pygame pip install p ...

  3. 利用Python做一个简单的对战小游戏

    利用Python做一个简单的文字对战小游戏 一.游戏介绍 1.大体介绍:文字版的对战小游戏,可以利用Python随机生成两个角色,角色带有各自的血量和攻击值两个指标.两人在对战时同时攻击对方,同时造成 ...

  4. java利用队列实现一个学生排队买票功能

    1.利用队列实现一个学生排队买票功能 1.定义一个学生类Student,包括学号No.姓名Name.性别Gender.年龄Age等信息 2.定义一个队列类Queue,用于将学生进行队列排序 3.可以从 ...

  5. 一套房钱就可以做一个品牌的电子烟,让罗永浩们再赚一波快钱?

    电子烟成就了资本,但没有成就烟民. // 1."你抽我啊" // 9月2日,是北京大部分学校开学的日期.在9月2日到4日这段时间,TechWeb蹲守北京海淀区4所中学校门口,对周边 ...

  6. 做一个精致的电子工程师

    5年前,在21IC论坛写了<24岁了,做个精致的 电子 工程师>相关的3篇文章.晃悠一下就奔三了.非常感谢电子新手的持续关注与支持.2006年从珠三角带着惊恐,好奇和成就感辗转来到了上海, ...

  7. 利用Python做一个漂亮小姐姐词云跳舞视频

    最近不少小伙伴在学 Python,想找个好玩的练手项目. 那今天分享一个,简单,适合新手的 Python 小项目. 以下是具体项目: 本文将以哔哩哔哩–乘风破浪视频为例,you-get下载视频. 同时 ...

  8. 利用正则做一个会员注册管理系统

    今天学习了利用正则来做一个会员注册管理系统,该系统的主要难点在于: 1.利用正则来判断账号以及密码是否合法 2.字典的增删查改 3.while循环,break,嵌套if判断语句 正则我是在 [正则网页 ...

  9. 【用Rust玩嵌入式】用STM32做一个拇指琴音符指示器

    本文来自 JiaYe 的投稿,原文地址:https://zhuanlan.zhihu.com/p/108104930 偶然看在网上看到了拇指琴这么一种乐器,觉得可好听了,但是一直没买.后来又冒出来一个 ...

最新文章

  1. 关于端口映射的一个命令
  2. iOS12真机调试包
  3. 【Spring】- Bean生命周期
  4. 【51nod】1239 欧拉函数之和 杜教筛
  5. 提交git push 的时候报错,Please make sure you have the correct access rights
  6. 判断是否遵守某个协议
  7. 华科10年保送生计算机考研复试机试
  8. 分享个提高自己审美的网站
  9. 应用层协议:HTTPS
  10. 31 天重构学习笔记9. 提取接口
  11. 异速联:解决打印样式个性化设置
  12. python-jieba库
  13. 一些实用的小网站、小工具、软件
  14. python计算累计收益率的函数_大盘及策略收益率的公式推导与Python代码
  15. java 01 02_Java知识系统回顾整理01基础02面向对象01类和对象
  16. JAVA:实现CircularBuffer环形缓冲器算法(附完整源码)
  17. 「WAYZ维智」:全国最具价值的室内外混合定位感知网络 | 百万人学AI评选
  18. 梅科尔工作室-孙溢博-鸿蒙笔记1
  19. GitHub项目、代码搜索、使用等技巧
  20. Python 20行简单实现有道在线翻译

热门文章

  1. python 判断是否是元音字母
  2. 图像分类篇:pytorch实现ResNet
  3. 一个公司有m名推销员,他们都推销n种不同的产品。其中m>=l;m<=100,n>=l,n<=10。每天,每个推销员都要为售出的每一种产品交上来一个卡片。
  4. SQL优化中索引列使用函数之灵异事件
  5. GTK之信号和回调函数
  6. 【长期更新】日常学习中遇到的知识点
  7. 学计算机的学生用什么笔记本电脑,什么样的笔记本电脑对学生有好处?这再合适不过了!...
  8. 存储容量和IOPS的关系
  9. xmind可以画流程图吗_怎样用XMind方便地制作流程图
  10. home brew php71安装,php,_mac home-brew 安装 php 失败,php - phpStudy