一、 设计要求
设计一个由单片机控制的电子密码锁,要求如下:

  1. 能设定一组4位的数字开启密码(设定密码功能)
  2. 用LED小灯代替锁开启显示,输入密码正确,则小灯亮起(开锁功能)
  3. 如果3次密码错误,则进行鸣叫报警,并在1分钟之内不能再次输入(报警功能)
  4. 密码输入显示在数码管上,输入正确显示on,输入错误显示err(显示功能)
  5. 可在以上功能上扩展。
    二、原理说明
    该程序用C51语言,Keil5软件及proteus进行仿真。
    用到的硬件设备有AT89C52,蜂鸣器,LCD1602,上拉电阻,三极管,按钮
    代码部分对不同的方法进行封装,主要是延时函数Delay(),蜂鸣器发声函数Beep(),矩阵键盘函数,LCD1602显示函数以及主要功能实现main函数。

1、 矩阵键盘输入
根据矩阵键盘的电平翻转对16个按键进行数字的定义,并返回每个按键对应的数字。Main函数里对返回的数字进行判断来确定按下的是哪一个按键,并对相关功能进行定义。在这里我定义0~9数字为输入的正常数字,按键11定义为确定按键,即当矩阵键盘函数MatrixKey()函数返回值为11时定义确认键功能,矩阵键盘函数MatrixKey()函数返回值为12时定义撤销键功能,矩阵键盘函数MatrixKey()函数返回值为13时定义重置密码功能。注意按键消抖。
代码如下:

#include <REGX52.H>
#include "Delay.h"unsigned char MatrixKey()
{unsigned char KeyNumber = 0;//按列扫描P1 = 0xFF;P1_3 = 0;  //判断第一列if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 1;} } //delay消抖,一列一行if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 5;} } //1列2行if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 9;} } //1列3行if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 13;} } //1列4行P1 = 0xFF;P1_2 = 0;  //判断第2列if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 2;} } //delay消抖,2列一行if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 6;} } //2列2行if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 10;} } //2列3行if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 14;} } //2列4行P1 = 0xFF;P1_1 = 0;  //判断第3列if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 3;} } //delay消抖,3列一行if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 7;} } //3列2行if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 11;} } //3列3行if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 15;} } //3列4行P1 = 0xFF;P1_0 = 0;  //判断第4列if(P1_7 == 0){Delay(20);while(P1_7 == 0){Delay(20);KeyNumber = 4;} } //delay消抖,4列一行if(P1_6 == 0){Delay(20);while(P1_6 == 0){Delay(20);KeyNumber = 8;} } //4列2行if(P1_5 == 0){Delay(20);while(P1_5 == 0){Delay(20);KeyNumber = 12;} } //4列3行if(P1_4 == 0){Delay(20);while(P1_4 == 0){Delay(20);KeyNumber = 16;} } //4列4行return KeyNumber;
}

2、 LCD1602进行显示
主要使用的方法为以下几种方法
注意LCD1602的显示范围,行是12,列数是116

3、 延时函数
延时函数非常简单,就是一个简单的循环
代码如下:

void Delay(unsigned int xms)
{unsigned char i, j;while(xms--){i = 2;j = 239;do{while (--j);} while (--i);}
}

4、 蜂鸣器
蜂鸣器的声音的频率取决于延时情况,注意调到合适频率
代码如下:

#include <REGX52.H>
#include "Delay.h"sbit beep = P2^2;
void Beep()
{beep = ~beep;Delay(500);
}

5、 main函数
main函数是对整个电子密码锁主要逻辑的实现
首先定义一个password接收输入的密码,count接收输入次数,scount定义错误次数,rightpass接收正确密码。对键盘输入的数字用KeyNum进行接收。0~9数字为输入的正常数字,按键11定义为确定按键,即当矩阵键盘函数MatrixKey()函数返回值为11时定义确认键功能,矩阵键盘函数MatrixKey()函数返回值为12时定义撤销键功能,矩阵键盘函数MatrixKey()函数返回值为13时定义重置密码功能。

三、电路设计
电路主要包括四块,单片机AT89C52,矩阵键盘,蜂鸣器,LCD1602

AT89C52的P0口和P2口的P25,P26,P2^7控制LCD1602,P0口需接上拉电阻
AT89C52的P1口控制矩阵键盘。这里矩阵键盘按列扫描,首先对P1进行初始化P1 = 0xFF,然后循环依次从第一列到第四列的接口赋值0(P10,P11,P12,P13),然后对行的接口进行扫描检测。如果某一个按键按下,此时该按键列的接口为0,那么该按键行的接口也为0。根据行与列判断是哪一个按键进行相应赋值定义。
AT89C52的P3^0控制LED小灯。
AT89C52的P22控制蜂鸣器。蜂鸣器分为有源蜂鸣器和无源蜂鸣器(振荡源),我选择的为有源蜂鸣器,将蜂鸣器的电压调为2v。我用的NPN三极管,P22=1时三极管导通,蜂鸣器发声。

四、仿真结果
点击开始,LCD1602显示PASSWORD,提示输入密码。

输入一个四位密码

点击RIGHT进行确认,判断是否是正确密码

密码不正确,显示ERR,密码输入清零
重新输入,错误三次后蜂鸣器会报警,此时无法输入

输入初始正确密码2001,显示ON,小灯两起

输入一个密码1256,按下EXCHANGE键,对正确密码进行修改

此时重新输入之前的初始正确密码2001,已经错误

输入1256

输入一个密码错误时,按CANCEL键可清零

五、结果分析
功能需求均能满足。LCD1602可正常显示,密码输入正常,错误次数超过3次蜂鸣器报警并1min内无法输入,密码输入正确会显示ON。输入数字错误可取消重新输入。可软件对正确密码进行修改。正确密码初始为2001,进行密码修改后在不掉电情况下正确密码可变,但掉电丢失,正确密码恢复为初始2001.尝试用硬件24C02进行记忆,可成功写入和读出,但写入的数字存在错误。无法完全实现,以后会尝试从这方面进行改进,并优化代码逻辑结构。

部分代码参考于https://www.bilibili.com/video/BV1Mb411e7re?share_source=copy_web

源码:链接:https://pan.baidu.com/s/1zoeNOUen1O2sHvAjRcT4sw?pwd=2vlu
提取码:2vlu

基于keil4和proteus实现的简易密码锁相关推荐

  1. 基于STM32的简易密码锁

    前言: 朋友做毕设需要用到密码锁这个功能,帮忙设计了一个简单的.因为自己也忙于毕设,所以很多功能也没有完善. 有兴趣的朋友可以看下这个,也能实现扫码开锁功能 扫码点灯 实现功能: 1.密码保存到STM ...

  2. 用matlab编程简单电子琴,基于MATLAB的数字信号发生器及简易电子琴设计论文.doc...

    基于MATLAB的数字信号发生器及简易电子琴设计论文 基于MATLAB的数字信号发生器及简易电子琴设计 摘 要 数字信号发生器是一种基于软硬件结合实现的函数波形产生仪器.在工程实践中需要检测和分析的各 ...

  3. C语言arduino密码锁实验报告,简易密码锁的制作-Arduino中文社区 - Powered by Discuz!...

    本帖最后由 chemistry 于 2018-11-8 16:57 编辑 一款简易密码锁一.功能: 将密码显示在lcd屏上,正常状态下电磁锁处于锁定状态,当输入密码与原设定密码一致时,打开电磁锁.同时 ...

  4. c语言密码锁程序,简易密码锁(C语言程序).doc

    简易密码锁(C语言程序) 单片机小程序程设计 简易密码锁 姓 名 : 静 学 号 :2011 目录 功能介绍2 框图介绍2 引脚介绍3 硬件电路图5 程序设计5 设计心得11 功能介绍 实现功能:一共 ...

  5. proteus使用NE555简易电子琴仿真

    proteus使用NE555简易电子琴仿真 仿真文件 仿真文件 2022-5-23更新补充资源,电路重新搭建 链接:https://pan.baidu.com/s/1Z6ptPbXqS6J3VlS-X ...

  6. 基于单片机指纹识别管理门禁密码锁系统设计(毕设课设资料)

    摘要: 基于51单片机指纹管理门禁系统设计 本系统由STC89C52单片机电路+指纹模块传感器电路+LCD1602液晶显示电路+继电器电路+按键电路+电源电路组成. 1.通过指纹传感器检测采集指纹. ...

  7. STM32 Proteus UCOSII系统简易时钟计时系统-0054

    STM32 Proteus UCOSII系统简易时钟计时系统-0054 Proteus仿真小实验: STM32 Proteus UCOSII系统简易时钟计时系统-0054 功能: 硬件组成:STM32 ...

  8. 【Proteus仿真】简易51单片机时钟,带闹钟功能,可调整时间

    [Proteus仿真]简易51单片机时钟,带闹钟功能,可调整时间 Proteus仿真效果图 简易电子钟 功能简介 数码管段选为P1口 数码管段选P3口 蜂鸣器P27 按键P20–P23. 数码管显示目 ...

  9. 基于调用百度翻译API的简易翻译器(python)

    基于调用百度翻译API的简易翻译器 一.使用自己的百度账号登录百度翻译开放平台获取百度翻译API 使用您的百度账号登录百度翻译开放平台(http://api.fanyi.baidu.com): 注册成 ...

最新文章

  1. BaseTDI.sys 瑞星卡巴冲突,导致机器蓝屏
  2. Mybatis传多个参数(三种解决方案)
  3. OpenAirInterface,开源的 4G EPS 实现
  4. mysql中主从_MySQL的主从
  5. 计算机基本水平测试内容,浙江师范大学计算机基础水平测试大纲(2018级新生使用)...
  6. vs关于“当前不会命中断点 还没有为该文档加载任何符号”的解决方法
  7. Ubuntu terminal reset and clear快捷键
  8. ]MySQL操作命令语句实例
  9. C语言标准io函数,《C语言深度解析》第9章——位操作 与 c标准IO库
  10. 反欺诈模型常用开发工具
  11. 故障树手册(Fault Tree handbook)(6)
  12. [论文翻译]YOLOX: Exceeding YOLO Series in 2021
  13. InsightFace-Paddle实现人脸比对
  14. 二、LoRaWAN Gateway【LoRaWAN实战项目】
  15. ARKit之路-ARKit概述之一
  16. c# WPF 动态设置button的IsEnabled属性
  17. -Xms -Xmx等jvm参数的含义
  18. 计算机和计算机之间如何传送文件,两台电脑实现互传文件:多种方法可选择
  19. VRP——华为数据通信产品的操作系统
  20. python 文件操作常用轮子

热门文章

  1. 仿小米商城二维码下拉
  2. 【POJ3208】Apocalypse Someday
  3. 超声波风速风向仪换能器 能够在大风速下稳定工作
  4. 学习练手的22个Python迷你程序
  5. zpl 预览html,最全zpl语言指令教程.docx
  6. 河南大学计算机系导师张重生,《大河报》我国首款AI甲骨缀合产品发布,河南大学留学归国人员联谊会会员张重生教授团队主研...
  7. 系统里有哪些软中断?
  8. Chrome Capabilities 与 ChromeOptions
  9. XBee zigbee 使用指南---XBee设备如何通信
  10. hehe 今天今天偶然发现自己的博客可以使用了^_^请问那个.net的网页编辑器哪里可以找到阿?