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

news2024/9/24 1:20:30

点击链接获取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.

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

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

相关文章

类和对象中(1)

文章目录 一、类的6个默认成员函数二、构造函数1、概念2、构造函数只初始化自定义类型3、对于不会初始化内置类型的补丁4、构造函数优点 三、析构函数1、概念2、什么时候需要自己写析构函数 &#xff1f;3、构造和析构顺序差异 四、拷贝构造函数1、概念2、拷贝构造下传值会无限…

MySQL环境搭建——“MySQL数据库”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;好久没有更文啦&#xff0c;今天继续&#xff01;&#xff01;&#xff01;今天小雅兰的内容是MySQL环境搭建&#xff0c;下面&#xff0c;让我们进入MySQL数据库的世界吧 MySQL的卸载 MySQL的下载、安装、配置 M…

ubuntu18.04下pass-through直通realteck PCI设备到qemu-kvm虚拟机实践

设备直通是一种虚拟化资源分配方式&#xff0c;通过将物理设备直通给虚拟机环境&#xff0c;达到虚拟机可以直接访问物理设备的目的&#xff0c;直通功能对设备的要求不高&#xff0c;不需要设备支持PF/VF&#xff0c;18年后的普通家用PC的PCI设备都支持设备直通模式&#xff0…

【Java】Java对象的比较

Java对象的比较 PriorityQueue中插入对象元素的比较基本数据类型的比较对象的比较重写基类的equals方法基于Comparble接口类的比较基于比较器进行比较 PriorityQueue中插入对象 优先级队列在插入元素时有个要求&#xff1a;插入的元素不能是null或者元素之间必须要能够进行比较…

Redis持久化之AOF日志高频问题

1、如何采用AOF日志避免宕机丢失数据&#xff1f; Redis 的持久化主要有两大机制&#xff0c;即 AOF&#xff08;Append Only File&#xff09;日志和 RDB 快照。 MySQL数据库的写前日志&#xff08;Write Ahead Log, WAL&#xff09;&#xff0c;在实际写数据前&#xff0c;…

PWLCM分段线性混沌映射

混沌映射是生成混沌序列的一种方法,常见的混沌映射方式有 Logistic映射、Tent映射、Lorenz映射,而PWLCM&#xff08;Piecewise Linear Chaotic Map&#xff0c;分段线性混沌映射&#xff09;作为混沌映射的典型代表&#xff0c;数学形式简单&#xff0c;具有遍历性和随机性。其…

智能优化算法:基于减法平均的优化算法-附代码

智能优化算法&#xff1a;基于减法平均的优化算法 文章目录 智能优化算法&#xff1a;基于减法平均的优化算法1.基于减法平均优化算法1.1 初始化1.2 SABO的数学建模 2.实验结果3.参考文献4.Matlab 摘要&#xff1a;基于减法平均的优化算法&#xff08;Subtraction-Average-Base…

[数据结构] 二叉搜索树的详解实现

文章目录 概念实现架构BSTreeNodea&#xff08;节点&#xff09;BSTree框架 增删查 -- 循环写法insert&#xff08;尾插&#xff09;inOrder&#xff08;遍历&#xff09;Find&#xff08;查找&#xff09;Erase&#xff08;删除&#xff09;默认成员函数构造拷贝构造析构函数赋…

哈夫曼编码文件压缩和解压

哈夫曼编码&文件压缩和解压 文章目录 哈夫曼编码&文件压缩和解压哈夫曼编码基本介绍原理解析代码实现 文件的压缩文件的解压完整代码 哈夫曼编码 基本介绍 赫夫曼编码也翻译为 哈夫曼编码(Huffman Coding)&#xff0c;又称霍夫曼编码&#xff0c;是一种编码方式, 属于…

实现c++轻量级别websocket协议客户端

1 websocket 轻量客户端 因以前发过这个代码&#xff0c;但是一直没有整理&#xff0c;这次整理了一下&#xff0c;持续修改&#xff0c;主要是要使用在arm的linux上&#xff0c;发送接收的数据压缩成图片发送出去。 要达到轻量websocket 使用&#xff0c;必须要达到几个方面…

MySQL:数学函数和字符串函数

目录 前言&#xff1a; 数学函数&#xff1a; 求绝对值&#xff1a; 求PI&#xff1a; 求平方根&#xff1a; 求余数&#xff1a; 取整&#xff1a; 随机数&#xff1a; 四舍五入&#xff1a; 只舍不入&#xff1a; 返回参数符号&#xff1a; 幂运算&#xff1a; …

Illustrator如何编辑图形对象之实例演示?

文章目录 0.引言1.绘制海浪插画2.绘制时尚波浪发型3.绘制一条鲸鱼 0.引言 因科研等多场景需要进行绘图处理&#xff0c;笔者对Illustrator进行了学习&#xff0c;本文通过《Illustrator CC2018基础与实战》及其配套素材结合网上相关资料进行学习笔记总结&#xff0c;本文对图形…

快速上手Pytorch实现BERT,以及BERT后接CNN/LSTM

快速上手Pytorch实现BERT&#xff0c;以及BERT后接CNN/LSTM 本项目采用HuggingFace提供的工具实现BERT模型案例&#xff0c;并在BERT后接CNN、LSTM等 HuggingFace官网 一、实现BERT&#xff08;后接线性层&#xff09; 1.引用案例源码&#xff1a; from transformers impo…

开关电源基础01:电源变换器基础(2)

说在开头&#xff1a;关于德布罗意的电子波&#xff08;3&#xff09; 1923年&#xff0c;德布罗意在求出他的相波之前&#xff0c;康普顿刚好用光子说解释了康普顿效应&#xff08;记性好的胖友们应该还记得&#xff1a;散射波的波长变长问题&#xff09;&#xff0c;从而带领…

开关电源基础02:基本开关电源拓扑(2)-BOOST-BUCKBOOST拓扑

说在开头&#xff1a;关于海森堡的矩阵&#xff08;2&#xff09; 海森堡写完论文就回到了哥廷根大学&#xff0c;他一看见玻恩就把这份论文拿出来请老师把关&#xff0c;还说要趁着假期去趟英国剑桥大学讲课交流。玻恩拿过论文一看&#xff0c;海森堡画的这个表格是啥玩意啊&…

【操作系统】高性能网络模式:Reactor 和 Proactor

【操作系统】高性能网络模式&#xff1a;Reactor 和 Proactor 参考资料&#xff1a; 高性能 RPC 通信的实现- 巧用 reactor 模式 高性能网络模式&#xff1a;Reactor 和 Proactor NIO Reactor模型 Netty「基石」之Reactor模式 高性能IO模型分析-Reactor模式和Proactor模式 【…

【服务器】无公网IP,异地远程连接威联通NAS

Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 1. 威联通安装cpolar内网穿透 2. 内网穿透 2.1 创建隧道 2.2 测试公网远程访问 3. 配置固定二级子域名 3.1 保留二级子域名 3.2 配置二级子域名 4. 使用固定二级子…

Linux诊断原因:生产环境服务器变慢,诊断思路和性能评估

Linux诊断原因&#xff0c;生产环境服务器变慢&#xff0c;诊断思路和性能评估 1 整机&#xff1a;top&#xff0c;查看整机系统性能 使用top命令的话&#xff0c;重点关注的是 %CPU、%MEM 、load average 三个指标 load average三个指标&#xff1a;分别代表1、5、15时分钟系…

2022年NOC大赛编程马拉松赛道初赛图形化低年级A卷-正式卷,包含答案

目录 选择题: 下载文档打印做题: 2022年NOC大赛编程马拉松赛道【初赛】图形化低年级A卷-正式卷 2022NOC-图形化初赛低年级A卷正式卷 选择题: 1、答案:B 禾木是一个军事迷,他打算利用业余时间制作一款射击游戏。在游戏中,玩家可以通过鼠标控制手枪移动。请问,给手枪…

springboot+vue体质测试数据分析及可视化设计(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的体质测试数据分析及可视化设计。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&a…