基于51单片机的简易密码锁

2023-05-16

一个基于51单片机的简易密码锁,废话不多说,直接贴图贴代码

1.电路图
在这里插入图片描述
电路组成:5V电源+51单片机最小系统+LCD1602显示屏+4*4矩阵键盘

2.程序分析
(1)LCD1602驱动程序

#include "1602.h"
#include "delay.h"

#define CHECK_BUSY

sbit RS = P2^4;   //定义端口 
sbit RW = P2^5;
sbit EN = P2^6;

#define RS_CLR RS=0 
#define RS_SET RS=1

#define RW_CLR RW=0 
#define RW_SET RW=1 

#define EN_CLR EN=0
#define EN_SET EN=1

#define DataPort P0

/*------------------------------------------------
              判忙函数
------------------------------------------------*/
 bit LCD_Check_Busy(void) 
 { 
	#ifdef CHECK_BUSY
	DataPort= 0xFF; 
 	RS_CLR; 
 	RW_SET; 
 	EN_CLR; 
 	_nop_(); 
 	EN_SET;
 	return (bit)(DataPort & 0x80);
	#else
 	return 0;
	#endif
 }
/*------------------------------------------------
              写入命令函数
------------------------------------------------*/
 void LCD_Write_Com(unsigned char com) 
 {  
	 while(LCD_Check_Busy()); //忙则等待
 	 RS_CLR; 
	 RW_CLR; 
	 EN_SET; 
	 DataPort= com; 
 	_nop_(); 
 	EN_CLR;
 }
/*------------------------------------------------
              写入数据函数
------------------------------------------------*/
 void LCD_Write_Data(unsigned char Data) 
 { 
 	while(LCD_Check_Busy()); //忙则等待
 	RS_SET; 
	RW_CLR; 
 	EN_SET; 
 	DataPort= Data; 
 	_nop_();
 	EN_CLR;
 }

/*------------------------------------------------
                清屏函数
------------------------------------------------*/
 void LCD_Clear(void) 
 { 
 	LCD_Write_Com(0x01); 
	 DelayMs(5);
 }
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
 void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
 {         
 	while (*s) 
 	{     
		 LCD_Write_Char(x,y,*s);     
 		s ++;  x++;   
 	}
 }
/*------------------------------------------------
              写入字符函数
------------------------------------------------*/
void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) 
 {     
	if (y == 0) 
 	{     
 		LCD_Write_Com(0x80 + x);     
 	}    
	 else 
 	{     
 		LCD_Write_Com(0xC0 + x);     
 	}        
 	LCD_Write_Data( Data);  
 }
/*------------------------------------------------
              初始化函数
------------------------------------------------*/
 void LCD_Init(void) 
 {
   LCD_Write_Com(0x38);    /*显示模式设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38); 
   DelayMs(5); 
   LCD_Write_Com(0x38);  
   LCD_Write_Com(0x08);    /*显示关闭*/ 
   LCD_Write_Com(0x01);    /*显示清屏*/ 
   LCD_Write_Com(0x06);    /*显示光标移动设置*/ 
   DelayMs(5); 
   LCD_Write_Com(0x0C);    /*显示开及光标设置*/
  }   

(2)4*4矩阵键盘驱动程序

#define KeyPort P1

/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
unsigned char KeyScan(void)  //键盘扫描函数,使用行列反转扫描法
{
 	unsigned char cord_h,cord_l;//行列值中间变量
 	KeyPort=0x0f;            //行线输出全为0
 	cord_h=KeyPort&0x0f;     //读入列线值
 	if(cord_h!=0x0f)    //先检测有无按键按下
 	{
  		DelayMs(10);        //去抖
  		if((KeyPort&0x0f)!=0x0f)
  		{
    			cord_h=KeyPort&0x0f;  //读入列线值
    			KeyPort=cord_h|0xf0;  //输出当前列线值
    			cord_l=KeyPort&0xf0;  //读入行线值
    			while((KeyPort&0xf0)!=0xf0);//等待松开并输出
    			return(cord_h+cord_l);//键盘最后组合码值
   		}
  	}
  	return(0xff);     //返回该值
}
/*------------------------------------------------
按键值处理函数,返回扫键值
------------------------------------------------*/
unsigned char KeyPro(void)
{
 switch(KeyScan())
 {
  case 0x7e:return 0;break;//0 按下相应的键显示相对应的码值
  case 0x7d:return 1;break;//1
  case 0x7b:return 2;break;//2
  case 0x77:return 3;break;//3
  case 0xbe:return 4;break;//4
  case 0xbd:return 5;break;//5
  case 0xbb:return 6;break;//6
  case 0xb7:return 7;break;//7
  case 0xde:return 8;break;//8
  case 0xdd:return 9;break;//9
  case 0xdb:return 10;break;//a
  case 0xd7:return 11;break;//b
  case 0xee:return 12;break;//c
  case 0xed:return 13;break;//d
  case 0xeb:return 14;break;//e
  case 0xe7:return 15;break;//f
  default:return 0xff;break;
 }
}

(3)主程序

main()
{
 unsigned char num,i,j;                  
 unsigned char passwordtemp[16];        //最大输入16个
 unsigned char inputtimes;              //密码输入错误次数
 unsigned char passwordlength,PLEN;     //输入密码长度,实际密码长度
 bit Flag;
 PLEN=sizeof(password)/sizeof(password[0]);//用于计算出实际密码长度
 
 LCD_Init();         //初始化液晶屏
 DelayMs(10);        //延时用于稳定,可以去掉
 LCD_Clear();        //清屏
 LCD_Write_String(0,0,"  Welcome! ");    //写入第一行信息,主循环中不再更改此信息,所以在while之前写入
 LCD_Write_String(0,1,"Input password!");    //写入第二行信息,提示输入密码
 while (1)         //主循环
 {
 	num=KeyPro();  //扫描键盘
 	if(num!=0xff)  //如果扫描是按键有效值则进行处理
   	{ 
    		if(i==0)    //输入是第一个字符的时候需要把改行清空,方便观看密码
	  	LCD_Write_String(0,1,"                ");//清除该行
		if(i<16)
	  	{
       		passwordtemp[i]=num;
       		LCD_Write_Char(i,1,'*');//输入的密码用"*"代替
	   	}
		i++;   //输入数值累加
		if((15==num)|| (i==16))//输入按键值15或者密码输入到最大值16,表示输入结束,需要进行比对
	 	{
      		passwordlength=i-1;  //计算输入密码长度
	  		i=0;  //计数器复位
	  		if(passwordlength==PLEN)//长度相等则比较,否则直接输出错误
	    	{
	     		Flag=1;//先把比较位置1
	     		for(j=0;j<PLEN;j++)//循环比较8个数值,如果有一个不等 则最终Flag值为0
	        		Flag=Flag&&(passwordtemp[j]==password[j]);//比较输入值和已有密码
         	}
      		if(Flag)//如果比较全部相同,标志位置1
	   		{
	    		LCD_Write_String(0,1,"                ");//清除该行
        		LCD_Write_String(0,1,"Right Open!>>>>");//密码正确显示的信息
        		inputtimes=0;//输入正确则次数清零,重新计数
        		Flag=0;      //清除正确标志
			}
	  		else 
	    	{
				LCD_Write_String(0,1,"                ");//清除该行
				LCD_Write_String(0,1,"Wrong! Retry!");//密码错误,提示重新输入
				inputtimes++;//连续输入错误,则次数累加
				if(inputtimes==3)
		 		 {
		   			LCD_Write_String(0,1,"                ");//清除该行
		   			LCD_Write_String(0,1,"Wrong 3 times!");//密码错误,提示重新输入
		   			while(1);//停止该位置,重启电源后才能输入,实际实用中则需要等到一定时间后才能再次输入。
		  		 }
			}
	  	}
    }	
  }
}

源码+AD电路图 下载:关注公众号,首页回复“电子密码锁”获取资料
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于51单片机的简易密码锁 的相关文章

  • leetcode 第74题 搜索二维矩阵

    题目 编写一个高效的算法来判断 m x n 矩阵中 xff0c 是否存在一个目标值 该矩阵具有如下特性 xff1a 每行中的整数从左到右按升序排列 每行的第一个整数大于前一行的最后一个整数 示例1 输入 xff1a matrix 61 1
  • leetcode 第78题 子集

    题目 给你一个整数数组 nums xff0c 数组中的元素 互不相同 返回该数组所有可能的子集 xff08 幂集 xff09 解集 不能 包含重复的子集 你可以按 任意顺序 返回解集 示例1 输入 xff1a nums 61 1 2 3 输
  • 【设计模式】工厂模式&建造者模式

    工厂模式 xff1a 重点在于生产不同的产品出来 xff0c 比如车厂建造小汽车和大卡车 建造者模式 xff1a 重点在于建造过程 xff0c 比如小汽车建造时需要安装底盘 轮胎 方向盘 发动机和外壳 xff0c 最后生成小汽车 有一篇讲的
  • Ubuntu下查看所有登陆用户及其进程id

    Ubuntu下用top能够显示当前有多少个用户登陆 xff0c 如果发现有多个用户想要确定是否有不正常登陆的时候 xff0c 可以用who命令查看当前所有登陆用户以及其登陆时间和ip地址 如果发现确实有不正常登陆的时候 xff0c 可以用w
  • jsp报Syntax error, insert "}" to complete MethodBody错误

    用myeclipse写jsp xff0c 发现了如标题的错误 xff0c 而且是报在第一行 xff0c 第一行根本就没有 xff0c 何来的缺少 心中暗骂估计又是myeclipse抽风了 到网上一搜 xff0c 发现是jsp文件中有oncl
  • Linux中“没有可用的软件包XX,但是它被其他软件包引用”的解决方法

    踩坑经历 今天刚在虚拟机上安装好了ubuntu系统 xff0c 在执行sudo apt install net tools 命令时报错 没有可用的软件包net tools xff0c 但是它被其他软件包引用 解决方法 执行命令 sudo a
  • 元学习、迁移学习、对比学习、自监督学习与少样本学习的关系解读

    文章目录 前言一 对比自监督学习与FSL1 对比学习与自监督学习2 自监督学习与FSL 二 元学习与FSL1 元学习是什么2 元学习与FSL 三 迁移学习与FSL1 迁移学习2 迁移学习与FSL 总结 前言 本人的研究方向是少样本图像分类
  • DPPO:Distributed Proximal Policy Optimization

    DPPO xff1a Distributed Proximal Policy Optimization 分布式近端策略优化 xff0c 因为就是PPO的分布式实现 xff0c 整条的架构和A3C差不多 xff0c 一个主网络 xff0c N
  • VNC启动报错A VNC server is already running as :10

    报错 xff1a A VNC server is already running as 2 解决 xff1a usr sbin lsof i tcp 5902 然后kill了 xff0c 再重启
  • XManager5基于gdm连接centos图形界面

    centos6 参考了很多资料 花了几个钟终于把XManager连接centos搞定 第一步 如果是新装的linux centos7 xff0c 需要先配置好yum xff0c 执行命令 xff1a cd etc yum repos d r
  • 初级算法学习步骤

    前言 零散整理一个多月终于整理完了 这是一篇初级算法学习的步骤总结 xff0c 或许可以帮助你怎么去接触算法 阅读本文需要一定java语法基础和api文档查看基础 xff0c 但算法其实看重的是思想而不是语言 xff0c 所以都可以借鉴 本
  • Hadoop学习笔记:(一)WordCount运行

    前言 xff1a 本文是在hadoop已经配置好的情况下 WordCount是hadoop下的HelloWorld程序 xff0c 是初学者必须要会的 下面是用eclipse进行开发 一 工程与MapReduce代码 新建工程 xff0c
  • 乌班图18.04搭建ssh服务器

    一 首先打开终端 xff0c 在终端输入以下命令安装 openssh server 如下图所示 xff1a sudo apt get install openssh server 二 安装完成以后 xff0c 启动ssh服务 xff0c 输
  • keil无法生成axf文件之解决方法

    参考 xff1a 参考 鱼鹰单片机 https blog csdn net weixin 42876465 article details 88356890 其实很简单 默认情况是生成 axf 文件的 xff0c 但有可能不能生成该文件 生
  • 用vnc实现windows远程连接linux桌面

    网络遥控技术是指由一部计算机 xff08 主控端 xff09 去控制另一部计算机 xff08 被控端 xff09 xff0c 而且当主控端在控制端时 xff0c 就如同用户亲自坐在被控端前操作一样 xff0c 可以执行被控端的应用程序 xf
  • linux find typelinux find用法(转)

    由于 find 具有健壮的功效 xff0c 所以它的选项也很多 xff0c 其中大局限选项都值得我们花时间来剖析一下 尽管体例中含有网络文件体例 NFS xff0c find 命令在该文件体例中异样有用 xff0c 只你具有相应的权限 在运
  • Find 命令之 exec 的诠释

    find是我们很常用的一个Linux命令 xff0c 但是我们一般查找出来的并不仅仅是看看而已 xff0c 还会有进一步的操作 xff0c 这个时候exec的作用就显现出来了 e xec解释 xff1a exec 参数后面跟的是 comma
  • AI深度学习模型被“骗”,研究者如何对抗攻击?

    作者 埼玉 编辑 3D视觉开发者社区 如果觉得文章内容不错 xff0c 别忘了三连支持下哦 x1f618 文章目录 我们的模型被 骗 了什么是对抗技术 xff1f 对抗攻击的方法1 FGSM Fast gradient sign metho
  • “Additional information: 您必须有许可证才能使用此 ActiveX 控件”的错误解决方法

    昨天把项目的ArcGIS从9 3升级为10 1 早上到公司 xff0c 准备提交工程代码 xff0c 编译 通过 xff0c 但运行报错 错误信息 xff1a 原本以为是自己清理中间文件导致的 xff0c 但是找来找去 xff0c 没有任何
  • ssh配合vscode免密码登陆

    整体流程 xff1a 1 在本机创建公钥和私钥 2 在本地 ssh config文件中 xff0c 设置IdentifyFile为私钥地址 3 将公钥上传到服务器 下面是每一步的详解 xff1a 1 在本机创建公钥和私钥 xff1a 在命令

随机推荐

  • Debian查看系统版本信息

    下一代 Debian 正式发行版的代号为 34 buster 34 发布时间尚未确定 Debian 9 xff08 34 stretch 34 xff09 当前的稳定版 Debian 8 xff08 34 jessie 34 xff09 被
  • Oracle 索引 index

    一 索引的概念 索引是数据库对象 xff0c 通过使用快速路径访问方法快速定位数据 xff0c 减少了磁盘的I O xff0c 用来加速对表的查询速度 相当于书本的目录 与表独立存放 xff0c 但需要依附于表 xff0c 是在表的基础上创
  • HX711使用教程-数字电子秤常用芯片

    1 简介 HX711是一款专为高精度称重传感器而设计的24位A D转换器芯片 与同类型其它芯片相比 xff0c 该芯片是专门为称重传感器设计的 xff0c 称重传感器只需要一个HX711芯片即可完成称重信号的处理及AD转换 xff1b 对于
  • 详解LCD1602液晶显示屏的使用

    1 简介 作为各类单片机实物设计的常用显示屏 xff0c LCD1602是一种专门用于显示字母 数字 符号等点阵式LCD xff0c 其1602是指LCD显示的内容为16X2 xff0c 即可以显示两行 xff0c 每行16个字符 xff0
  • AS608指纹模块开发教程

    一 xff0e 简介 AS608 指纹识别模块主要是指采用了杭州晟元芯片技术有限公司 Synochip 的 AS608 指纹识别芯片 而做成的指纹模块 xff0c 模块厂商只是基于该芯片设计外围电路 xff0c 集成一个可供2次开发的指纹模
  • 51单片机串口通讯详解

    串口 xff0c 作为单片机程序开发中最常用 最方便 xff0c 也是应用最广泛的程序调试方法 xff1b 无论是作为调试工具 xff0c 打印出调试信息 xff0c 还是对功能模块进行通信 xff0c 串口是每个单片机开发人员最常用的单片
  • 记录一次用VNC Server配置window电脑远程访问,并在另一台电脑上外网访问远程桌面

    记录一次用VNC Server配置window电脑远程访问 xff0c 并在另一台电脑上外网访问远程桌面 有一台window和macbook 平时带着macbook出门办公 xff08 轻便 xff0c 不用带充电线 xff09 xff0c
  • 数模转换器ADC0832使用原理及控制程序

    一 xff0e 简介 数模转换器一般分为两种 xff0c 一种为数字信号转模拟信号 xff0c xff0c 其控制器简称为DAC xff1b 另一种为模拟信号转数字信号 xff0c 其控制器简称为ADC 现在主要介绍一款很常用 入门级的AD
  • GY-30光强传感器模块的应用原理及控制程序

    1 模块介绍 GY 30模块是一款基于IIC通信的16bit的数字型传感器 模块主要是以BH1750数字型光强感应芯片为核心及一些外围驱动电路 模块整体电路如图 xff1a 其中C1 C2 为电源滤波电容 xff0c R1 R3 为 I2C
  • LED数码管结构与工作原理

    一 xff0e 什么是数码管 LED数码管 xff08 LED Segment Displays xff09 是由8个发光二极管构成 xff0c 并按照一定的图形及排列封转在一起的显示器件 其中7个LED构成7笔字形 xff0c 1个LED
  • AD在PCB设计中导入LOGO

    在设计电路板有时需要将个人或公司的LOGO印在电路板上 xff0c 所以Altium Designer软件也提供了一个导入LOGO图案的插件 LOGO CREATOR 1 制作LOGO 因为印在电路板只能印出单色图案 xff0c 所以先得将
  • 详解LCD12864显示屏的使用(并行控制)

    一 xff0e 概述 LCD12864显示屏是所说的点阵液晶显示模块 xff0c 就是由12864个液晶显示点组成的一个128列64行的阵列 xff0c 所以也就叫成了12864 每个显示点都对应着有一位二进制数 xff0c 0表示灭 xf
  • DS18B20温度传感器-51单片机控制程序

    一 xff0e 概述 DS18B20数字温度传感器提供9 Bit到12 Bit的摄氏温度测量精度和一个用户可编程的非易失性且具有过温和低温触发报警的报警功能 DS18B20采用的1 Wire通信即仅采用一个数据线 xff08 以及地 xff
  • 详解数据存储芯片AT24C02的应用及编程

    一 xff0e 芯片简介 AT24C02是一个2K位串行CMOS E2PROM xff0c 内部含有256个8位字节 xff0c 采用先进CMOS技术实质上减少了器件的功耗 AT24C02有一个8字节页写缓冲器 xff0c 该器件通过IIC
  • 谈谈单片机的最小运行环境--最小系统

    单片机的最小系统就是让单片机能正常工作并发挥其功能时所必须的组成部分 xff0c 也可理解为单片机正常运行的最小环境 其主要构成为四部分 xff1a 1 单片机芯片 2 系统电源 3 时钟电路 4 复位电路 这四个部分不可缺少 xff0c
  • 详解温度传感器DS18B20编程与使用

    DS18B20是由DALLAS半导体公司推出的一种的 一线总线 接口的温度传感器 与传统的热敏电阻等测温元件相比 xff0c 它是一种新型的体积小 适用电压宽 与微处理器接口简单的数字化温度传感器 1 测量温度范围 55 43 125 2
  • AD10 如何将焊盘的实心改为十字型覆铜

    焊盘实心覆铜虽然有利于电流的传输 但由于焊盘周围都覆上铜皮 对焊锡有粘附作用 不利于元器件拆除 对往后板卡调试造成不便 所以焊盘在覆铜的时候建议采用十字型覆铜 xff0c 过孔采用实心覆铜 接下来就讲解一下AD10如何设置焊盘十字覆铜 xf
  • 相机参数标定(camera calibration)及标定结果如何使用

    重要更新 xff1a 本文的第二次更新已发布 为了不破坏现有内容的结构 xff0c 故重新开始新的一篇文章 同时本文的一些内容也会涵盖进去 欢迎关注 第二更 xff0c 相机参数标定基础 xff1a 从小孔成像开始到单双目标定 关于实践部分
  • 基于51单片机的LCD1602电子时钟

    摘要 xff1a 51系列单片机是各单片机中最为典型和最有代表性的一种 由RAM ROM CPU构成 xff0c 定时 xff0c 计数和多种接口于一体的微控制器 本次设计的数字电子时钟采用了STC89C52芯片进行控制 xff0c 使用D
  • 基于51单片机的简易密码锁

    一个基于51单片机的简易密码锁 xff0c 废话不多说 xff0c 直接贴图贴代码 1 电路图 电路组成 xff1a 5V电源 43 51单片机最小系统 43 LCD1602显示屏 43 4 4矩阵键盘 2 程序分析 xff08 1 xff