基于STM32的矩阵电子密码锁的Proteus仿真

news/2025/3/17 23:34:29/

本设计仅供参考
基于STM32的矩阵电子密码锁的Proteus仿真 (源码+仿真+原理图+PCB)
原理图:Altium Designer
仿真图:protues 8.9
程序编译器:keil 5
编程语言:C语言
编号C0034
【腾讯文档】C0034 网盘链接
资料下载链接

主要功能:

  1. 液晶屏幕实时显示矩阵键盘输入的密码;
  2. 4x4矩阵键盘可输入6位密码并支持循环覆盖;
  3. 有密码输入正确或错误的声光提示;
  4. 带重新输入功能。

仿真图(提供源文件):

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

原理图(提供源文件):

在这里插入图片描述

PCB(仅供参考):

在这里插入图片描述

程序:

主函数

int main(void)
{uint8_t Key_Value = 27;uint8_t i = 0;/* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* Configure the system clock */SystemClock_Config();TIM3_Init(2400-1, 72-1); // 10msBeep_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);		BEEP_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;elsedisp_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);		}
}//定时器3中断服务函数
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);
}

键盘驱动

#include "key4x4.h"void Key_Init(void)
{GPIO_InitTypeDef GPIO_Initure;   X_GPIO_CLK();Y_GPIO_CLK();/*****************************4行输出*********************************************/GPIO_Initure.Pin = X1_GPIO_PIN|X2_GPIO_PIN|X3_GPIO_PIN|X4_GPIO_PIN; 				GPIO_Initure.Mode = GPIO_MODE_OUTPUT_PP;  	GPIO_Initure.Pull = GPIO_NOPULL;          GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW;   HAL_GPIO_Init(X_GPIO_PORT, &GPIO_Initure);/**************************************4列输入*************************************/GPIO_Initure.Pin = Y1_GPIO_PIN; 				GPIO_Initure.Mode = GPIO_MODE_INPUT;  	GPIO_Initure.Pull = GPIO_NOPULL;          GPIO_Initure.Speed = GPIO_SPEED_FREQ_LOW;   HAL_GPIO_Init(Y_GPIO_PORT, &GPIO_Initure);GPIO_Initure.Pin = Y2_GPIO_PIN; 				HAL_GPIO_Init(Y_GPIO_PORT, &GPIO_Initure);GPIO_Initure.Pin = Y3_GPIO_PIN; 				HAL_GPIO_Init(Y_GPIO_PORT, &GPIO_Initure);GPIO_Initure.Pin = Y4_GPIO_PIN; 				HAL_GPIO_Init(Y_GPIO_PORT, &GPIO_Initure);
}uint8_t Key_Scan(void)
{uint8_t KeyVal = 27;uint8_t Y1 = 0, Y2 = 0, Y3 = 0, Y4 = 0;X1_OUT(1);  //先让X1输出高X2_OUT(1);  //先让X2输出高X3_OUT(1);  //先让X3输出高X4_OUT(1);  //先让X4输出高if( (Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN()) == 0 ){		return 27; //如果X1到X4全为零则没有按键按下 }		else{	HAL_Delay(5); //延时5ms去抖动if( (Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN()) == 0 )return 27;}/*1********************************************************/	 X1_OUT(1); X2_OUT(0); X3_OUT(0); X4_OUT(0);Y1 = Y1_IN(); Y2 = Y2_IN(); Y3 = Y3_IN(); Y4 = Y4_IN();if(Y1==1&&Y2==0&&Y3==0&&Y4==0)KeyVal=1;if(Y1==0&&Y2==1&&Y3==0&&Y4==0)KeyVal=5;if(Y1==0&&Y2==0&&Y3==1&&Y4==0)KeyVal=9;if(Y1==0&&Y2==0&&Y3==0&&Y4==1)KeyVal=13;       //等待按键释放while( (Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN()) > 0 );/*2********************************************************/	 X1_OUT(0); X2_OUT(1); X3_OUT(0); X4_OUT(0);Y1 = Y1_IN(); Y2 = Y2_IN(); Y3 = Y3_IN(); Y4 = Y4_IN();if(Y1==1&&Y2==0&&Y3==0&&Y4==0)KeyVal=2;if(Y1==0&&Y2==1&&Y3==0&&Y4==0)KeyVal=6;if(Y1==0&&Y2==0&&Y3==1&&Y4==0)KeyVal=0;if(Y1==0&&Y2==0&&Y3==0&&Y4==1)KeyVal=14;    		//等待按键释放while( (Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN()) > 0 );/*3********************************************************/	 X1_OUT(0); X2_OUT(0); X3_OUT(1); X4_OUT(0);Y1 = Y1_IN(); Y2 = Y2_IN(); Y3 = Y3_IN(); Y4 = Y4_IN();if(Y1==1&&Y2==0&&Y3==0&&Y4==0)KeyVal=3;if(Y1==0&&Y2==1&&Y3==0&&Y4==0)KeyVal=7;if(Y1==0&&Y2==0&&Y3==1&&Y4==0)KeyVal=11;if(Y1==0&&Y2==0&&Y3==0&&Y4==1)KeyVal=15;		//等待按键释放while( (Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN()) > 0 );/*4********************************************************/	 X1_OUT(0); X2_OUT(0); X3_OUT(0); X4_OUT(1);Y1 = Y1_IN(); Y2 = Y2_IN(); Y3 = Y3_IN(); Y4 = Y4_IN();if(Y1==1&&Y2==0&&Y3==0&&Y4==0)KeyVal=4;if(Y1==0&&Y2==1&&Y3==0&&Y4==0)KeyVal=8;if(Y1==0&&Y2==0&&Y3==1&&Y4==0)KeyVal=12;if(Y1==0&&Y2==0&&Y3==0&&Y4==1)KeyVal=16;		//等待按键释放while( ( Y1_IN() | Y2_IN() | Y3_IN() | Y4_IN() ) > 0 );return KeyVal;
}

资料清单:


http://www.ppmy.cn/news/542110.html

相关文章

串行通信的电子密码锁设计全套资料

word完整版可点击如下下载>>>>>>>> 串行通信的电子密码锁设计全套资料.rar-硬件开发文档类资源-CSDN下载https://download.csdn.net/download/u013253075/78686275?spm1001.2014.3001.5503 目 录 1 引 言....................................…

基于STM32设计的电子密码锁电路方案

基于STM32设计的电子密码锁电路方案 STM32设计的电子密码锁 基于STM32设计的电子密码锁电路方案一级目录二级目录三级目录 设计介绍原理图1按键输入模块2.2 LCD显示模块2.3报警模块2.4开锁模块 PCB程序main函数 设计说明书器件清单资料清单资料下载链接 一级目录 二级目录 三…

【单片机接口技术】电子密码锁实验

1.目标 通过单片机的矩阵键盘模块和LCD1602液晶屏来制作一个简易的电子密码锁&#xff08;六位密码&#xff09;&#xff0c;并实现如下功能&#xff1a; 1.单片机启动后&#xff0c;输入六位密码&#xff0c;六位密码以******显示在液晶上&#xff0c;再按“确认”键&#xf…

51单片机实现电子密码锁设计

使用51单片机实现一个电子密码锁,可以实现修改密码,三次错误输入锁定等功能。 说明 仿真工具:Proteus 8,keil5利用c语言编程仿真图根据51单片机实验板绘制,实物可以使用使用模块:矩阵键盘,LCD1602一、实现方法原理 笔者参考普中51单片机开发攻略,根据单片机内部电路模…

51单片机:设计电子密码锁

文章目录 一、课程设计内容功能阐述 二、开发板原理图与设计流程图三、设计思路和方法1、EEPROM初始化2、LCD1602初始化3、矩阵按键扫描4、输入密码5、密码比对 四、源代码附录五、经验总结与体会1、遇到问题及解决方法 一、课程设计内容 选用单片机开发板STC89C52作为本设计的…

电子锁c语言源程序数码管显示,基于C语言51单片机电子密码锁的设计与仿真

0、引言 电子密码锁是现代生活中常用的加密工具。它克服了机械式密码锁密码量少、安全性能差的缺点,尤其是的智能电子密码锁;不仅具有电子密码锁的功能”还可引人智能化管理功能,从而使密码锁具有更离的安全性和可靠性。 电子密码锁通常使用ARM和单片机控制,单片机相对ARM实…

基于FPGA的电子密码锁

基于FPGA的电子密码锁 实现的功能&#xff1a; 1、 设计制作一个数字密码锁&#xff0c;共有8位密码&#xff0c;要求该密码是字母与数字的结合。输入密码由LCD显示 2、 系统上电后&#xff0c;8位初始密码为0000_0000. 3、 输入8位破解密码&#xff0c;输入完毕后&#xff0…

多功能电子密码锁设计linux,多功能八位电子密码锁设计方案合集

电子密码锁是一种通过密码输入来控制电路或者芯片工作(访问控制系统)&#xff0c;从而控制机械开关的闭合&#xff0c;完成开锁、闭锁任务的电子产品。它的种类很多&#xff0c;有简易的电路产品&#xff0c;也有基于芯片的性价比较高的产品。应用较广的电子密码锁是以芯片为核…