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

这篇具有很好参考价值的文章主要介绍了基于AT89C51单片机的电子密码锁设计与仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

点击链接获取Keil源码与Project Backups仿真图:
https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503
基于AT89C51单片机的电子密码锁设计与仿真

源码获取
主要内容:
(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.硬件设计:
基于AT89C51单片机的电子密码锁设计与仿真

电子密码锁的结构框图如图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 控制端口。
基于AT89C51单片机的电子密码锁设计与仿真

开锁成功的仿真结果
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”,表示开锁失败,相应的指示灯也点亮。
仿真结果图如下所示:

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

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.文章来源地址https://www.toymoban.com/news/detail-435887.html

到了这里,关于基于AT89C51单片机的电子密码锁设计与仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于AT89C51单片机的电子计数器设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87770826 源码获取 主要内容: 设计一个电子计时器,数码管初始显示值为“00”,每隔1s电子秒表加1;秒计数到60时清0,并从00重新开始。 基本要求: 1、电子定时器电路设计图; 2、电子定时器设

    2024年02月15日
    浏览(57)
  • 基于AT89C51单片机的电子密码锁设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87760996?spm=1001.2014.3001.5503 源码获取 主要内容: (1)本设计为了防止密码被窃取要求在输入密码时在LCD屏幕上显示*号。 (2)设计开锁密码位六位密码的电子密码锁。 (3)能够LCD显示在密码正确

    2024年02月03日
    浏览(51)
  • 基于 AT89C51 单片机的数字时钟设计

    目录 1.设计目的、作用 2.设计要求 3.设计的具体实现 3.1 设计原理 3.2 硬件系统设计         3.2.1 AT89C51 单片机原理 3.2.2 晶振电路设计 3.2.3 复位电路设计 3.2.4 LED 数码管显示 3.3 系统实现 3.3.1 系统仿真与调试 3.3.2 演示结果 4.总结 附录 附录 1 附录 2 (1 )掌握 51 系列单片机的

    2024年02月01日
    浏览(62)
  • 基于AT89C51单片机的温度计设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87773445 源码获取 主要内容: 设计一个简易温度计;要求电路实现如下功能: 设计通过单片机和数码管、led灯等组成,可以显示温度,并且可以显示大于零度的温度和小于零度的温度,还可以超出

    2024年02月05日
    浏览(59)
  • 基于AT89C51单片机的交通灯设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87779238?spm=1001.2014.3001.5503 源码获取 主要内容: 在日常生活中,交通灯是一项必不可少的公共设施,可 以维护道路的畅通和交通的秩序。如若交通灯发生故障,那 么后果可想而知。因此,交通灯

    2024年02月08日
    浏览(58)
  • 基于AT89C51单片机的温度检测报警设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87777752?spm=1001.2014.3001.5503 源码获取 主要内容: 基于51单片机设计一个温度检测报警器,至少具有以下功能:温度的检测和超过设定值时的报警功能 基本要求: 1、功能齐全,要配有功能说明;

    2024年02月03日
    浏览(61)
  • 基于AT89C51单片机的倒数计时器设计

    1.设计任务 利用AT89C51单片机为核心控制元件,设计一个简易的数字电压表,设计的系统实用性强、操作简单,实现了智能化、数字化。 本设计采用单片机为主控芯片,结合 周边 电路组成 LED 彩灯的 闪烁 控制系统器,用来控制 红色 的LED 闪烁 发光,实现 LED灯在倒计时结束后

    2024年02月03日
    浏览(64)
  • 基于AT89C51单片机的简易计算机设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87715642?spm=1001.2014.3001.5503 源码获取 主要内容: 本设计是以单片机AT89C51为核心的简易计算器设计,要通过芯片AT89C51实现计算器程序运行来完成加、减、乘和除的简单计算功能。 基本要求: 1、采

    2024年02月08日
    浏览(54)
  • 基于AT89C51单片机的交通灯设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87763760?spm=1001.2014.3001.5503 源码获取 主要内容: 设计一个能够控制十二盏交通信号灯的模拟系统,:利用单片机的定时器定时,令十字路口的红绿灯交替点亮和熄灭,并用LED灯显示倒计时间。 基本要

    2024年02月08日
    浏览(53)
  • 基于AT89C51单片机的计算器设计与仿真

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87759134?spm=1001.2014.3001.5503 源码获取 主要内容: 本次设计所提出的一种基于单片机技术的简易计算器的方案,能更好的解决计算机计算的问题,随着数字生活的到来,单片机在生活中越来越重要,它

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包