基于51单片机密码锁(修改密码,串口上锁解锁,仿真)

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、仿真图

二、步骤

1.矩阵按键

2.串口配置

3.串口接收数据判断

4.修改密码+密码输入

总结


前言

LCD1602+矩阵按键+串口上锁解锁+修改密码  提供参考

一、仿真图

51单片机密码锁怎么修改密码,单片机,嵌入式硬件,c#

二、步骤

1.矩阵按键

代码如下:

unsigned char MatrixKey()
{
    unsigned char KeyNumber=0;
    
    P7=0xFF;
    P70=0;
    if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=1;}
    if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=5;}
    if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=9;}
    if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=13;}
    
    P7=0xFF;
    P71=0;
    if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=2;}
    if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=6;}
    if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=10;}
    if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=14;}
    
    P7=0xFF;
    P72=0;
    if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=3;}
    if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=7;}
    if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=11;}
    if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=15;}
    
    P7=0xFF;
    P73=0;
    if(P74==0){Delay(20);while(P74==0);Delay(20);KeyNumber=4;}
    if(P75==0){Delay(20);while(P75==0);Delay(20);KeyNumber=8;}
    if(P76==0){Delay(20);while(P76==0);Delay(20);KeyNumber=12;}
    if(P77==0){Delay(20);while(P77==0);Delay(20);KeyNumber=16;}
    
    return KeyNumber;
}

2.串口配置

代码如下(示例):

/**
  * @brief  串口初始化,4800bps@12.000MHz
  * @param  无
  * @retval 无
  */
void Uart_Init(void)
{
    SCON = 0X50;
    AUXR |= 0X40;
    AUXR &= 0XFE;
    TMOD &= 0X0F;
    TL1 = 0XE0;
    TH1 = 0XFE;
    ET1 = 0;
    TR1 = 1;
    ES = 1;
    EA = 1;
}

/**
  * @brief  串口发送一个字节数据
  * @param  Byte 要发送的一个字节数据
  * @retval 无
  */
void UART_SendByte(unsigned char Byte)
{
    SBUF=Byte;
    while(TI==0);
    TI=0;
}

3.串口接收数据判断

这里把判断拿出来不放在串口中断中是因为LCD显示函数放在里面会造成函数重进入,具体是什么原因网上找了会资料也没解决所以我就把判断给拿出来单独弄了一个函数。文章来源地址https://www.toymoban.com/news/detail-551199.html

void Uart1_isr(void) interrupt 4
{
	if(RI)
	{
		RI = 0;
		LCD_clar();//清屏
		temp = SBUF;
		
	}
}

/**
   * @brief  串口判断函数
   * @param  上锁:0x01  解锁:0x02
   * @retval 
   */
void Uart_Control() 
{
	if(temp == 0x01)//串口值判断
	{
		temp = 0;
		LCD_ShowString(1,1,"Locking!");//锁定
		flag = 1;
	}
	if(temp == 0x02)//串口值判断
	{
		temp = 0;
		LCD_ShowString(1,1,"Password:");//解锁
		flag = 0;
	}
}

4.修改密码+密码输入

if(KeyNum)
		{
			if(flag == 0)
			{
				if(KeyNum<=10)	//如果S1~S10按键按下,输入密码
				{
					if(Count<4)	//如果输入次数小于4
					{
						Password*=10;				//密码左移一位
						Password+=KeyNum%10;		//获取一位密码
						Count++;	//计次加一
						Password_Data++;
					}
					LCD_ShowString(2,Password_Data,"*");	//更新显示
				}
				if(KeyNum==11)	//如果S11按键按下,确认
				{
					if( Change_flag == 0) //没修改密码之前此标志位一直为0 修改密码之后此标志位为1 进入另外一个判断
					{
						if(Password==2345)	//如果密码等于正确密码
						{
							LCD_ShowString(1,14,"OK ");	//显示OK
							Password=0;		//密码清零
							Count=0;		//计次清零
							Password_Data=0;
							LCD1602_Clear_2LINE(); //清除第2行
							for(i = 0;i < 1; i++) //蜂鸣器
							{
								P22 = 0;
								Delay(500);
								P22 = 1;
								Delay(1000);
							}
						}
						else				//否则
						{
							LCD_ShowString(1,14,"ERR");	//显示ERR
							Password=0;		//密码清零
							Count=0;		//计次清零
							LCD1602_Clear_2LINE(); //清除第2行
							Password_Data=0;
							for(i = 0;i < 3; i++)//蜂鸣器
							{
								P22 = 0;
								Delay(500);
								P22 = 1;
								Delay(1000);
							}
						}
					}
					if( Change_flag == 1 ) //修改密码之后为1 进入此判断
					{
						if(Password==Password1)	//如果密码等于正确密码
						{
							LCD_ShowString(1,14,"OK ");	//显示OK
							Password=0;		//密码清零
							Count=0;		//计次清零
							Password_Data=0;
							LCD1602_Clear_2LINE(); //清除第2行
							for(i = 0;i < 1; i++) //蜂鸣器
							{
								P22 = 0;
								Delay(500);
								P22 = 1;
								Delay(1000);
							}
						}
						else				//否则
						{
							LCD_ShowString(1,14,"ERR");	//显示ERR
							Password=0;		//密码清零
							Count=0;		//计次清零
							LCD1602_Clear_2LINE(); //清除第2行
							Password_Data=0;
							for(i = 0;i < 3; i++)//蜂鸣器
							{
								P22 = 0;
								Delay(500);
								P22 = 1;
								Delay(1000);
							}
						}
					}
				}
				if(KeyNum==12)	//如果S12按键按下,取消
				{
					Password=0;		//密码清零
					Count=0;		//计次清零
					Password_Data=0;
					LCD1602_Clear_2LINE(); //清除第2行
				}
				if(KeyNum==14) //修改密码按键
				{
					LCD_clar();//清屏
					Password1=0;//新密码清除
					flag = 2; //修改密码标志位
				}
			}
			if(flag == 2) //修改密码标志位判断
			{
				LCD_ShowString(1,1,"Change Password:");	//更新显示
				if(KeyNum<=10)	//如果S1~S10按键按下,输入密码
				{
					if(Count1<4)	//如果输入次数小于4
					{
						Password1*=10;				//密码左移一位
						Password1+=KeyNum%10;		//获取一位密码
						Count1++;	//计次加一
						Password_Data++;//清除*号显示位置
					}
					LCD_ShowString(2,Password_Data,"*");	//更新显示
				}
				if(KeyNum==11)	//如果S11按键按下,确认
				{
					LCD_clar();//清屏
					Count1 = 0; //输入密码位数清除
					flag = 0; //输入密码标志位
					Password_Data = 0; //清除*号显示位置
					Change_flag = 1; //更新密码判断标志位
					LCD_ShowString(1,1,"Password:");//输入密码界面
				}
				if(KeyNum==12)	//如果S12按键按下,取消
				{
					Password1=0;		//密码清零
					Count1=0;		//计次清零
					Password_Data=0;//清除*号显示位置
					LCD1602_Clear_2LINE(); //清除第2行
				}
			}
			if(KeyNum==13) //上锁解锁
			{
				flag = !flag; //上锁解锁标志位
				if(flag==1)
				{
					LCD_clar();//清屏
					LCD_ShowString(1,1,"Locking!");//锁定
				}
				else
				{
					LCD_clar();//清屏
					LCD_ShowString(1,1,"Password:");//解锁
				}
			}
		}

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

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

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

相关文章

  • 基于51单片机的红外密码锁设计[proteus仿真]

    密码锁检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的红外密码锁设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥,私信阿目【112基于51单片机的红外密码锁设计】即可获取(看到消息会第一时

    2024年02月21日
    浏览(55)
  • 基于51单片机LCD1602的简易矩阵键盘密码锁

    初次开始写博客,表达方面也许会有很多不足,希望自己能通过这种方式巩固自己的学习和锻炼表达能力,同时也是对于自己学习的记录。 四位密码锁,密码可更改,输入仅四次以内有效 矩阵键盘定义为1-16,顺序为从左上到右下,1-10号为密码输入键位,对键码取余,输入

    2024年01月23日
    浏览(61)
  • 基于51单片机的简易6位密码锁(数码管 led 矩阵)

      本文章是基于51单片机的简易密码锁,无掉电保护,所以没有用到I^C总线协议,仅用到数码管显示,矩阵键盘扫描,led显示。   本例程主要实现功能为:定义一个六位数的初始密码,用矩阵输入,输入正确后led被点亮,错误不点亮;摁下任意一个按键蜂鸣器发出声音,松下

    2024年02月11日
    浏览(41)
  • 基于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日
    浏览(52)
  • 基于ATC89C51单片机的超市临时储物柜密码锁设计

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/87855870?spm=1001.2014.3001.5503 源码获取 摘 要 随着微机测量和控制技术的迅速发展与广泛应用,以单片机为核心的电子密码锁的设计研发与应用在很大程度上改善了人们的生活,尤其是在一些公共场合

    2024年02月08日
    浏览(44)
  • 基于AT89C51单片机的8位密码锁仿真与实物制作

    点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/88657969?spm=1001.2014.3001.5503 源码获取 C 源码+仿真图+毕业设计+实物制作步骤+01 摘要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的

    2024年01月23日
    浏览(47)
  • 51单片机-电子密码锁

    实物演示效果: https://www.bilibili.com/video/BV1xh4y1K7uV/?vd_source=6ff7cd03af95cd504b60511ef9373a1d 电子密码锁的主要功能 1.按键设置6位密码,输入密码若密码正确,则锁打开。显示open! 2.密码可以自己修改(6位密码),必须是锁打开时才能改密。为防止误操作,修改密码得输入两次。

    2024年01月17日
    浏览(46)
  • 51单片机制作简易密码锁

    51单片机期末考试设计题目 设计要求: 设计具有16个按键和1个数码管显示的密码锁,具体要求: 输入一位密码(为0~9,A~F之间的数字),密码输入正确显示“F”并将锁打开;否则显示“E”,继续保持锁定状态。 基本要求: 密码锁的基本功能如下:16个按键,分别代表数

    2024年02月11日
    浏览(49)
  • 51单片机简易电子密码锁

    由于作业需求,在昨天天晚上写了一个通过lcd1602,i2c,eeprom,按键,实现的可以设置密码的简易电子锁,    首先点击k15(回车键)进入  进入后可以点击0-9按键输入6位密码,错误则显示error,5s后重新显示密码输入页面,密码正确则进入。    进入后可以点击Esc键设置密码,进入设

    2024年02月02日
    浏览(47)
  • 51单片机“密码锁”代码详解

    注:此代码一经过验证,读者不必怀疑其正确性,如果烧录进去没有反应,请自行检查引脚端口配置,以及仔细分析代码实现原理。倘若能静下心来分析代码,一定能受益匪浅。 废话不多说,,直接上代码。如有问题,请下方评论并私信我,收到后一定及时回复!     功能

    2024年02月08日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包