【普中】基于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://www.mzph.cn/bicheng/43948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

debian或Ubuntu中开启ssh允许root远程ssh登录的方法

debian或Ubuntu中开启ssh允许root远程ssh登录的方法 前因&#xff1a; 因开发需要&#xff0c;需要设置开发板的ssh远程连接。 操作步骤如下&#xff1a; 安装openssh-server sudo apt install openssh-server设置root用户密码&#xff1a; sudo passwd root允许root用户…

Java继承练习(4) (2024.7.9)

人类 package Work20240709;public class Person {String name;String gender;int age;String nationality;public Person() {}public Person(String name, String gender, int age, String nationality) {this.name name;this.gender gender;this.age age;this.nationalit…

Androidstudio开发,天气预报APP

1.项目功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;和风天气API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现未来7天列表展示和天气指数使用PopupMenu 实现弹出选项框使用动画定时器实现欢迎页倒计时和logo动画使用Text…

使用 Vue 3 实现打字机效果

在现代前端开发中&#xff0c;添加一些视觉效果可以提升用户体验。其中&#xff0c;打字机效果是一种常见且吸引人的效果&#xff0c;可以用于展示动态文本。本文将介绍如何在 Vue 3 中实现打字机效果。 实现步骤 1. 创建自定义指令 我们首先创建一个自定义指令 v-typewriter…

SVN 标签的使用与优势

SVN 标签的使用与优势 1. 引言 在软件开发过程中,版本控制是一个至关重要的环节。它帮助开发团队跟踪代码的变化,协作开发,并管理项目的不同版本。Subversion(SVN)作为一种流行的版本控制系统,提供了强大的标签功能,以支持软件开发的不同阶段。本文将详细介绍SVN标签的…

web 网络安全

Web网络安全是网络安全的一个重要分支&#xff0c;专注于保护Web应用程序、服务和网站免受各种网络威胁。学习Web网络安全涉及多个层面的知识和技能&#xff0c;以下是一些主要的学习领域&#xff1a; 一、XSS攻击 全称:&#xff1a;Cross Site Script &#xff08;跨站脚本&a…

从零手写实现 nginx-25-directive map 条件判断指令

前言 大家好&#xff0c;我是老马。很高兴遇到你。 我们为 java 开发者实现了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何处理的&#xff0c;可以参考我的另一个项目&#xff1a; 手写从零实现简易版 tomcat minicat 手写 nginx 系列 …

在vue3中,手写父子关联,勾选子级父级关联,取消只取消当前子级,父节点不动

树形控件选择子级勾选父级&#xff0c;以及所有子级&#xff0c; 取消勾选仅取消子级 在项目中&#xff0c;可能会遇到这种场景&#xff0c;比如权限配置的时候&#xff0c;页面权限和菜单权限以tree的形式来配置&#xff0c;而且不用半选&#xff0c;菜单在页面的下面&#xf…

FTP与TFTP

1、TFTP&#xff08;简单文件传输协议&#xff09; TFTP是TCP/IP协议族中一个用来在客户机与服务器之间进行简单文件传输的协议&#xff0c;提供不复杂、开销不大的文件传输服务。 基于UDP协议 端口号&#xff1a;69 特点&#xff1a;简单、轻量级、易于实现 传输过程&…

人与机器的协同是强弱系统的互补行为

人与机器的协同可以被视作强弱系统的互补行为&#xff0c;这也强调了人类和机器之间在处理问题、执行任务或创造价值时各自的优势与角色。 人类在认知、创造力、情感和伦理等方面具有独特优势。我们能够进行高级的抽象思维、创新和复杂决策&#xff0c;能够处理不确定性和动态环…

《Windows API每日一练》9.13资源-鼠标位图和字符串

鼠标指针位图&#xff08;Mouse Cursor Bitmap&#xff09;是用于表示鼠标指针外观的图像。在 Windows 窗口编程中&#xff0c;可以使用自定义的鼠标指针位图来改变鼠标的外观&#xff0c;并提供更加个性化的用户体验。 ■以下是一些与鼠标指针位图相关的要点&#xff1a; ●…

量产工具一一业务系统(六)

目录 前言 一、代码流程框架 1.业务系统程序流程图 2.业务系统主页面流程图 3.main.c 4.main_page.c 二、处理配置文件 1.配置文件示例 2.处理配置文件 3.config.h 4.config.c 三、生成产品界面 1.计算每个按钮的范围 2.main_page.c 四、处理输入事件 1.main_…

【力扣C语言】每日一题—第121题,买卖股票的最佳时机

题目&#xff1a; 返回获取的最大利润&#xff1a; 这题可浪费时间了&#xff01;&#xff01;&#xff01; 主要是暴力求解超时&#xff01;&#xff01;&#xff01; 最后参考了一下答案 解题思路&#xff1a; 思路一&#xff1a; 暴力求解&#xff1a;两重for循环判断…

【Python实战因果推断】18_线性回归的不合理效果8

目录 Saturated Regression Model Regression as Variance Weighted Average Saturated Regression Model 还记得我在本章开头强调回归和条件平均值之间的相似性吗&#xff1f;我向你展示了使用二元干预进行回归与比较干预组和对照组的平均值是完全一样的。现在&#xff0c;由…

opencv--把cv::Mat数据转为二进制数据的保存和读取

保存 #include <opencv2/opencv.hpp> #include <iostream> #include <fstream>void saveMatToBinary(const cv::Mat& mat, const std::string& filename) {std::ofstream ofs(filename, std::ios::binary);if (!ofs.is_open()) {std::cerr <<…

Python | Leetcode Python题解之第225题用队列实现栈

题目&#xff1a; 题解&#xff1a; class MyStack:def __init__(self):"""Initialize your data structure here."""self.queue collections.deque()def push(self, x: int) -> None:"""Push element x onto stack."&…

LabVIEW机器视觉技术在产品质量检测中有哪些应用实例

LabVIEW的机器视觉技术在产品质量检测中有广泛的应用&#xff0c;通过图像采集、处理和分析&#xff0c;实现对产品缺陷的自动检测、尺寸测量和定位校准&#xff0c;提高生产效率和产品质量。 1. 电子元器件质量检测 在电子制造业中&#xff0c;电子元器件的质量检测是确保产品…

【基于深度学习方法的激光雷达点云配准系列之GeoTransformer】——粗配准

【GeoTransformer系列】——粗配准 1.coarse_matching1.1 概要1.2 功能1.3 超参1.4 input1.5 output2 coarse_target2.1 概要2.2 功能2.3 input2.4 output在模型部分有了初步了解之后, 接下来我们对后续的粗配准、精配准等部分依次进行解读. 本篇主要来看粗配准部分, 代码是在G…

websocket推送消息,模拟推送

上一篇文章&#xff1a;什么是webSocket&#xff1f;以及它的一些相关理论知识 背景&#xff1a; MQTT 的发布/订阅模式与 WebSocket 的双向通信特性相结合。 通过将 MQTT 与 WebSocket 结合使用&#xff0c;可以在 Web 应用中实现高效、实时的消息传输&#xff0c;特别适用于…

算法练习第29天|1005.K次取反后最大化的数组和

1005. K 次取反后最大化的数组和 - 力扣&#xff08;LeetCode&#xff09; 1.题目描述 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下…