【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示 proteus仿真+程序+设计报告+讲解视频

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计

  • 1.主要功能:
  • 讲解视频:
  • 2.仿真
  • 3. 程序代码
  • 4. 设计报告
  • 5. 设计资料内容清单&&下载链接
      • 资料下载链接:

【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示设计

( proteus仿真+程序+设计报告+讲解视频)

仿真图proteus8.16(有低版本)

程序编译器:keil 4/keil 5

编程语言:C语言

设计编号:P14

1.主要功能:

基于51单片机AT89C51/52(与AT89S51/52、AT89C51/52、STC89C51/52等51内核单片机通用)

基于51单片机的密码锁LCD1602液晶显示设计

1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open!开锁指示灯点亮。

2.密码可以自己修改(6位密码),必须是开始状态才能改密。为防止误操作,修改密码得输入两次。

3.若密码输入错误次数超过3次,蜂鸣器报警并且锁定键盘,需复位重新开始操作。

4.系统具有24C02有复位、掉电保存密码功能。

5.需要在Proteus软件和普中51开发板实现功能验证。

(目前仅完全适配普中开发板A234,其他普中开发板型号可能需要做代码修改或接线)

需注意仿真中51单片机芯片是兼容的,AT89C51,AT89C52是51单片机的具体型号,内核是一样的。相同的原理图里,无论stc还是at都一样,引脚功能都是一样的,程序是兼容的,芯片可以替换为STC89C52/STC89C51/AT89C52/AT89C51等51单片机芯片。

讲解视频:

仿真讲解+实物演示+代码讲解

MVIMG_20240624_190619

2.仿真

开始仿真

打开仿真工程,双击proteus中的单片机,选择hex文件路径,然后开始仿真。

1、首次使用时输入:131420,对密码进行初始化,当显示:initpassword, 证明密码初始化完成,此时的密码为:000000。然后可以改密了。

(如密码忘记就再输入131420初始化,然后密码就是000000)

img

2.输入密码正确,LCD显示open,继电器导通模拟开锁动作。

img

3当输入密码错误后,LCD显示error,报警并锁定键盘3秒钟。

img

3. 程序代码

使用keil4或者keil5编译,代码有注释,可以结合报告理解代码含义。


//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================#define yi 0x80 //LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)//----------------延时函数,后面经常调用----------------------
void delay(uint xms)//延时函数,有参函数
{uint x,y;for(x=xms;x>0;x--)for(y=110;y>0;y--);
}//--------------------------写指令---------------------------
void write_1602com(uchar com)//****液晶写入指令函数****
{lcd1602_rs=0;//数据/指令选择置为指令lcd1602_rw=0; //读写选择置为写P0=com;//送入数据delay(1);lcd1602_en=1;//拉高使能端,为制造有效的下降沿做准备delay(1);lcd1602_en=0;//en由高变低,产生下降沿,液晶执行命令
}//-------------------------写数据-----------------------------
void write_1602dat(uchar dat)//***液晶写入数据函数****
{lcd1602_rs=1;//数据/指令选择置为数据lcd1602_rw=0; //读写选择置为写P0=dat;//送入数据delay(1);lcd1602_en=1; //en置高电平,为制造下降沿做准备delay(1);lcd1602_en=0; //en由高变低,产生下降沿,液晶执行命令
}//-------------------------初始化-------------------------
void lcd_init(void)
{write_1602com(0x38);//设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据write_1602com(0x0c);//开显示不显示光标write_1602com(0x06);//整屏不移动,光标自动右移write_1602com(0x01);//清显示
}
//========================================================================================
//=========================================================================================
//==============将按键值编码为数值=========================
unsigned char coding(unsigned char m)	 
{unsigned char k;switch(m){case (1): k=1;break;case (2): k=2;break;case (3): k=3;break;case (4): k='A';break;case (5): k=4;break;case (6): k=5;break;case (7): k=6;break;case (8): k='B';break;case (9): k=7;break;case (10): k=8;break;case (11): k=9;break;case (12): k='C';break;case (13): k='*';break;case (14): k=0;break;case (15): k='#';break;case (16): k='D';break;}return(k);
}
//=====================按键检测并返回按键值===============================
void delay_uint(unsigned     int i)//延时
{while(i--);
}
完整代码见文末下载链接
unsigned char keynum(void)
{unsigned char i, j; // 定义变量i和j分别存储行列索引i = 0; j = 0;// 设置P1端口的低四位输出为0,高四位保持不变,准备读取键盘列信号P1 = 0x0f;// 判断是否有键被按下(即P1端口的值不全为0x0f)if(P1 != 0x0f) {// 延时去抖,等待10ms再次检测,确保按键稳定delay_uint(10000);// 再次检查,确认按键确实被按下if(P1 != 0x0f) {// 根据P1的值判断是哪一行被按下switch(P1) {case 0x0e: i = 3; break; // 第1行case 0x0d: i = 2; break; // 第3行case 0x0b: i = 1; break; // 第3行case 0x07: i = 0;	   // 第4行}// 设置P1端口的高四位输出为0,低四位保持不变,准备读取键盘行信号P1 = 0xf0;// 根据P1的新值判断是哪一列被按下switch(P1) {case 0xe0: j = 13; break; // 第1列case 0xd0: j = 9;  break; // 第2列case 0xb0: j = 5;  break; // 第3列case 0x70: j = 1;		 // 第4列}}}// 检查新获取的按键值(行列索引组合)是否与上一次的不同if(key != i + j) {// 更新按键值并返回key = i + j;return key;} else {// 如果按键值没有变化,返回0表示没有新按键事件return 0;}
}
//=======================一声提示音,表示有效输入========================
void OneAlam(void)
{beep_cnt=1;beep_time=BEEP_TIME;}
//========================二声提示音,表示操作成功========================
void TwoAlam(void)
{beep_cnt=2;beep_time=BEEP_TIME;}
//========================三声提示音,表示错误========================
void ThreeAlam(void)
{beep_cnt=3;beep_time=BEEP_TIME;}
//=======================显示提示输入=========================
void DisplayChar(void)
{unsigned char i;if(pass==1){//DisplayListChar(0,1,LockOpen);write_1602com(er);				   //在二行开始显示for(i=0;i<16;i++){write_1602dat(LockOpen[i]);	   //显示open 开锁成功}}else{if(N==0){//DisplayListChar(0,1,Error);write_1602com(er);for(i=0;i<16;i++){write_1602dat(Error[i]);	//显示错误}}else{//DisplayListChar(0,1,start_line);	write_1602com(er);for(i=0;i<16;i++){write_1602dat(start_line[i]);//显示开始输入	}}}
}//========================重置密码==================================================
//==================================================================================
void ResetPassword(void)
{unsigned char i;	unsigned char j;if(pass==0){pass=0;			   DisplayChar();	   //显示错误ThreeAlam();	   //没开锁时按下重置密码报警3声}else				   //开锁状态下才能进行密码重置程序{if(ReInputEn==1)   //开锁状态下,ReInputEn置1,重置密码允许{if(N==6)	   //输入6位密码{ReInputCont++;			//密码次数计数	if(ReInputCont==2)		//输入两次密码{for(i=0;i<6;){if(TempPassword[i]==InputData[i])	//将两次输入的新密码作对比i++;else								//如果两次的密码不同{//DisplayListChar(0,1,Error);write_1602com(er);for(j=0;j<16;j++){write_1602dat(Error[j]);	//显示错误Error}ThreeAlam();			//错误提示	pass=0;					//关锁ReInputEn=0;			//关闭重置功能,ReInputCont=0;DisplayChar();break;}} if(i==6){//DisplayListChar(0,1,ResetOK);write_1602com(er);for(j=0;j<16;j++){write_1602dat(ResetOK[j]);	  //密码修改成功,显示}TwoAlam();				//操作成功提示WrToROM(TempPassword,0,6);		//将新密码写入24C02存储ReInputEn=0;}ReInputCont=0;CorrectCont=0;}else					  //输入一次密码时{OneAlam();//DisplayListChar(0, 1, again); 		//显示再次输入一次write_1602com(er);for(j=0;j<16;j++){write_1602dat(again[j]);			//显示再输入一次}					for(i=0;i<6;i++){TempPassword[i]=InputData[i];		//将第一次输入的数据暂存起来						}}N=0;						//输入数据位数计数器清零}}}
}
//=======================输入密码错误超过三过,报警并锁死键盘======================
void Alam_KeyUnable(void)
{P1=0x00;{beep_cnt=255;beep_time=BEEP_TIME;}
}
//=======================取消所有操作============================================
void Cancel(void)
{	unsigned char i;unsigned char j;//DisplayListChar(0, 1, start_line); write_1602com(er);for(j=0;j<16;j++){write_1602dat(start_line[j]);	  //显示开机输入密码界面}TwoAlam();				//提示音for(i=0;i<6;i++){InputData[i]=0;		//将输入密码清零}KEY=1;					//关闭锁pass=0;					//密码正确标志清零ReInputEn=0;			//重置输入充许标志清零ErrorCont=0;			//密码错误输入次数清零CorrectCont=0;			//密码正确输入次数清零ReInputCont=0;			//重置密码输入次数清零 s3_keydown=0;key_disable=0;			//锁定键盘标志清零N=0;					//输入位数计数器清零
}

4. 设计报告

12485字设计报告,内容包括目录,硬件设计、软件设计、软硬件框图、调试、结论等

img

20世纪80年代后,随着电子锁专用集成电路的出现,电子锁的体积缩小,可靠性提高,成本较高,是适合使用在安全性要求较高的场合,且需要有电源提供能量,使用还局限在一定范围,难以普及,所以对它的研究一直没有明显进展。

目前,在西方发达国家,电子密码锁技术相对先进,种类齐全,电子密码锁已被广泛应用于智能门禁系统中,通过多种更加安全,

更加可靠的技术实现大门的管理。在我国电子锁整体水平尚处于国际上70年代左右,电子密码锁的成本还很高,市场上仍以按键电子锁为主,按键式和卡片钥匙式电子锁已引进国际先进水平,现国内有几个厂生产供应市场。但国内自行研制开发的电子锁,其市场结构尚未形成,应用还不广泛。国内的不少企业也引进了世界上先进的技术,发展前景非常可观。希望通过不断的努力,使电子密码锁在我国也能得到广泛应用

5. 设计资料内容清单&&下载链接

资料设计资料包括仿真,程序代码、讲解视频、功能要求、设计报告、软硬件设计框图等。

0、常见使用问题及解决方法–必读!!!!

1、仿真图

2、程序源码注释

3、功能要求

4、开题报告

5、设计报告

6、软硬件流程框图

7、烧录工具

8、讲解视频

9、实物图

Altium Designer 安装破解

KEIL+proteus 单片机仿真设计教程

KEIL安装破解

Proteus元器件查找

Proteus安装

Proteus简易使用教程

单片机学习资料

普中-2&普中-3&普中-4开发板原理图.pdf

相关数据手册

答辩技巧

设计报告常用描述

鼠标双击打开查找嘉盛单片机51 STM32单片机课程毕业设计.url

img

资料下载链接:

https://docs.qq.com/doc/DS2pPenNRaHB6SlR1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3225026.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

存储产品选型策略 OSS生命周期管理与运维

最近在看阿里云的 云存储通关实践认证训练营这个课程还是不错的。 存储产品选型策略、对象存储OSS入门、基于对象存储OSS快速搭建网盘、 如何做好权限控制、如何做好数据安全、如何做好数据管理、涉及对象存储OSS的权限控制、使用OSS完成静态网站托管、对OSS中存储的数据进行分…

Python不使用元类的ORM实现

不使用元类的简单ORM实现 在 Python 中&#xff0c;ORM&#xff08;Object-Relational Mapping&#xff09;是一种将对象和数据库之间的映射关系进行转换的技术&#xff0c;使得通过面向对象的方式来操作数据库更加方便。通常&#xff0c;我们使用元类&#xff08;metaclass&a…

【Linux】进程(9):进程控制2(进程等待)

大家好&#xff0c;我是苏貝&#xff0c;本篇博客带大家了解Linux进程&#xff08;9&#xff09;进程控制2&#xff0c;如果你觉得我写的还不错的话&#xff0c;可以给我一个赞&#x1f44d;吗&#xff0c;感谢❤️ 目录 一. 为什么要进程等待二. 如何进行进程等待1.wait函数—…

android13 设置左右分屏修改为单屏幕,应用分屏改为单屏

1.前言 android13中,系统设置变成,左边是一级菜单,右侧是二级菜单, 这样跟我们以前android7/8/9的布局是不一样的,我们需要将它修改为一级菜单,点进去才是二级菜单这种。 效果如下 2.系统设置实现分析 它这里使用的是google新出的embedding activity, 相关的知识这里…

Golang | Leetcode Golang题解之第226题翻转二叉树

题目&#xff1a; 题解&#xff1a; func invertTree(root *TreeNode) *TreeNode {if root nil {return nil}left : invertTree(root.Left)right : invertTree(root.Right)root.Left rightroot.Right leftreturn root }

24. 122.买卖股票的最佳时机II,55. 跳跃游戏, 45.跳跃游戏II,1005.K次取反后最大化的数组和

第一天没有利润&#xff0c;至少要第二天才会有利润&#xff0c;所以利润的序列比股票序列少一天&#xff01; 从图中可以发现&#xff0c;其实我们需要收集每天的正利润就可以&#xff0c;收集正利润的区间&#xff0c;就是股票买卖的区间&#xff0c;而我们只需要关注最终利…

在FPGA程序中Handshake(握手)和Register(寄存器)区别

在FPGA程序中&#xff0c;Handshake&#xff08;握手&#xff09;和Register&#xff08;寄存器&#xff09;是两种不同的通信和数据传输机制。它们各有特点和适用场景。以下是它们的区别和应用场景的详细解释&#xff1a; Register&#xff08;寄存器&#xff09; 特点&#…

CentOS6禁止锁屏

在电源中设置后还是会锁屏, 原因是有屏幕保护程序 电源管理都 “从不” 一些AI的回答 在CentOS 6系统中&#xff0c;如果你想要禁用锁屏功能&#xff0c;可以编辑/etc/kbd/config文件。这个文件通常包含了键盘相关的设置&#xff0c;包括密码策略和屏幕锁定选项。 首先打开终…

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第一篇 嵌入式Linux入门篇-第十六章 Linux 第一个程序 HelloWorld

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

14-57 剑和诗人31 - LLM/SLM 中的高级 RAG

​​​ 首先确定几个缩写的意思 SLM 小模型 LLM 大模型 检索增强生成 (RAG) 已成为一种增强语言模型能力的强大技术。通过检索和调整外部知识&#xff0c;RAG 可让模型生成更准确、更相关、更全面的文本。 RAG 架构主要有三种类型&#xff1a;简单型、模块化和高级 RAG&…

数据库第五次作业---多表查询

数据库第五次作业----多表查询 新增员工表emp和部门表dept create table dept (dept1 int ,dept_name varchar(11)) charsetutf8; create table emp (sid int ,name varchar(11),age int,worktime_start date,incoming int,dept2 int) charsetutf8; insert into dept values (…

算法:字符串相关

目录 题目一&#xff1a;最长公共前缀 题目二&#xff1a;最长回文子串 题目三&#xff1a;二进制求和 题目四&#xff1a;字符串相乘 题目一&#xff1a;最长公共前缀 编写一个函数来查找字符串数组中的最长公共前缀 如果不存在公共前缀&#xff0c;返回空字符串 "…

阶乘尾数00

题目链接 阶乘尾数 题目描述 注意点 算出 n 阶乘有多少个尾随零 解答思路 n阶乘有多少个尾随零取决于阶乘中有多少个2 * 5的组合&#xff0c;其中阶乘中2的数量一定多于5的数量&#xff0c;所以关键是要找到由多少个质因子5n的阶乘中质因子5的数量等于不断将n除以5&#x…

STM32快速搭建项目框架

注&#xff1a;编写本博客的原因&#xff0c;学习期间基于复习之前知识点的需要&#xff0c;故撰写本教程&#xff0c;即是复习前面的知识点也是作为博客的补充 1.0 文件夹的创建 创建一个STM32项目为模版工程&#xff0c;问价夹下分别包含4个子文件夹&#xff0c;一个是Librar…

【C++项目】从零实现一个在线编译器

前言 身为一名程序员&#xff0c;想必大家都有接触过像leetcode这样的刷题网站&#xff0c;不知你们在刷题的过程中是否思考过一个问题&#xff1a;它们是如何实现在线编译运行的功能。如果你对此感到好奇&#xff0c;那么本文将一步步带你来实现一个简易在线编译器。 项目概…

深入了解线程锁的使用及锁的本质

文章目录 线程锁的本质局部锁的使用 锁的封装及演示线程饥饿问题 线程加锁本质可重入和线程安全死锁问题 根据前面内容的概述, 上述我们已经知道了在linux下关于线程封装和线程互斥,锁的相关的概念, 下面就来介绍一下关于线程锁的一些其他概念. 线程锁的本质 当这个锁是全局的…

Vue使用Echarts(入门级)

最终效果&#xff1a; npm install echarts --save // 先安装echarts<template><!-- 创建一个dom区域用于挂载echarts图表 --><div id"chart" style"width: 600px;height:500px;"/> </template> <script> import * as ech…

WPF依赖附加属性

依赖附加属性的定义 基本过程&#xff1a;声明、注册、包装 依赖附加属性必须在依赖对象&#xff0c;附加属性不一定&#xff0c;关注的是被附加的对象是否是依赖对象 快捷方式&#xff1a;propa tab 关键字&#xff1a;RegisterAttached // 方法封装 public static int …

4.MkDocs样式

学习 Admonitions(警告) - Material for MkDocs (wdk-docs.github.io) 提示 - Material for MkDocs 中文文档 (llango.com) Buttons(按钮) - Material for MkDocs (wdk-docs.github.io) 建议去看这些网站&#xff0c;更为详细。 常用功能 便利贴 ​​ 开启 markdown_ex…