基于AT89C51单片机的电子密码锁设计与仿真

点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503
在这里插入图片描述

源码获取
主要内容:
(1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。
(2)设计开锁密码位六位密码的电子密码锁。
(3)能够LCD显示在密码正确时显示PASSWORD OK,密码错误时显示PASSWORD ERROR,输入密码时显示INPUT PASSWORD。
(4)实现输入密码错误超过限定的三次电子密码锁定。
(5)4×4的矩阵键盘其中包括0-9的数字键和A-F的功能键
(6)本产品具备报警功能,当输入密码错误时蜂鸣器响并且LED灯亮。
(7)密码可以由用户自己修改设定(只支持6位密码),修改密码之前必须再次输入密码,在输入新密码时候需要二次确认,以防止误操作 。
基本要求:
1.通过课程设计,提高程序开发功能,能运用合理的控制流程编写清晰高效的程序。
2.通过课程设计,训练C程序调试能力,能将一个中小型各级组织系统联调通过。
3.通话课程设计,培养分析问题、解决实际问题的能力。

1.设计要求;

用电子器件设计制作一个密码锁,使之在输入正确的密码时开锁;
在锁的控制电路中设-一个可以修改的4位代码,当输入的代码和控制电路的代码一致时打开;
用红灯亮、绿灯灭表示关锁,绿灯亮、红灯灭表示开锁。
如5s内未能将锁打开,则电路自动复位进入自锁状态,并发报警信号。

2.硬件设计:
在这里插入图片描述

电子密码锁的结构框图如图1-1所示,选用单片机STC89C52作为电子密码锁的核心控制器件,在单片机的外围电路接矩阵键盘,用于输入密码并实现一些控制功能,外接LCD1602显示模块显示开锁信息,外接继电器,用继电器常开触点闭合模拟开锁动作,外接指示灯与蜂鸣器作为密码锁开锁成功或不成功的声光提示。

图中包括单片机最简单应用系统、 4╳3矩阵键盘、LCD1602显示电路、继电器电路和声光指示电路。
矩阵键盘的4根行线接在P2.0P2.3上,3根列线接在P2.4P2.6上。行线作为输出端,列线作为输入端,由于P2口内部有上拉电阻,无键按下时,列线输入均为高电平。

电子密码锁电路原理图如图1- 1所示
矩阵键盘、LCD1602显示电路、继电器电路和声光指示电路。矩阵键盘的4根行线接在P2.0P2.3上,3根列线接在P2.4P2.6上。行线作为输出端,列线作为输人端,由于P2口内部有上拉电阻,无键按下时,列线输人均为高电平。确定矩阵式键盘中的哪个键被按下,采用逐行扫描查询法,依次将行线置为低电平,再逐行检测各列线的电平状态,若某列为低电平,则该列线与置为低电平的行线交叉处的按键为闭合键。若所有的列线均为高电平,则无按键按下。LCD1602字符型液晶显示器的数据端口接单片机的 P 口,由单片机的P1.0~P1.2控制 LCD 的 RS 、 RW 和 E 控制端口。
在这里插入图片描述

开锁成功的仿真结果
3.程序设计

程序包括主程序、键盘扫描子程序、液晶显示器程序等。主程序进行变量及端口初始化定义,调用键盘扫描子程序,将按下的键值显示在液晶屏上,并很快替换为“*”,等六位密码全部输完后,进行密码匹配,如果密码正确,则液晶显示“ open”,同时开锁成功指示灯亮,否则液晶显示;“ error”,同时开锁失败指示灯亮。

端口初始化定义,调用键盘扫描子程序,将按下的键值显示在液晶屏上,并很快替换为“*”,等六位密码全部输完后,进行密码匹配,如果密码正确,则液晶显示“open",同时开锁成功指示灯亮,否则液晶显示“ error”,同时开锁失败指示灯亮。
设计的程序如下:

#include <reg51.h>
#include<intrins.h>
#define uchar unsigned char
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P1^2;
sbit ledg=P1^3;
sbit ledr=P1^7;
sbit relay=P1^4;
sbit buzz=P1^6;
char table0[]="error";
char table1[]="open";
char table2[]="password:";
int temp,ch,m0,m1,p,n0,n1,n2,n3,n4,n5;
void   delay(int z)
{ int x,c;
  for(x=z;x>0;x--)
  for(c=100;c>0;c--);
}
keyscan()
{ temp=P2&0xf0;
	P2=0xfe;
  delay(1);
	temp=P2&0xf0;
	while(temp!=0xf0)
	{ switch(temp)
		{
		case 0xe0:ch='7';break;
		case 0xd0:ch='8';break;
		case 0xb0:ch='9';break;
		default:ch=p;break;
		}
		while (temp!=0xf0)
		{ temp=P2;
			temp=temp&0xf0;
		}
	}
P2=0xfd;
delay(1);
temp=P2&0xf0;
while(temp!=0xf0)
{    switch(temp)
	{    case 0xe0:ch='4';break;
	     case 0xd0:ch='5';break;
	     case 0xb0:ch='6';break;
	     default:ch=p;break;
	}
	while(temp!=0xf0)
	{    temp=P2;
		   temp=temp&0xf0;
	
}
void open()
{
	char m2;
	wcom(0xc6);
	for(m2=0;m2<4;m2++)
	{
	wdat(table1[m2]);
	}
}
void error()
{ char m2;
	wcom(0xc6);
	for(m2=0;m2<5;m2++)
	{ wdat(table0[m2]);
	}
}
void pass()
{
	char m2;
	wcom(0x80);
	for(m2=0;m2<9;m2++)
	{
		wdat(table2[m2]);
	}
}
void change(int m)
{
	delay(500);
	wcom(m);
	wdat('*');
}
void main()
{
	RW=0;
	ledg=0;
	ledr=0;
	relay=1;
	buzz=1;
	init();
	delay(5);
	pass();
	wcom(0x89);
	while(keyscan()==p)
	{
		delay(3);
		keyscan();
	}
	wdat(keyscan());
  n0=keyscan();
  change(0x89);
  delay(10);
  ch=p;
  while(keyscan()==p)
	{
    delay(3);
		keyscan();
	}
	wdat(keyscan());
	n1=keyscan();
	change(0x8a);
	ch=p;
	while(keyscan()==p)
	{
		delay(3);
		keyscan();
	}
	wdat(keyscan());
	n2=keyscan();
	change(0x8b);
	ch=p;
	while(keyscan()==p)
	{
		delay(3);
		keyscan();
}
wdat(keyscan());
n3=keyscan();
change(0x8c);
ch=p;
while(keyscan()==p)
{
	delay(3);
	keyscan();
}
wdat(keyscan());
n4=keyscan();
change(0x8d);
ch=p;
while(keyscan()==p)
{
	delay(3);
	keyscan();
}
wdat(keyscan());
n5=keyscan();
change(0x8e);
if(n0=='1'&&n1=='8'&&n2=='0'&&n3=='1'&&n4=='2'&&n5=='2')
{
	int m3=1;
	open();
	relay=0;
	delay(3000);
	relay=1;
	while(m3)
	{
		int m4,m5;
		ledg=0;
		for(m4=200;m4>0;m4--)
		{
			keyscan();
			if(keyscan()=='A')
			{
				m4=0;
				m3=0;
			}
		}
		ledg=1;
		if(m3!=0)
		{
			for(m5=200;m5>0;m5--)
			{
				keyscan();
				if(keyscan()=='A')
				{
					m3=0;
				}
			}
		}
	}
}
else
{
	ledr=1;
	error();
	buzz=0;
	delay(5000);
}
}

4.仿真与实验结果

电子密码锁仿真电路及结果如图2示,按下预设的6位密码18012”液晶显示器第1行显示:“password: *****“, 第2行在中间位置显示“open”,继电器后面所接的指示灯PI.3口所接的开锁成功指示灯亮灭闪烁,如果输入的密码不是预设的密码,则液晶第2行在中间位置显示“error”,表示开锁失败,相应的指示灯也点亮。
仿真结果图如下所示:

在这里插入图片描述

5.异常现象分析与解决方法

1.由于代码过多,在编程中容易出错,所以在编程过程中要认真仔细。
2.密码锁无法输入密码,我积极向老师同学求助,最后在他们的帮助下,完成课程设计
3.按键不灵敏。
初步想法是:程序里包含了太多的延时。解决方法:减少延时时间尽量不用,将延时函数延时时间减短,将标志数增加。
输入数字时显示数字,并不显示‘',存在一定的密码泄露风险。
解决方法:查阅资料,知道‘
’在1602里是0x2a,这样就可以在显示的时候输入数据位“0x2a”
6.心得体会

通过电子密码锁的课程设计有了很大的收获。首先,通过学习使自己对课本上的知识可以应用于实际,使理论与实际结合,加深自己对课本知识的理解。不足道的地方就是因为时间关系,没有能够将实物做出来验证自己的设计。但是在设计过程中用到了Multisim仿真验证,对Multisim达到学以致用的目的。以前只是泛泛的了解过Multisim 软件功能,在电路的设计过程中通过大量的运用,使自己在软件仿真方面有了很大的提高,有了受益匪浅的感觉。

在做电子密码锁的课程设计中,我感受到了老师对学生的悔人不卷的精神,老师细心的指导,使我少走了弯路,学到了很多电子应用技术的知识,顺利完成了课程设计,在这里对指导老师.表示衷心的感谢!

主要参考资料:
[1]王海军.一种单片机和云平台的电子密码锁设计[J].电子世界,2020(24):146-147.
[2]郭阳光.基于单片机的指纹识别电子密码锁设计[J].电子测试,2020(23):29-30+53.
[3]韩燕楚,余宏.基于51单片机的电子密码锁设计与应用研究[J].漯河职业技术学院学报,2020,19(06):21-23.
[4]韩旭,吴华,杨岱霖,邓昕.基于STC89C52的电子密码锁设计[J].电子技术,2020,49(10):10-11.
[5]黄田,杨婷婷,姜少维,李佳康,董莉霞.基于单片机的电子密码锁设计[J].软件,2020,41(10):102-104.
[6]孙凯悦.基于单片机的按键电子密码锁设计[J].科技经济导刊,2020,28(26):55-56.
[7]陈后全.基于51单片机设计的密码锁[J].电子制作,2020(10):37-38.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于web的课程重难点掌握情况分析系统

1&#xff0e;系统登录&#xff1a;系统登录是用户访问系统的路口&#xff0c;设计了系统登录界面&#xff0c;包括用户名、密码和验证码&#xff0c;然后对登录进来的用户判断身份信息&#xff0c;判断是管理员用户还是普通用户。 2&#xff0e;系统用户管理&#xff1a;不管是…

链表(数据结构)

目录 链表 链表的分类 1、单向或者双向 2、带头或者不带头 3、循环或者非循环 总结&#xff1a; 单链表 创建链式结构 创建新节点 尾插 尾删 头插 头删 查找节点 在pos位置后插入 删除pos位置后的节点 销毁 总代码 链表 概念&#xff1a; 链表是一种物理结构上非连续的、非顺序…

用于无线传感器网络路由的改进leach协议(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 当前&#xff0c;无线传感器由于技术的发展得到更加广泛的应用&#xff0c;针对无线传感器网络&#xff08;WSN&#xff09;的…

CCED2000后,中文编程软件再次脱颖而出,系出金山

WPS抗衡微软&#xff0c;CCEDE却被淹没&#xff1f; DOS代&#xff0c;我们用WPS来进行文字编辑&#xff0c;CCED来做表格&#xff0c;两者在那个时代可以称得上是国产办公领域的“必装软件”。 如今&#xff0c;30年过去了&#xff0c;WPS一步一步成长为抗衡微软office的国产…

魔兽服务端编译部署NPCBots和 Al机器人模块教程

魔兽服务端编译部署NPCBots和 Al机器人模块教程 大家好,我是艾西。在平时自己一个人玩魔兽的时候是不是会比较无聊,因为游戏机制或副本难度自己一个人无法进行快乐的玩耍。今天艾西教大家编译部署NPCBots和 Al机器人模块,直接一个人玩魔兽也不孤单 首先到GIT去下载ai机器…

类与对象(上)

1.面向过程和面向对象初步认识 C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题。 C是基于面向对象的&#xff0c;关注的是对象&#xff0c;将一件事情拆分成不同的对象&#xff0c;靠对象之间的交互完 成。…

法规标准-UN R152标准解读

UN R152是做什么的&#xff1f; UN R152 全名为关于M1和N1型机动车高级紧急制动系统&#xff08;AEBS&#xff09;型式认证的统一规定&#xff0c;是联合国对于M1和N1型车辆AEBS系统认证的要求说明&#xff0c;当满足其要求内容时&#xff0c;才可通过联合国的认证&#xff0c…

Node【Node.js 20】新特性

文章目录 &#x1f31f;前言&#x1f31f;Node.js 20: 一次重要的升级和改进&#x1f31f;Internationalization API Update&#x1f31f;端口管理器&#x1f31f;字符串处理&#x1f31f; 更好的调试工具&#x1f31f; Crypto模块的更新&#x1f31f;总结&#x1f31f;写在最后…

MPSOC(ZU9EG/ZU15EG)PCIE架构高性能数据预处理 FMC载板设计资料

板卡概述 PCIE707 是一款基于 PCIE 总线架构的高性能数据预处理 FMC载板&#xff0c;板卡具有 1 个 FMC&#xff08;HPC&#xff09;接口&#xff0c;1 路 PCIe x4 主机接口、 1 个 RJ45 千兆以太网口、2 个 QSFP 40G 光纤接口。板卡采用 Xilinx 的高性能 UltraScale MPSOC 系…

linux用户管理指令

这里写自定义目录标题 一 增加新用户及密码二 切换用户三 userdel 删除用户四 查看用户登录信息五 让普通用户成为管理员1. 修改环境配置文件2.设置用户和密码 六 查看创建哪些用户 一 增加新用户及密码 useradd:加用户名 passwd&#xff1a;加用户密码 [rootlocalhost ~]# u…

etcd原理剖析一

为什么Kubernetes使用etcd&#xff1f; 首先我们来看服务高可用以及数据一致性。单副本存在单点故障&#xff0c;而多副本又引入数据一致性问题。 为了解决数据一致性问题&#xff0c;需要引入一个共识算法。例如Raft等。etcd选择了Raft&#xff0c;它将复杂的一致性问题分解…

【SpringBoot】SpringBoot集成ElasticSearch

文章目录 第一步&#xff0c;导入jar包&#xff0c;注意这里的jar包版本可能和你导入的不一致&#xff0c;所以需要修改第二步&#xff0c;编写配置类第三步&#xff0c;填写yml第四步&#xff0c;编写util类第五步&#xff0c;编写controller类第六步&#xff0c;测试即可 第一…

基于FPGA+JESD204B 时钟双通道 6.4GSPS 高速数据采集模块设计(二)研究 JESD204B 链路建立与同步的过程

基于 JESD204B 的采集与数据接收电路设计 本章将围绕基于 JESD204B 高速数据传输接口的双通道高速数据采集实现展 开。首先&#xff0c;简介 JESD204B 协议、接口结构。然后&#xff0c;研究 JESD204B 链路建立与同 步的过程。其次&#xff0c;研究基于 JESD204B …

网易云音乐开发--主页静态页面搭建

如何用VScode来开发小程序 wxml和wxss来高亮小程序 窗口设置 轮播图制作 就是通过swiper来设置轮播图 iconfont字体图标使用 这里要借助阿里的iconfonticonfont-阿里巴巴矢量图标库 找到自己喜欢的图标&#xff0c;添加到购物车 添加到项目 这样就可以统一的管理图标的库 …

三分钟教你看懂 spring 官方文档

新手如何学会查看官方文档API 首先进入官网&#xff1a;这里以 spring boot 为例 &#xff0c;进入spring 官方地址 我们进入 spring boot 这里我们要看文档当然是要 learn 了&#xff0c;所以点进去。 我需要的东西在 IO 模块里面&#xff0c;点 IO 进入 发送邮件是不是有了…

MyBatisPlus代码生成器使用

MybatisPlus特点 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有工程产生影响&#xff0c;如丝般顺滑 损耗小&#xff1a;启动即会自动注入基本 CURD&#xff0c;性能基本无损耗&#xff0c;直接面向对象操作 强大的 CRUD 操作&#xff1a;内置通用 Mappe…

Java8新特性函数式编程 - Lambda、Stream流、Optional

1.Lambda表达式 1.1 概述 ​ Lambda是JDK8中一个语法糖。他可以对某些匿名内部类的写法进行简化。它是函数式编程思想的一个重要体现。让我们不用关注是什么对象。而是更关注我们对数据进行了什么操作。 1.2 核心原则 可推导可省略 1.3 基本格式 (参数列表)->{代码}例一…

mvn help:effective-pom命令的作用

无论 POM 文件中是否显示的声明&#xff0c;所有的 POM 均继承自一个父 POM&#xff0c;这个父 POM 被称为 Super POM。在pom的继承关系中&#xff0c;子pom可以覆盖父pom中的配置&#xff1b;如果子pom没有覆盖&#xff0c;那么父pom中的配置将会被继承。按照这个规则&#xf…

ChatGLM的搭建过程

本次搭建的是清华大学开源的ChatGLM。源码地址。模型地址。 1、开启BBR加速 如何开启BBR加速可以去看我的这篇文章&#xff0c;Linux开启内核BBR加速。 2、拉取ChatGLM源码和ChatGLM模型 点击这里跳转到源码处。 点击这里跳转到模型下载处。 我这里在下载之前创建了一个目…

大厂都用DevOps!十分钟带你了解自动化在DevOps中的运用

Hi&#xff0c;大家好。DevOps、CI/CD、Docker、Kubernetes……好像全世界都在谈论这些技术&#xff0c;以至于你觉得即将到达NoOps阶段。别担心&#xff0c;在工具和各种最佳实践的浩瀚海洋中感到迷失是正常的&#xff0c;是时候让我们来分析一下DevOps到底是什么了。 一、De…