赞
踩
基于STM32的电子密码锁设计
在日常的生活和工作中,住宅安全,文件资料的保护都需要用锁来保证。传统往往使用机械式钥匙开锁,但钥匙丢失会使锁的安全性大打折扣。随着科学技术的不断发展,电子密码锁应运而生,而密码锁也具有安全性高、成本低、功耗低、易操作等优点。电子密码锁,是代指一类可以经过操控电子电路或控制器的内部操控芯片,从而达到操控电子密码锁的机械锁芯开关或闭合的电子设备。其类型上既有结构相对简单的集成电路产品,又有大量应用集成电路晶片的高价格比的电子设备,但现在,在市场上使用比较普遍的就是以芯片为内核的电子密码锁,应用了C语言程序设计,将程序烧录进芯片中,再联系各个模组完成开锁的智能电子密码锁。
数字密码锁是一种常见的安全控制设备,它通过输入预设的数字密码来控制门锁或其他设备的开启和关闭。本文基于STM32单片机,设计了一种数字密码锁系统,实现了密码的输入、验证和控制功能。该系统具有简单、实用、可靠的特点,适用于家庭、办公室等场所的安全管理。
关键词:STM32;数字密码锁;密码输入;密码验证;安全管理
目录
随着科技的迅猛发展,智能家居和物联网技术逐渐融入人们的日常生活,其中电子密码锁作为一种智能安防设备,受到了广泛的关注和应用。电子密码锁不仅在家庭中被广泛应用,还在办公场所、酒店和公共设施中发挥着重要的作用。其通过密码输入实现开锁的功能,大大提升了安全性和便捷性,逐渐取代了传统的机械锁。
在信息化和智能化的推动下,电子密码锁技术得到了显著的发展和应用。相较于传统机械锁,电子密码锁具备以下优点:
图1.1电子密码锁
在众多单片机中,STM32 以其高性能、低功耗和丰富的外设资源,成为了电子密码锁系统设计的首选。STM32 系列单片机由意法半导体(STMicroelectronics)开发,基于 ARM Cortex-M 内核,具有处理能力强、接口丰富、开发工具齐全等优点[1]。因此,研究基于 STM32 的电子密码锁系统,既能充分发挥其硬件优势,又能提升智能安防设备的性能和可靠性。
近年来,国内外学者和工程师在电子密码锁领域进行了广泛的研究和应用探索。在硬件设计方面,常见的主控单元包括 STM32、AVR 和 Arduino 等单片机;在软件设计方面,多采用 C 语言和嵌入式系统编程技术[2]。此外,随着生物识别技术的发展,一些研究者还将指纹识别、人脸识别等技术应用到密码锁系统中,进一步提升了其安全性和智能化水平。
国外的研究主要集中在集成电路设计和智能控制算法优化方面,注重系统的可靠性和多功能集成。
国内的研究则更多关注于成本控制和本地化应用,注重系统的实用性和易用性。例如,国内一些研究团队开发了基于 STM32 的多功能智能密码锁,集成了 LCD 显示、蜂鸣器提示和网络远程控制等功能,取得了显著的研究成果。
本论文的研究内容主要包括以下几个方面:
本课程论文选题的目的在于通过设计和实现一个基于 STM32 单片机的电子密码锁系统,掌握嵌入式系统的硬件设计和软件开发方法,提升对智能控制系统的综合应用能力。同时,通过研究和开发该系统,进一步探索智能安防设备的设计思路和技术实现,为今后的相关研究和产品开发提供参考和借鉴。
本研究的创新点在于:
综上所述,通过本研究的开展,不仅能够掌握电子密码锁的设计与实现技术,还能够为智能安防系统的发展提供有益的技术支持和理论依据。STM32 单片机作为核心控制单元,其高效的处理能力和丰富的外围接口资源为电子密码锁系统的实现提供了坚实的基础。
第二章 系统设计
本文设计的数字密码锁系统基于STM32单片机,主要包括硬件设计和软件设计两部分。
2.1硬件设计
硬件设计包括主控单元、键盘输入模块、LCD显示模块和提示模块,如图2.1所示。主控单元采用STM32单片机,负责控制整个系统的运行和密码验证。键盘输入模块采用4x4矩阵键盘,用于输入密码。LCD显示模块采用LCD1602液晶显示屏,用于显示输入的密码和验证结果。
图2.1硬件电路设计
2.1.1主控单元
主控单元采用STM32单片机,作为系统的核心控制器。它负责接收来自键盘输入模块的密码输入,进行密码验证,并控制LCD显示模块和蜂鸣器提示模块的操作。STM32单片机具有丰富的外设和强大的计算能力,能够满足密码锁系统的需求[3]。
STM32F103处理器是本系统主要使用的芯片,其价格在20元以内,功能十分强大,内置ST公司新增的FSMC存储控制机制功能,方便用户对不同数据类型速度的匹配。因此该微处理器完全可以取代传统的单片机应用;而其具备高达72MHz的主频,性能较一般的单片机有很大的提升[4]。
STM32F103微处理器主要资源和特点如下:
(1)多达64个快速I/O端口,每个端口都可以配置为50MHz的输出模式,或者配置为浮点输入模式。
(2)2个12位模数转换器,在精度上完全超越单片机,并且不需要外加AD模块就可以实现模数转换,且内置温度传感器,方便用户测量处理器实时温度。
(3)灵活的7路通用DMA可以管理存储器到存储器、设备到存储器和存储设备的数据传输,无需CPU任何干预。通过DMA可以使数据快速地移动,就节约CPU的资源来进行其他操作。DMA控制支持环形缓冲区的管理,避免了控制器传输到达缓冲区结尾时所产生的中断。它支持的外设包括:定时器、ADC、SPI和USART等。
图2.2 最小控制单元仿真图
2.1.2键盘输入模块
按键接口设计有两种方法,独立式按键和矩阵式键盘。独立式按键各键相互独立,但是该设计方案I/O资源浪费大。在本设计中,按键较多,考虑到系统可靠性和键盘设计简单,故而采用矩阵按键[5]。
键盘输入模块采用4x4矩阵键盘,用于输入密码。矩阵键盘由行和列交叉连接而成,通过扫描行和读取列的方式来确定按键输入。在数字密码锁系统中,通过轮询的方式扫描键盘的行和列,检测到按键按下时,将按键值发送给主控单元处理。矩阵键盘用于输入密码,连接方式如下:
列线 (C1 - C4):分别连接到PA3, PA4, PA5, PA6。
行线 (R1 - R4):分别连接到PA7, PA8, PA9, PA10。
图2.3 按键矩阵
2.1.3LCD显示模块
在嵌入式单片机应用中,常常使用的显示仪器有单的发光二极管、八段 LED 显示器、液晶显示器(LCD)、屏幕显示器(CRT)等。在此次产品设计中,根据设计所要达到的功能和节省生产成本等实际情况,我采用LCD1602作为此次产品的屏幕。
LCD显示模块采用LCD1602液晶显示屏,用于显示输入的密码和验证结果。LCD1602显示屏具有16x2的字符显示区域,能够显示32个字符。在本文的数字密码锁系统中,LCD1602 用于显示输入的密码和验证结果。本设计所用的LCD1602为带有背光的16脚。其中各引脚接口说明如表1-1所示:
表2.1 LCD1602各引脚功能
在本次设计中,LCD1602 用于显示输入的密码和验证结果。连接方式如下:
VSS: 连接到地(GND)。
VDD: 连接到电源正极(+5V)。
VO: 通过电位器连接到地,用于调节显示对比度。
RS: 连接到 PA11,用于选择寄存器。
RW: 连接到 PA12,用于选择读写模式。
E: 连接到 PA13,用于使能信号。
D0 - D7: 分别连接到 PB0 - PB7,用于数据传输。
图2.4 LCD1602显示屏
指示灯模块包括两个 LED,分别用于指示系统状态:
LED1(绿色):连接到 STM32 的 PA0 引脚,用于指示系统正常运行。
LED2(红色):连接到 STM32 的 PA1 引脚,用于指示错误状态或密码验证失败。
通过控制这两个引脚的电平,主控单元可以点亮或熄灭 LED,给用户提供视觉提示。
图2.5 状态灯
电机转动开锁模块由继电器和 NPN 三极管组成,用于驱动电机打开锁。其具体连接如下:
控制引脚:连接到 STM32 的 PA14 引脚,控制三极管的基极(B)。
继电器线圈:一端接电源正极,另一端接三极管的集电极(C)。
三极管发射极(E):接地。
当主控单元通过 PA14 引脚输出高电平时,三极管导通,继电器线圈通电,继电器闭合,从而驱动电机转动,实现开锁。
图2.6电机模块
软件设计是电子密码锁系统实现的核心部分,主要包括密码输入、密码验证和控制功能。每个功能模块都有其独特的职责和实现方法,确保整个系统的可靠性和有效性。
密码输入功能通过键盘输入模块实现。键盘输入模块采用4x4矩阵键盘,通过行列扫描的方式检测按键按下的状态。以下是密码输入部分的具体实现步骤:
1.初始化键盘扫描:
在主程序中初始化键盘输入模块,并配置相关的GPIO引脚,以便对键盘进行扫描和检测。
图2.7 键盘初始化
2.扫描键盘:
通过轮询的方式不断扫描键盘,检测按键的状态。一旦检测到按键按下,将按键的值存储在密码数组中
图2.8 键盘扫描
3.处理特殊按键:
处理清除键和确认键的按下操作。清除键用于清除输入的密码,确认键用于触发密码验证过程
图2.9 确认
1.初始化密码数组:
在主程序中预设一个密码数组,用于与用户输入的密码进行比对。
图2.10 初始化密码
2.触发密码验证:
当用户按下确认键时,触发密码验证过程,将用户输入的密码与预设密码进行比对。
图2.11 密码验证
3.反馈验证结果:根据比对结果,通过LCD显示模块和蜂鸣器提示模块将验证结果反馈给用户。
图2.12 反馈结果
控制功能根据密码验证结果控制门锁或其他设备的开启和关闭。以下是控制功能部分的具体实现步骤:
1.初始化控制模块:在主程序中初始化控制模块的相关引脚,如电机驱动引脚和指示灯引脚。
图2.13 电机初始化
2.控制门锁:根据密码验证结果,控制门锁的开启和关闭。如果密码验证通过,打开门锁;如果密码验证失败,保持门锁关闭状态。
图2.14 门锁控制
经过实验验证,本文设计的数字密码锁系统能够稳定运行,密码输入准确,密码验证及时可靠。在输入正确密码时,系统能够及时开启门锁或其他设备;在输入错误密码时,系统能够及时发出错误提示,并阻止门锁或其他设备的开启。以下是各个部分的详细实验结果。
图3.1 密码正确
图3.2 密码错误
控制功能模块根据密码验证结果控制门锁电机的开启和关闭。输入正确密码时,系统能及时控制门锁电机正转,成功打开门锁,并在预设时间后停止电机,确保门锁开启的稳定性。输入错误密码时,系统保持门锁关闭状态,电机不动作,确保了门锁的安全性。多次测试表明,系统能可靠地控制门锁的开启和关闭,响应时间短,执行动作准确。
总结:通过上述实验验证,本文设计的数字密码锁系统能够稳定运行,密码输入准确,密码验证及时可靠,控制功能执行得当。系统在输入正确密码时,能够及时开启门锁或其他设备;在输入错误密码时,能够及时发出错误提示,并阻止门锁开启。系统的设计和实现达到了预期目标,具备实用价值和良好的应用前景。
第四章 结论与展望
本文设计了一种基于STM32的数字密码锁系统,电子智能密码锁使用了STM32为主的控制器件,加之附加电路及相应的程序设计,并采用了软硬件组合的方法来完成设计,此电子密码锁共6位密钥,每一个包括了0-9共十个数字,通过计算,打开电子密码锁的概率是一千亿分之1,安全性极高实现了密码的输入、验证和控制功能。该系统具有简单、实用、可靠的特点,适用于家庭、办公室等场所的安全管理。在未来的研究中,可以进一步优化系统的性能,扩展其功能和应用范围。
本文设计的数字密码锁系统在功能和稳定性方面取得了良好的实验结果,但在实际应用和未来发展中仍有许多改进和扩展的空间。以下是对未来可能发展的几点展望:
随着科技的发展,破解密码的手段也在不断进步。为了提高系统的安全性,可以引入更复杂的加密算法和多重身份验证机制。例如,可以结合指纹识别、人脸识别等生物特征识别技术,提高密码锁的安全级别,防止非法入侵[6]。
在用户界面和操作体验方面,未来可以引入触摸屏技术取代传统的按键输入,提供更加直观和便捷的用户操作界面。同时,可以增加语音提示功能,使系统更加人性化。
通过物联网技术的引入,可以实现远程控制和监控功能。用户可以通过手机APP或者网页端实时监控密码锁的状态,远程管理密码锁的开关操作,并在异常情况下及时接收报警信息,进一步提升使用便捷性和安全性。
未来可以将数字密码锁系统与智能家居系统集成,实现更多功能的联动控制。例如,与智能门铃、摄像头、安防系统等设备的联动,在提升家庭安全的同时,提供更多的便捷服务。
时光飞逝,大学生活过得比我想象中要快得多,转眼间我的大学三年级的学习生涯已近尾声。这一年的时光非常短暂而充实,有过困境低谷,有过沮丧灰心,然而,所有的艰难困苦都在柳暗花明、船到桥头时破茧成蝶,因为有艰难坎坷,才有成长和收获,这一切都是有意义的。在本次设计的最后,我想对给予我帮助的老师、同学及母校表示感谢。
首先,感谢我的授课教师hy教师。在我的大三的一整个学年中,无论是hy教师的《单片机与接口技术》课程,还是《计算机系统结构》课程,课堂氛围都是轻松愉快的。我令影响最深刻的是,hy总是会在授课的同时普及当下流行的技术,并不会让课程停留在过时的内容上,这对我对单片机技术的理解起了很大帮助。在整个课程设计过程中,hy教师在课题的选定和研究方向上提供了耐心细致的帮助,使本次课程设计得以顺利完成,再次感谢,祝身体健康,工作顺利!
其次,感谢我的同窗同学们。在整个学习和设计过程中,我们相互交流,分享经验和心得,提供了许多有益的意见和建议。
再次,感谢母校贵州大学提供的实验设备和良好的学习环境,为我的学习和研究提供了强有力的支持。
[1]赵志刚, 孙伟, 高鹏. 基于STM32的智能密码锁设计与实现[J]. 现代电子技术, 2019, 42(24): 78-81.
[2]刘海波, 李志伟. 基于STM32的数字密码锁系统设计[J]. 电子技术应用, 2020, 46(2): 59-62.
王华, 张伟, 李斌. 基于STM32的智能门锁系统设计与实现[J]. 计算机工程与应用, 2018, 54(18): 142-145.
[3] 梅丽凤,郭栋,汪毓铎.单片机原理及接口技术[M].4版.北京:清华大学出版社,2018.
[4] 朱彦龙,房新荷.基于51单片机的指纹电子密码锁的设计与实现分析[J].电子元器件与信息技术,2018,2(10):75-77.
[5] 刘 柳 . 一 种 特 色 矩 阵 键 盘 的 设 计 方 法 : CN102637075A[P].2012-08-15.
[6] 沈睿.基于DSP的自动指纹识别系统的研究与开发[D].北京.北京邮电大学:,2007.
然后右键
然后
然后找到hex文件
然后自己运行
对了 密码是123321(嘻嘻)
附录
主函数代码:#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "main.h"
#include "lcd1602.h"
#include "timer.h"
#include "key4x4.h"
#include "beep.h"
void SystemClock_Config(void);
uint8_t flag = 0;
uint8_t password[6] = {1, 2, 3, 3, 2, 1};
uint8_t disp_num[6] = {27, 27, 27, 27, 27, 27};
uint8_t disp_num_tmp[6];
#define DISP_FORMAT "%d%d%d%d%d%d"
char *Disp_YES = " YES! ";
char *Disp_NO = " NO! ";
char *Disp_NONE = " ";
char *toDisplay;
int main(void)
{
uint8_t Key_Value = 27;
uint8_t i = 0;
HAL_Init();
SystemClock_Config();
TIM3_Init(2400-1, 72-1);
Beep_Init();
Key_Init();
LCD_Init();
LCD_write_string(0, 0, "Input Password:");
while(1)
{
Key_Value = Key_Scan();
if(Key_Value < 10)
{
disp_num[i] = Key_Value;
i++;
if(i > 5)
i = 0;
Key_Value = 27;
}
if(Key_Value == 16)
{
for(i = 0; i < 6; i++)
{
if(disp_num[i] != password[i])
{
flag = 1;
break;
}
else
{
flag = 0;
}
}
if(flag == 1)
{
LCD_write_string(6, 1, Disp_NO);
LED_Blink (3, 200);
LCD_write_string(6, 1, Disp_NONE);
}
else
{
LCD_write_string(6, 1, Disp_YES);
LED_Blink (1, 500);
BEEP_Blink(1, 500);
LCD_write_string(6, 1, Disp_NONE);
}
memset(disp_num, 27, 6);
Key_Value = 27;
i = 0;
}
if(Key_Value == 13)
{
memset(disp_num, 27, 6);
Key_Value = 27;
i = 0;
}
for(uint8_t j = 0; j < 6; j++)
{
if(disp_num[j] > 9)
disp_num_tmp[j] = 0;
else
disp_num_tmp[j] = disp_num[j];
}
sprintf(toDisplay, DISP_FORMAT, disp_num_tmp[0], disp_num_tmp[1], disp_num_tmp[2], disp_num_tmp[3], disp_num_tmp[4], disp_num_tmp[5]);
HAL_Delay(20);
}
}
uint8_t led_temp = 0;
void TIM3_IRQHandler(void)
{
led_temp++;
if(led_temp > 10)
{
led_temp = 0;
LED1_TOG();
LCD_write_string(0, 1, toDisplay);
}
HAL_TIM_IRQHandler(&TIM3_Handler);
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct = {0};
RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI|RCC_OSCILLATORTYPE_LSI;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
RCC_OscInitStruct.LSIState = RCC_LSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
}
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
}
PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_RTC|RCC_PERIPHCLK_ADC;
PeriphClkInit.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;
PeriphClkInit.AdcClockSelection = RCC_ADCPCLK2_DIV2;
if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
{
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。