IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 利用stm32做一个简易的密码锁 -> 正文阅读

[嵌入式]利用stm32做一个简易的密码锁

`自己利用空闲时间制作的电子密码锁,有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,"D??ü??:         ");
							 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,"DT???ü??3é1|£?"); 														        
							      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,"1|?ü:   DT???ü??");
					LCD_Display_Specify_Words(3,0,"?-?ü??£o");
				    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,"2?μ¥: ");
						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设计、程序、串口调试工具、资料(相关芯片,外设的资料)

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-11-11 12:52:08  更:2021-11-11 12:53:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:56:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码