单片机电子密码锁电路图_51单片机电子密码锁程序加原理图 - CSDN
  • 关注【电子开发圈】微信公众号,一起学习吧! 电子DIY、Arduino、51单片机、STM32单片机、FPGA…… 电子百科、开发技术、职业经验、趣味知识、科技头条、设备拆机…… ...该密码锁是以STC89C...

    点击原文链接,获取本篇设计全部资料!

    https://mp.weixin.qq.com/s?__biz=MzU3OTczMzk5Mg==&mid=2247487291&idx=3&sn=105a33a2dacee6a3e852c9befae3e5f4&chksm=fd60dfbcca1756aa08a9170ed51f3ea76143eb72f38fbc01f6beb263d16bfa40946e64c26810&token=1005114409&lang=zh_CN#rd

    ———————————————————————————————————————

     

    该密码锁是以STC89C52单片机为核心,加上需要的硬件部分,实现密码的设定、保存、检测,从而控制电路的闭合是否进行开锁的决定。单片机通过用户输入的密码,转化成键码,与保存在24C02芯片中的密码进行比较,本次设定的初始密码为六位密码,这就可以有300多万组密码可以更改和选择,安全性大大的增加,可选密码组是连续排列的,输入的密码正确,继电器吸和,二极管发光,代表着密码锁开启;如果密码输入不正确,则由蜂鸣器发出报警信号,多次错误会锁定键盘,直到再次复位才能使用。

     

     

    密码锁主要由单片机、键盘、外部硬件等器件构成。这里面矩阵键盘的作用是用户输入密码,修改密码等。本次设计用继电器代替电磁锁,实际使用时只要继电器变成电磁锁即可,当然也可以用继电器的常开触点去控制电磁铁吸合线圈,单片机将每次开锁操作和此时电磁执行器的驱动电流值作为状态信息发送给单片机的芯片处理,同时将接收来自无限循环的密码识别程序的报警信息也发送给智能报警器,从而使整个密码锁正常运行。

     

     

    电源电路提供的一个直流电压。由于单片机工作需要一个振荡频率,所以需要晶振电路来提供一个基准频率。复位电路是一种使电路恢复到起始状态的电路,这里是让单片机与其他部件都保持在一个特定的状态下,当供电后按下开关就会复位。键盘接口电路部分提供输入密码的功能。开锁电路顾名思义,当密码正确输入后,单片机会发出开锁请求,继电器吸和二极管发光代表着门成功打开。报警电路是密码输入错误时,蜂鸣器发出声响报警。

     

    通过键盘扫描模块,既可以显示密码又能够修改密码,通过键盘扫描模块将密码输入到STC89C52单片机中,通过LCD显示器将我们需要的数据显示出来。该系统还拥有掉电存储,报警等功能,掉电存储可以增加密码锁的实用性。报警模块部分,当我们输入的密码正确时,密码锁开锁,显示模块的灯会亮,当我们输入的密码错误时,则会由蜂鸣器发出报警音,提示错误。

     

    1 硬件电路设计

    1.1 主控制模块

    单片机最小系统包括单片机、复位电路、时钟电路构成。STC89C52 单片机的工作电压范围:4V-5.5V,所以通常给单片机外界5V直流电源。

     

     

    单片机最小系统包括单片机、复位电路、时钟电路构成。单片机最小系统就是指能使单片机正常工作的最低配置。

     

    1.2 键盘电路

    键盘需要通过接口电路和CPU相连接,CPU可以采用查询接口或者中断的方式来判断用户是否使用键盘,然后确定使用的键是在什么位置。无论是查询方式还是中断方式都要用到单片机的I/O口。因为矩阵键盘相比于独立键盘占用更少的I/O口,所以在需要使用多个键的时候,一般采用矩阵键盘的方式来实现多按键的功能。本系统采用4*4矩阵式键盘,键盘连接方式如图所示:

     

     

    1.3 液晶显示电路

    LCD1602作为一种字符型液晶显示器,它是一种点阵式液晶显示器,它是专门用于显示字母、数字、符号等的。LCD1602的显示容量为16*2个字符(既每行16个字符,共计两列),LCD的芯片工作电压在4.5~5.5V之间,工作电流为2.0mA(5.0V),模块的最佳工作电压为5.0V。另外需要注意的是,LCD显示器要想正常的工作,必须提供足够的电流,所以,在本次设计中,为了保证LCD正常显示,在数据端口上加了一个电阻,来保证顺利进行。本设计采用液晶显示屏LCD进行显示,具体连接方式如图所示。

     

     

    1.4 存储芯片电路

    AT24C02的工作电压在1.8V~5.5V之间,输入/输出引脚兼容5V。AT24C02是二线串型接口,支持硬件写保护,具有高保护性,读写次数高达100万次,数据可以保存100年。E1~E3作为器件地址选择端口,这本次设计中,全部接地。VCC可以接入1.8V~6.0V的工作电压,这里接入5V电压。VSS接地端,这里接入电源负极。WP是专门写保护的端口,当WP=1时,只能读取,不能写入,当WE=0时才可以进行正常的读写功能。SCL是串行时钟输入端,SDA是串行数据、地址线,用于传送和接受数据,是一个双向的端口。P2.5为串行时钟输入线接口,P2.6为数据线接口。A0,A1,A2接地,所以单片机在读AT24C02时,器件地址为:10100001B=0A1H;在写AT24C02时,器件地址为:10100000B=0A0H。WP=0,允许单片机进行读写操作。

     

    AT24C02系列是典型的I2C串行总线的EEPROM,本系统采用此芯片进行数据存储,存储系统连接如图所示:

     

     

    1.5 报警电路

    本次设计中,报警部分由蜂鸣器及外围电路组成,通过控制蜂鸣器发声来实现报警的功能。蜂鸣器是一种采用直流电压供电的电子讯响器,当P3.7口有脉冲信号输入时,蜂鸣器即会发音。通过控制输入脉冲的频率还能控制蜂鸣器的发音频率。如图所示。

     

     

    1.6 密码锁电路

    在单片机密码锁中,输入正确的密码,锁就会打开。本次设计降低成本不用电磁锁,用继电器和二极管来替代。当密码输入正确时,灯亮起,继电器吸和,象征着密码锁打开。所以用如图所示的电路代替电磁锁开锁机构。

     

     

    2 软件程序设计

    2.1 主程序流程图

     

     

    2.2 键盘扫描子程序

     

     

    2.3 显示模块子程序

     

     

    2.4 开锁子程序

     

     

    2.5 报警子程序

     

     

    2.6 掉电存储子程序

     

     

     

    在设计中我们必须首先熟悉和掌握单片机的结构及工作原理,单片机的接口技术及相关外围芯片的外特性,控制方法。以单片机核心的电路设计的基本方法和技术了解表关电路参数的计算方法。同时,学习使用单片机了解计算机原理与结构的最佳选择。 在本次设计中,所有的设计要求都得到了实现,可以在LCD显示器上以“*”形式显示密码,修改密码,掉电存储等功能也全都实现。再输入密码的过程中,可以清空密码、倒退,长时间不操作会有锁定密码锁的功能。

     

    展开全文
  • 设计课题:密码锁 目 录 选题背景 密码锁目的与意义 密码锁的原理 系统方案和总体结构 整体实验功能 硬件设计 实验仪器 电路原理 软件设计 程序设计流程 所用到的函数、功能和原理 硬...

    单片机课程设计
    设计课题:密码锁

    一上来不bb太多,提供所有文件下载地址。
    点击下载所有文件(汇编51单片机密码锁(含论文、程序、AD图)单片机课程设计)

    https://download.csdn.net/download/weixin_43237195/10949597

    在这里提醒一下,程序是百分百没有问题的,因为我课设的时候就是用这个做的,也测试了很久,最后才发出来的。如果烧录之后发现没反应,那就检查一下接线,看看那个pcb图,另外注意数码管、按键等原件是共阳还是共阴

    目 录
    选题背景
    密码锁目的与意义
    密码锁的原理
    系统方案和总体结构
    整体实验功能
    硬件设计
    实验仪器
    电路原理图
    软件设计
    程序设计流程图
    所用到的函数、功能和原理
    硬软件调试过程
    源程序代码

    选题背景
    密码锁目的与意义
    随着科学技术的不断发展,在人们的生活中人们对于安全防盗器件的要求高。传统的防盗不方便携 带,安全性都比较差,满足不了我们的日常生活,随着单片机的发展,在我们的日常生活中出现了很多电子密码锁,这些技术的发展使我们的安全性得到了显著的提高。单片机产生后,我们就将这些变为智能化,我们只需要在单片机外围接一点简单的接口电路,核心的部分只能由人为的写入程序来完成。电子密码锁可以在日常生活和现在办公来完成,在我们的住在和办公的环境中有些重要的文件和报表以及一些重要的个人资料的保存等很多场所需要使用。密码锁具有安全性高,成本低,低功耗,易操作等优点, 这样极大的提高了我们的安全性。人们对安全的重视和科学技术的发展,许多电子智能锁,例如指纹识别,IC识别等已出现在我们的生活中,这些产品的特点需要一个特别的指纹或有效卡,成本相对不高。针对当前的技术和水平,电子密码锁是这类电子防盗产品的主流。

    密码锁的原理
    密码锁的原密码存在单片机的某几个单元里,通过矩阵按键扫描输入的密码,若密码相同,锁打卡;否则,密码错误,蜂鸣器报警。
    若想改密码,先判断是否输入正确的原密码,后允许输入新的密码并显示在数码管上且替换储存原密码单元的数。

    系统方案和总体结构
    整体实验功能
    该密码锁完成的主要功能是当输入密码时,数码管只显示“-”,当密码位输入正确完毕按下确认键时,对输入的密码与设定的密码进行比较,若密码正确,则开锁,此处用LED发光二极管亮一秒钟做为提示。若密码不正确,禁止按键三秒,同时发出“嘀、嘀”报警声。密码锁的密码可以修改,若想改密码,先判断是否输入正确的原密码,后允许输入新的密码并显示在数码管上且替换储存原密码单元的数。

    硬件设计
    实验仪器
    1个蜂鸣器
    1个4×4矩阵按键
    1个51单片机最小系统
    2个LED灯
    8位数码管。

    电路原理图
    在这里插入图片描述

    软件设计
    程序设计流程图
    -在这里插入图片描述

    源程序代码

    ORG 0000H
    MOV P0,#00H
    MOV P2,#0FFH
    LJMP MAIN1
    ORG 0100H
    
    MAIN1:
    
    MOV 21H,#00H  //所有状态清零
    MOV 22H,#00H
    MOV 23H,#00H
    MOV 24H,#00H
    MOV 25H,#00H
    MOV 26H,#00H
    MOV 27H,#00H
    MOV 28H,#00H
    
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    
    MOV 71H,#00H
    MOV 72H,#00H
    MOV 73H,#00H
    MOV 74H,#00H
    MOV 75H,#00H
    MOV 76H,#00H
    MOV 77H,#00H
    MOV 78H,#00H
    
    MOV 33H,#00H
    MOV 50H,#00H
    
    MOV 21H,#06H  //设置初始密码
    MOV 22H,#03FH
    MOV 23H,#066H
    MOV 24H,#05BH
    MOV 25H,#06FH
    MOV 26H,#05BH
    MOV 27H,#066H
    MOV 28H,#066H
    
    
    MOV R0,#51H  //两个指针清零
    MOV R1,#71H
    
    MAIN:
    MOV 50H,#00H
    
    ACALL SAOMIAO
    MOV A,50H
    CJNE A,#00H,QWER  //判断是否有键盘输入
    LJMP QWER3
    
    QWER:
    CJNE A,#03H,QWER9  //判断是否要重置密码
    JB P2.7,ERERER  //判断当前是否为改密码的状态,二者之间跳转。其中p2.7为重置密码标志位,1:正常状态;0:修改密码状态
    MOV 33H,#00H
    SETB P2.7
    
    MOV R0,#51H  //状态置零
    MOV R1,#71H	
    	 
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    
    MOV 71H,#00H
    MOV 72H,#00H
    MOV 73H,#00H
    MOV 74H,#00H
    MOV 75H,#00H
    MOV 76H,#00H
    MOV 77H,#00H
    MOV 78H,#00H
    
    LJMP QWER3
    ERERER:
    MOV 33H,#0FFH  //33h中为0ffh则为改密码状态,00h不是改密码状态,此处与上面的p2.7相比有点多余。
    CLR P2.7
    
    MOV R0,#51H
    MOV R1,#71H
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    
    MOV 71H,#00H
    MOV 72H,#00H
    MOV 73H,#00H
    MOV 74H,#00H
    MOV 75H,#00H
    MOV 76H,#00H
    MOV 77H,#00H
    MOV 78H,#00H
    
    LJMP QWER3
    
    
    QWER9:
    CJNE A,#02H,QWER8  //判断是否按了确定键
    LCALL PANDUAN//调用判断函数
    
    MOV R0,#51H  //判断结束后,状态清零
    MOV R1,#71H
    
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    
    MOV 71H,#00H
    MOV 72H,#00H
    MOV 73H,#00H
    MOV 74H,#00H
    MOV 75H,#00H
    MOV 76H,#00H
    MOV 77H,#00H
    MOV 78H,#00H
    
    LJMP QWER3
    
    QWER8:
    CJNE A,#01H,QWER2  //判断是否退格按键按下
    CJNE R0,#51H,JIAN   //判断是否超出了八位数码管范围!这个特别重要!(低于0位)
    SJMP QWER3
    JIAN:
    DEC R0  //退格执行语句
    DEC R1
    MOV @R0,#00H
    MOV @R1,#00H
    SJMP QWER3
    QWER2:
    CJNE R0,#59H,JIA  //判断是否超出了八位数码管范围!这个特别重要!(高于8位)
    SJMP QWER3
    JIA:
    MOV @R0,#040H  //按下数字按键则累加
    MOV @R1,50H
    INC R0
    INC R1
    
    
    
    QWER3:
    SETB P2.4  //八位数码管显示函数,为动态扫描形,p2.2、3、4为138译码器ABC接口  p0为数码管控制位
    SETB P2.3
    SETB P2.2
    MOV P0,51H
    ACALL DELAY1  //一定要记得调用延迟函数,不然会出现重影的现象
    
    SETB P2.4
    SETB P2.3
    CLR P2.2
    MOV P0,52H
    ACALL DELAY1
    
    SETB P2.4
    CLR P2.3
    SETB P2.2
    MOV P0,53H
    ACALL DELAY1
    
    SETB P2.4
    CLR P2.3
    CLR P2.2
    MOV P0,54H
    ACALL DELAY1
    CLR P2.4
    SETB P2.3
    SETB P2.2
    MOV P0,55H
    
    ACALL DELAY1
    CLR P2.4
    SETB P2.3
    CLR P2.2
    MOV P0,56H
    
    ACALL DELAY1
    CLR P2.4
    CLR P2.3
    SETB P2.2
    MOV P0,57H
    ACALL DELAY1
    
    CLR P2.4
    CLR P2.3
    CLR P2.2
    MOV P0,58H
    ACALL DELAY1
    
    LJMP MAIN   //循环回去,相当于C语言里面的while(1)
    
    PANDUAN:  //判断子函数,一位一位判断,不对则调用BEE函数,蜂鸣器报警
    
    MOV A,71H
    CJNE A,21H,BEE
    MOV A,72H
    CJNE A,22H,BEE
    MOV A,73H
    CJNE A,23H,BEE
    MOV A,74H
    CJNE A,24H,BEE
    MOV A,75H
    CJNE A,25H,BEE
    MOV A,76H
    CJNE A,26H,BEE
    MOV A,77H
    CJNE A,27H,BEE
    MOV A,78H
    CJNE A,28H,BEE
    MOV A,33H
    
    CJNE A,#0FFH,OVER  //如果都对,判断是否当前为改密码时验证原密码的状态,如果是的,则调用改密码函数,如果不是则正常打开锁(改密码的重点)
    MOV 33H,#00H   //清除33h单元标志位
    SETB P2.7			  
    LCALL DELAY
    LCALL DELAY  //当然如果是改密码状态则p2.7灭一下后又亮,提示用户可以输入新密码了!
    LCALL DELAY
    CLR P2.7
    LCALL SHEZHI	  //调用设置新密码函数
    
    
    OVER:  //正常开锁状态
    CLR P2.0
    LCALL DELAY
    LCALL DELAY
    LCALL DELAY
    SETB P2.0
    MOV A,33H  //清除33h单元标志位,这里为出现bug所设置的,防止其他操作
    RET
    
    
    BEE:  //蜂鸣器报警函数,无源蜂鸣器,需要高低电平来回变
    MOV 33H,#00H
    SETB P2.7
    MOV R5,#20
    MOV R7,#0FFH
    HAHAHA:
    CPL P1.5
    LCALL DELAYBEE
    DJNZ R7,HAHAHA
    MOV R7,#0FFH
    DJNZ R5,HAHAHA
    RET
    
    SHEZHI:  //设置新密码子函数(最难点)
    MOV R0,#51H
    MOV R1,#71H	  //当开始清零
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    MOV 71H,#00H
    MOV 72H,#00H
    MOV 73H,#00H
    MOV 74H,#00H
    MOV 75H,#00H
    MOV 76H,#00H
    MOV 77H,#00H
    MOV 78H,#00H
    
    SHEZHIK:
    MOV 50H,#00H  //和上面的正常模式其实很相似,只是我不会嵌套上面的函数,于是重新搞了一个新的函数,没有注释的地方和上面一样
    LCALL SAOMIAO
    MOV A,50H
    CJNE A,#00H,SHEZHI1
    LJMP SHEZHI5
    
    SHEZHI1:
    CJNE A,#03H,SHEZHI22  //防止用户花里胡哨操作,在改密码的时候,又突然返回了。所以全部清零,原密码不动
    SETB P2.7
    MOV 33H,0FFH
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    MOV R0,#51H
    MOV 33H,#00H  //清除33h
    LJMP QWER3
    
    SHEZHI22:
    CJNE A,#01H,SHEZHI2  //是否退格
    CJNE R0,#51H,JIAN1
    SJMP SHEZHI5
    JIAN1:
    DEC R0
    MOV @R0,#00H
    SJMP SHEZHI5
    
    
    SHEZHI2:
    CJNE A,#02H,SHEZHI3  //重点!判断是否输入了确定键,如果是的,把新密码来替换原密码
    MOV 21H,51H
    MOV 22H,52H
    MOV 23H,53H
    MOV 24H,54H	  // 新密码来替换原密码
    MOV 25H,55H
    MOV 26H,56H
    MOV 27H,57H
    MOV 28H,58H
    
    MOV 51H,#00H
    MOV 52H,#00H
    MOV 53H,#00H
    MOV 54H,#00H  //清零,防止bug
    MOV 55H,#00H
    MOV 56H,#00H
    MOV 57H,#00H
    MOV 58H,#00H
    MOV R0,#51H
    SETB P2.7	  //清除p2.7
    LJMP QWER3
    
    
    SHEZHI3:
    CJNE R0,#59H,JIA1
    SJMP  SHEZHI5
    JIA1:
    MOV @R0,50H
    INC R0
    
    
    
    SHEZHI5:  //数码管显示函数
    SETB P2.4
    SETB P2.3
    SETB P2.2
    MOV P0,51H
    ACALL DELAY1
    
    SETB P2.4
    SETB P2.3
    CLR P2.2
    MOV P0,52H
    ACALL DELAY1
    
    SETB P2.4
    CLR P2.3
    SETB P2.2
    MOV P0,53H
    ACALL DELAY1
    
    SETB P2.4
    CLR P2.3
    CLR P2.2
    MOV P0,54H
    ACALL DELAY1
    
    CLR P2.4
    SETB P2.3
    SETB P2.2
    MOV P0,55H
    ACALL DELAY1
    
    CLR P2.4
    SETB P2.3
    CLR P2.2
    MOV P0,56H
    ACALL DELAY1
    
    CLR P2.4
    CLR P2.3
    SETB P2.2
    MOV P0,57H
    ACALL DELAY1
    
    CLR P2.4
    CLR P2.3
    CLR P2.2
    MOV P0,58H
    ACALL DELAY1
    
    LJMP SHEZHIK  //注意此时不可以跳转到主函数,因为新密码还没有输出完成,所以跳转到上面的设置新密码的函数,来接受下一位密码
    
    SAOMIAO:  //扫描矩阵键盘函数
    							
    CLR P2.4
    CLR P2.3
    CLR P2.2				  
    MOV P0,#00H  //这个是为了方式bug 方式键盘输入到了第八位,继续按键的话,第八位数码管会变得很亮设置的
    
    MOV P1,#0F0H   
    JNB P1.4,Y0
    JNB P1.5,Y1
    JNB P1.6,Y2
    JNB P1.7,Y3
    RET
    Y0:
    MOV P1,#0FH
    MOV 30H,#00H
    JNB P1.0,X0
    JNB P1.1,X1
    JNB P1.2,X2
    JNB P1.3,X3
    Y1:  //矩阵键盘原理,先扫描列再扫描行,得到的结果进入计算函数来计算对应的按键值(注意51单片机如果高电平引脚与低电平引脚短接,则低电平引脚变为高,高电平引脚不变,所以检测的时候检测1,不检测0!!!)
    MOV P1,#0FH
    MOV 30H,#01H
    JNB P1.0,X0
    JNB P1.1,X1
    JNB P1.2,X2
    JNB P1.3,X3
    Y2:
    MOV P1,#0FH
    MOV 30H,#02H
    JNB P1.0,X0  ·//数据暂存到30h单元
    JNB P1.1,X1
    JNB P1.2,X2
    JNB P1.3,X3
    Y3:
    MOV P1,#0FH
    MOV 30H,#03H
    JNB P1.0,X0
    JNB P1.1,X1
    JNB P1.2,X2
    JNB P1.3,X3
    X0:
    MOV 31H,#00H
    ACALL DELAY
    MOV P1,#0F0H
    LJMP JISUAN
    X1:
    MOV 31H,#01H
    ACALL DELAY
    MOV P1,#0F0H
    LJMP JISUAN
    X2:
    MOV 31H,#02H
    ACALL DELAY
    MOV P1,#0F0H
    LJMP JISUAN
    X3:
    MOV 31H,#03H
    ACALL DELAY
    MOV P1,#0F0H
    LJMP JISUAN
    
    JISUAN:  //开始计算,分别把值给50h,这个值是指数码管显示的数值,这个一定要区别
    G0:MOV A,30H
    CJNE A,#00H,A0  //其中退格是#01h,确定是#02h,设置密码是#03h
    MOV A,31H
    	CJNE A,#00H,G1
    	MOV 50H,#02H
    G1:	CJNE A,#01H,G2
    	MOV 50H,#03FH
    	MOV 70H,#040H
    G2:	CJNE A,#02H,A0
    	MOV 50H,#01H
    A0:MOV A,30H
    CJNE A,#01H,B0
    MOV A,31H
    	CJNE A,#00H,A1
    	MOV 50H,#04FH
    A1:	CJNE A,#01H,A2
    	MOV 50H,#05BH
    A2:	CJNE A,#02H,B0
    	MOV 50H,#06H
    B0:MOV A,30H
    CJNE A,#02H,C0
    MOV A,31H
    	CJNE A,#00H,B1
    	MOV 50H,#07DH
    B1:	CJNE A,#01H,B2
    	MOV 50H,#06DH
    B2:	CJNE A,#02H,C0
    	MOV 50H, #66H
    C0:MOV A,30H
    CJNE A,#03H,D0
    MOV A,31H
    	CJNE A,#00H,C1
    	MOV 50H,#06FH
    C1:	CJNE A,#01H,C2
    	MOV 50H,#07FH
    C2:	CJNE A,#02H,C3
    	MOV 50H,#07H
    C3:	CJNE A,#03H,D0
    	MOV 50H,#03H
    D0:RET
    	
    DELAY1: MOV R4,#0FFH	  //延迟函数
    DJNZ R4,$
    RET
    
    DELAYBEE:MOV R4,#50
    

    汇编51单片机密码锁(含论文、程序、AD图)单片机课程设计 点击下载

    展开全文
  • 在这里分享给大家一个简单的单片机应用:通过51单片机来实现电子密码锁,1602来作为显示,24C02作为密码存储,LED和蜂鸣器来提示,总的来说是比较经典简单的一个板子。为了表示方便,这里并不是用上真正的电子密码锁...

    第一次写博客,难免是紧张的。

    在这里分享给大家一个简单的单片机应用:通过51单片机来实现电子密码锁,1602来作为显示,24C02作为密码存储,LED和蜂鸣器来提示,总的来说是比较经典简单的一个板子。为了表示方便,这里并不是用上真正的电子密码锁,而是用LED的亮灭来代替,这是当初帮一个学姐做的一个课设,很简单。

    下面是原理图:

    下面是PCB(很久之前画的了,当时很菜很菜,就画成这个样子,不过是能用的):

     

    关于不明白的地方可以添加我的QQ:1804433910 问我(注明来意) 

    展开全文
  • 设计是以AT89C52单片机实现密码锁监控装置的检测和控制核心,实现密码信息的设定、加密、更改和错误输入发出警报等功能。分为键盘输入(此处采用4×4矩阵盘),显示输出,密码比对,实现开锁或警报的过程。该设计...
  • 此资料为基于51单片机电子密码锁,代码+电路图。代码亲测可用,详细原理可参考附带的电路图
  • 在数字电路单片机原理与应用...绍一种基于51 单片机电子密码锁的仿真设计过程, 证明了在Proteus 的环境下可以方便完成单片机和数字电子系统的硬件设计和 软件调试,证明其可缩短我们作品的开发周期,提高设计效率。
  • 51单片机电子密码锁的设计与仿真 看看效果 简介 (1)CPU使用51单片机。 (2)用4x4矩阵键盘作为操作信息输入。 (3)用LCM1602液晶显示模块作为信息显示。 (4)用蜂鸣器及发光二极管作为错误报警及状态显示...

    51单片机的电子密码锁的设计与仿真

    看看效果图
    在这里插入图片描述

    1. 简介

    (1)CPU使用51单片机。
    (2)用4x4矩阵键盘作为操作信息输入。
    (3)用LCM1602液晶显示模块作为信息显示。
    (4)用蜂鸣器及发光二极管作为错误报警及状态显示。

    1. 功能
      (1)输入密码功能。
      输入密码时,用“★”号或“-”代替真实的密码以防密码泄露。在
      输入密码时,具有清除前一位/或多位的密码功能(用清除键)。
      密码输入完毕,按(确认/开锁键)确认并生效。
      (2)上锁功能。
      在锁开状态下,通过上锁键上锁。
      (3)在锁合的状态下,通过输入密码开锁功能。
      开锁时,先按确认/开锁键后,再在键盘上输入六位密码,然后按
      确认/开锁键,如果密码正确,进入锁开状态。
      (4)在锁开状态下,设置新密码功能。
      按设置新密码键,在键盘上输入六位新的密码,按(确认/开锁)
      键确认,代替旧密码。
      (5)在开锁时,如果输入密码三次错误,产生声、光报警功能。
      每错误一次,告警一次, 若连续三次错误,则系统屏蔽输入功能,
      直到系统复位后重新开始。
      程序设计

    定义LCD管脚以及led灯以及蜂鸣器管脚

    在这里插入图片描述
    定义LCD显示的字符串以及初始化变量
    在这里插入图片描述
    矩阵键盘扫描

    /*
     * @description	: 矩阵键盘扫描
     * @param 		:无
     * @return 		: 无
     */
    void KeyDown(void)
    {
    	GPIO_KEY=0x0f;
    	if(GPIO_KEY!=0x0f)//读取按键是否按下
    	{	 	
    		delay(3);//延时10ms进行消抖
    		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
    		{	 //TR1=0;
    			//测试列
    			 //LED=~LED;
    			GPIO_KEY=0X0F;
    			switch(GPIO_KEY)
    			{
    				case(0X07):	KeyValue=0;break;
    				case(0X0b):	KeyValue=1;break;
    				case(0X0d): KeyValue=2;break;
    				case(0X0e):	KeyValue=3;break;
    			}
    			//测试行
    			GPIO_KEY=0XF0;
    			switch(GPIO_KEY)
    			{
    				case(0X70):	KeyValue=KeyValue;break;
    				case(0Xb0):	KeyValue=KeyValue+4;break;
    				case(0Xd0): KeyValue=KeyValue+8;break;
    				case(0Xe0):	KeyValue=KeyValue+12;break;
    			}
    			while(GPIO_KEY!=0xf0);	 //检测按键松手检测
    			return ;
    		}
    	}
    	KeyValue = 0xff;
    }
    ```扫描按键
    ```c
    /*
     * @description	: 按键扫描 并且执行相应的操作
     * @param 		:无
     * @return 		: 无
     */
    void Input_Key()
    {
    		//刷新按键的值若没有按键按下则返回0xff
    		KeyDown();
    		if(KeyValue == 0xff||pw_errnum>=3)return;//检测是否有按键按下,或者是否有
    		//当1-9按下时
    		if(KeyValue>=0&&KeyValue<=9)
    		{		
    				if((flag == 0 || flag ==2)&&pw_count<6)
    				{
    						pw_count++;//密码下标
    						temp_pw[pw_count] = KeyValue;//保存按键值
    						show_pw(pw_count);	//屏幕显示*
    				}
    		}
    		else if(KeyValue == 12)//上锁键
    		{
    				if(flag == 1) //如果设备在开锁时按下
    				{
    						flag = 0;
    						show_Status(&input_pw);//显示请输入密码
    				}
    		}
    		else if(KeyValue == 13)//按下了清除键
    		{
    						if(pw_count>0)pw_count--;//下标左移
    						show_pw(pw_count);	//刷新屏幕密码
    		}
    		else if(KeyValue == 14)//按下了确定键
    		{
    				if(pw_count == 6)  //判断数量是否有6位
    				{
    							if(flag == 0) //锁关闭状态
    							{
    										if(temp_pw[0] == pw[0]&&temp_pw[1] == pw[1]&&temp_pw[2] == pw[2]&&temp_pw[3] == pw[3]&&temp_pw[4] == pw[4]&&temp_pw[5] == pw[5])//校验密码
    										{
    												show_Status(&welcome);//显示欢迎您
    												flag = 1;							//切换状态
    												pw_count = 0;					//密码清0
    												pw_errnum = 0;				//错误密码次数清0
    												show_pw(pw_count);	//刷新屏幕密码
    												open();							//执行开门时的回调函数
    											
    										}
    										else{
    											
    												pw_errnum++;			//错误次数+1
    												pw_count = 0;			//密码清0
    												show_pw(pw_count);	//刷新屏幕密码
    												show_Status(&pw_error); //显示密码错误
    												alarm();								//发出警告
    												if(pw_errnum>=3)				//当密码错误达到3次时
    												{
    														show_Status(&Lock);  //显示设备锁了
    														Lock_Device();      //报警 轰炸模式
    												}
    										}
    										
    							}
    							else if(flag == 1)//锁打开状态,按下确定键无反应
    							{
    									
    										
    							}
    							else if(flag == 2)//设置密码状态  保存新密码
    							{
    								//保存密码
    								pw[0] = temp_pw[0];
    								pw[1] = temp_pw[1];
    								pw[2] = temp_pw[2];
    								pw[3] = temp_pw[3];
    								pw[4] = temp_pw[4];
    								pw[5] = temp_pw[5];
    								show_Status(&welcome); //显示欢迎你
    								flag = 1;              //标志位置位
    								pw_count = 0;         //密码清0
    								show_pw(pw_count);	//刷新屏幕密码
    								
    							}
    				}else{//密码未到6位不能操作
    //						LED = 0;
    				}
    					
    		}
    		else if(KeyValue == 15)//按下了设置密码键
    		{
    				if(flag == 1) //判断锁是否已经打开,打开才能设置密码
    				{
    							show_Status(set_pw);//显示新的标题
    							flag = 2;         //标志位改成设置密码
    				}
    		}
    }
    

    需要的可以自己去下载哦!
    需要该源码的可以关注公众号:智慧小巷
    回复:电子密码锁
    即可!
    在这里插入图片描述

    展开全文
  • 超强防破解,输入错一位就进入死循环,本密码我设置的了7位数,程序清晰易懂,
  • 一个基于51单片机的简易密码锁,废话不多说,直接贴图贴代码 1.电路图 电路组成:5V电源+51单片机最小系统+LCD1602显示屏+4*4矩阵键盘 2.程序分析 (1)LCD1602驱动程序 #include &quot;1602.h&quot;...

    一个基于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电路图 下载:关注公众号,首页回复“电子密码锁”获取资料
    在这里插入图片描述

    展开全文
  • STM32指纹密码锁电路图及PCB,整个项目已经完全调试通了,到手可以直接用的,原理图也是可以直接用的。
  • 本次分享的是一款基于51单片机的指纹识别电子密码锁系统,该系统以STC89C52单片机作为模块核心,通过串口通信控制指纹模块AS608实现录取指纹并存储指纹数据,并通过LCD12864液晶显示屏比对流程及效果,辅以直流继电...
  • 和同学一起设计的一款基于51单片机密码锁。集成了多个适合初学者学习的功能。可以显示时间日期,温度,可以修改和断电储存密码,有蜂鸣器报警功能,有蓝牙通信(手机输入修改密码)等功能,非常适合初学者学习和...
  • 链接: 添加链接描述
  • (1)51单片机主控单元:AT89C51单片机/STC89C51单片机/STC89C52单片机均可,负责控制各个模块,此处必须配有相应的晶振电路和复位模块; (2)密码存储单元:AT24C02芯片,有掉电存储功能,能够存储密码,仿真中...
  • 基于51单片机编写的六位电子密码锁由LCD1602显示 全部内容由本人原创! 从制定计划到焊接调试完成耗时5天! 此程序仅表示完成该项目其中的一个方法,对有兴趣修改,完善的同学表示欢迎! *注:每个关键的地方都有...
  • 基于单片机的指纹红外密码电子锁,内含pcb,原理,传感器详细介绍,代码,视频,参考论文等,是一个自己做的课程设计,可供需要的人参考学习,讲解详细,内容很全
  • 程序流程*******************************************************;以下8个字节存放8位数码管的段码LED_BIT_1 EQU 30HLED_BIT_2 EQU 31HLED_BIT_3 EQU 32HLED_BIT_4 EQU 33HLED_BIT_5 EQU 34HLED_BIT_6...
  • 基于单片机电子密码锁系统的设计 该项目包括原理图电路图 程序源码 演示视频讲解文档全套资料 三分拿去 超值了
  • 密码输入错误和密码输入正确均有相应的提醒信息(如LED亮或蜂鸣器发声等); ④ 可删除输入的数字,删除的是最后输入的数字。 扩展功能 当前输入的数字在最右侧数码管显示,前面输入的数字自动左移一个数字位置 ...
1 2 3 4 5 ... 20
收藏数 511
精华内容 204
关键字:

单片机电子密码锁电路图