【51单片机仿真】基于51单片机设计的智能六位密码锁(匿*输入/密码修改/警示/保存/恢复/初始密码)源码仿真设计文档演示视频——文末资料下载

news2024/11/27 14:49:39

基于51单片机设计的智能六位密码锁

演示视频

基于51单片机设计的智能六位密码锁

功能简介

- 能够从键盘中输入密码,并相应地在显示器上显示"*"

- 能够判断密码是否正确,正确则开锁,错误则输出相应信息

- 能够实现密码的修改

- 在操作错误到达一定次数后能够报警

- 备用密码为,初始密码,在功能上实用性更强,利用中断按钮清除用户密码,恢复初始密码

- 断电或者单片机复位后能够保存之前的操作,如初密码

摘要: 本文介绍了一种基于AT89C51单片机的密码锁系统的综合设计与实现。该系统结合硬件和软件组件,提供了一种安全且用户友好的访问控制解决方案。硬件设计包括用于密码输入的键盘、用户界面的液晶显示器和用于报警功能的蜂鸣器。软件部分负责密码验证、用户交互和安全功能。本文详细描述了该系统的原理图、电路设计、软件算法和功能测试。

目录

第一章 引言

第二章 硬件设计

2.1 AT89C51单片机

2.2 键盘矩阵

2.3 LCD1602液晶显示器

2.4 蜂鸣器

2.5 24C02 EEPROM

第三章 软件设计

3.1 初始化

3.2 密码输入与验证

3.3 报警功能

3.4 密码修改

第四章 功能测试

4.1 密码输入测试

4.2 密码验证测试

4.3 密码修改测试

4.4 报警功能测试

第五章 总结

完整系统工程资料下载链接


第一章 引言

密码锁系统在许多场景中广泛应用,例如家庭安全、办公室门禁和保险箱等。一个可靠的密码锁系统不仅需要硬件的稳定性,还需要软件的灵活性和安全性。本文通过详细的设计和实现,展示了如何构建一个基于AT89C51单片机的密码锁系统。功能简介:能够从键盘中输入密码,并相应地在显示器上显示"*";能够判断密码是否正确,正确则开锁,错误则输出相应信息; 能够实现密码的修改;在操作错误到达一定次数后能够报警;备用密码为,初始密码,在功能上实用性更强,利用中断按钮清除用户密码,恢复初始密码;断电或者单片机复位后能够保存之前的操作,如初密码。

图-系统整体框图

第二章 硬件设计

 

图-系统仿真电路

硬件设计包括以下主要部分:

  1. AT89C51单片机:系统的核心控制单元。
  2. 键盘矩阵:用于用户输入密码。
  3. LCD1602液晶显示器:用于显示操作提示和反馈信息。
  4. 蜂鸣器:用于报警提示。
  5. 24C02 EEPROM:用于存储密码。

2.1 AT89C51单片机

AT89C51单片机是整个系统的核心控制单元,负责处理输入、控制输出并进行密码验证。其主要特性包括:

  • 8位处理器,支持多种I/O操作
  • 内置128字节RAM和4KB ROM
  • 支持串行通讯接口

AT89C51单片机引脚示意图如下:

  • VCC (40): 电源正极
  • GND (20): 电源负极
  • XTAL1 (19)XTAL2 (18): 接外部晶振
  • P0.0 - P0.7 (39 - 32): 8位双向I/O口,用于数据总线
  • P1.0 - P1.7 (1 - 8): 8位双向I/O口,用于控制信号
  • P2.0 - P2.7 (21 - 28): 8位双向I/O口,用于地址总线
  • P3.0 - P3.7 (10 - 17): 8位双向I/O口,用于特殊功能

2.2 键盘矩阵

键盘矩阵用于用户输入密码,采用4x4矩阵设计,共有16个按键。每个按键对应一个数字或功能,如下表所示:

行\列0123
0123A
1456B
2789C
3*0#D

 键盘矩阵的每一行和每一列都连接到单片机的I/O口,通过扫描行和列来检测按键的状态。例如,行0连接到P1.0,列0连接到P1.4。当按键1被按下时,P1.0将被拉低,通过读取P1.4的状态来确定按键1被按下。

2.3 LCD1602液晶显示器

LCD1602液晶显示器用于显示操作提示和反馈信息,连接到单片机的P2口。它支持16x2字符显示,提供了基本的显示功能。LCD1602的引脚连接如下:

  • VSS (1): 接地
  • VDD (2): 电源正极
  • VO (3): 对比度调整端,接一个可变电阻
  • RS (4): 寄存器选择信号,接P2.7
  • RW (5): 读/写选择信号,接P2.6
  • E (6): 使能信号,接P2.5
  • D0-D7 (7-14): 数据总线,接P0.0-P0.7
  • A (15): 背光电源正极
  • K (16): 背光电源负极

液晶显示器的初始化和显示字符由软件控制,通过发送命令和数据来实现。

2.4 蜂鸣器

蜂鸣器用于提示用户输入错误或系统报警,连接到单片机的P2.4口。当输入错误次数达到设定值时,蜂鸣器会响起警报声。蜂鸣器的引脚连接如下:

  • 正极: 接P2.4
  • 负极: 接地

通过控制P2.4的电平来控制蜂鸣器的开关,当P2.4输出高电平时,蜂鸣器响起;当P2.4输出低电平时,蜂鸣器关闭。

2.5 24C02 EEPROM

24C02 EEPROM用于存储和读取密码,通过I2C接口与单片机连接。EEPROM具有非易失性存储特性,断电后数据不会丢失。24C02的引脚连接如下:

  • A0-A2 (1-3): 地址选择引脚,接地
  • GND (4): 接地
  • SDA (5): 数据线,接P2.1
  • SCL (6): 时钟线,接P2.0
  • WP (7): 写保护引脚,接地
  • VCC (8): 电源正极

通过I2C总线协议与24C02通信,可以实现对EEPROM的读写操作。

第三章 软件设计

软件部分采用C语言编写,主要实现以下功能:

  1. 初始化:包括I2C总线初始化、LCD初始化和密码初始化。
  2. 密码输入与验证:通过键盘输入密码,并与存储的密码进行比较。
  3. 报警功能:当输入密码错误次数超过设定值时,触发报警。
  4. 密码修改:允许用户通过按键输入新密码并进行存储。

3.1 初始化

初始化函数包括I2C总线初始化、LCD初始化和密码初始化。具体代码如下:

void chushi() {
    SDA = 1;
    delay2();
    SCL = 1;
    delay2();
}

void LCD1602_init() {
    E = 0;
    write_com(0x38); // 设置16x2显示,5x7点阵,8位数据口
    write_com(0x0c); // 设置开显示,不显示光标
    write_com(0x06); // 写一个字符后地址指针加1
    write_com(0x01); // 显示清0,数据指针清0
}

3.2 密码输入与验证

密码输入函数通过键盘矩阵扫描实现,密码验证函数将输入的密码与存储的密码进行比较。具体代码如下:

bit input_mima(uchar *mima) {
    uchar i, key;
    LCD1602_pos(1, 0);
    for (i = 0; i < 7; i++) {
        delay1(100);
        if (i < 6) {
            do {
                key = keyscan();
            } while (key == 0xff);
            if ((key != 0x0f) && (key != 0x0a) && (key != 0x0c)) {
                write_date('*');
                mima[i] = key;
            }
            if (key == 0x0f) {
                if (i > 0) {
                    LCD1602_pos(1, --i);
                    write_date(' ');
                    mima[i] = ' ';
                    LCD1602_pos(1, i);
                    i--;
                }
            }
            if (key == 0x0c) {
                LCD1602_pos(0, 0);
                return 0;
            }
        }
        if (i == 6) {
            do {
                key = keyscan();
            } while ((key != 0x0f) && (key != 0x0c));
            if (key == 0x0f) {
                LCD1602_pos(1, --i);
                write_date(' ');
                mima[i] = ' ';
                LCD1602_pos(1, i);
                i--;
            }
            if (key == 0x0c) {
                return 1;
            }
        }
    }
}

3.3 报警功能

当输入密码错误次数超过设定值时,触发蜂鸣器报警。具体代码如下:

void baojing2() {
    uchar i;
    for (i = 0; i < 10; i++) {
        baojing1();
    }
}

3.4 密码修改

用户可以通过按键输入新密码并进行存储,具体代码如下:

void sfj2() {
    uchar key, i;
    uchar idata table2[6] = {' ', ' ', ' ', ' ', ' ', ' '};
    uchar idata table3[6] = {' ', ' ', ' ', ' ', ' ', ' '};
    uchar idata table4[6] = {' ', ' ', ' ', ' ', ' ', ' '};
    key = step_choose();
    if (key == 0x0b) {
        read_n_add(table2, 0x00, 6);
        write_com(0x06);
        write_com(0x01);
        write_com(0x0f);
        LCD1602_pos(0, 0);
        write_n_char("input password");
        write_com(0x0f);
        if (input_mima(table3)) {
            if (sfj1(table3, table1) || sfj1(table3, table2)) {
                LCD1602_pos(0, 0);
                write_com(0x0c);
                write_com(0x06);
                write_com(0x01);
                write_n_char("password right ");
                aa = 0;
                delay1(500);
                dd = 1;
                while (dd) {
                    write_com(0x06);
                    write_com(0x01);
                    write_com(0x0f);
                    LCD1602_pos(0, 0);
                    write_n_char("In new password");
                    delay1(500);
                    if (input_mima(table3)) {
                        LCD1602_pos(0, 0);
                        write_com(0x0c);
                        write_com(0x06);
                        write_com(0x01);
                        write_n_char("Input new pass");
                        LCD1602_pos(1, 0);
                        write_n_char("word again");
                        delay1(800);
                        LCD1602_pos(0, 0);
                        write_com(0x0f);
                        write_com(0x06);
                        write_com(0x01);
                        write_n_char("In new password");
                        if (input_mima(table4)) {
                            if (sfj1(table3, table4)) {
                                LCD1602_pos(0, 0);
                                write_com(0x0c);
                                write_com(0x06);
                                write_com(0x01);
                                write_n_char("password has");
                                LCD1602_pos(1, 0);
                                write_n_char("change already");
                                write_n_add(table4, 0x00, 6);
                                delay1(1000);
                                dd = 0;
                            } else {
                                LCD1602_pos(0, 0);
                                write_com(0x0c);
                                write_com(0x06);
                                write_com(0x01);
                                write_n_char("password wrong");
                                delay1(600);
                                aa++;
                                if (aa == 4) {
                                    aa = 0;
                                    i = 20;
                                    while (i--)
                                        baojing2();
                                }
                                dd = 0;
                            }
                        } else {
                            LCD1602_pos(0, 0);
                            write_com(0x0c);
                            write_com(0x06);
                            write_com(0x01);
                            write_n_char("password wrong");
                            delay1(600);
                            aa++;
                            if (aa == 4) {
                                aa = 0;
                                i = 20;
                                while (i--)
                                    baojing2();
                            }
                        }
                    } else {
                        LCD1602_pos(0, 0);
                        write_com(0x0c);
                        write_com(0x06);
                        write_com(0x01);
                        write_n_char("password wrong");
                        delay1(600);
                        dd = 0;
                        aa++;
                        if (aa == 4) {
                            aa = 0;
                            i = 20;
                            while (i--)
                                baojing2();
                        }
                    }
                }
            } else {
                LCD1602_pos(0, 0);
                write_com(0x0c);
                write_com(0x06);
                write_com(0x01);
                write_n_char("password wrong");
                delay1(600);
                aa++;
                if (aa == 4) {
                    aa = 0;
                    i = 20;
                    while (i--)
                        baojing2();
                }
            }
        } else {
            LCD1602_pos(0, 0);
            write_com(0x0c);
            write_com(0x06);
            write_com(0x01);
            write_n_char("password wrong");
            delay1(600);
            aa++;
            if (aa == 4) {
                aa = 0;
                i = 20;
                while (i--)
                    baojing2();
            }
        }
    }
}

第四章 功能测试

系统功能测试包括密码输入、密码验证、密码修改和报警功能的测试。测试环境搭建包括硬件连接和软件编译。

4.1 密码输入测试

通过键盘输入密码,LCD显示“*”号,验证密码输入功能。

4.2 密码验证测试

输入正确密码,系统显示“password right”,开锁并响一声提示。输入错误密码,系统显示“password wrong”,记录错误次数,超过三次触发报警。

4.3 密码修改测试

通过按键进入密码修改模式,输入新密码并确认,系统显示“password has change already”,新密码成功存储。

4.4 报警功能测试

连续输入错误密码三次,蜂鸣器连续报警,测试报警功能。

第五章 总结

本文详细介绍了基于AT89C51单片机的密码锁系统的设计与实现。系统通过硬件电路和软件算法的结合,实现了密码输入、密码验证、密码修改和报警等功能。测试结果表明,系统稳定可靠,具备良好的实用性和安全性。未来的改进方向包括增加无线通信功能,实现远程控制和管理。

完整系统工程资料下载链接

基于51单片机设计的智能六位密码锁(匿输入密码修改警示保存恢复初始密码)源码&仿真&设计文档&演示视频-毕设/课设/竞赛/实训资源-CSDN文库icon-default.png?t=N7T8https://download.csdn.net/download/m0_61712829/89626296

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2035076.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日志审计系统

1.1日志审计基础性知识 什么是日志&#xff1f; 传统的日志概念 信息系统中所有系统和应用必须包含的描述其自身运行和操作的特定数据记录。 广义的日志概念 针对特定记录目的&#xff0c;通过各种探测手段采集的信息数据&#xff0c;包括运行状态、所有事件及操作&#x…

从零开始实现循环神经网络

本节我们通过使用MXnet&#xff0c;来从零开始的实现一个含有隐藏状态的循环神经网络。 前序工作 数据集预处理进行采样 实现循环神经网络 完成前序工作后&#xff0c;即可开始实现循环神经网络。本文首先构建一个具有隐状态的循环神经网络。其结构如图所示&#xff1a; 接…

力扣面试经典算法150题:最后一个单词的长度

最后一个单词的长度 今天的题目是力扣面试经典150题中的数组的简单题: 最后一个单词的长度 题目链接&#xff1a;https://leetcode.cn/problems/length-of-last-word/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一个仅包含大小写字母和空…

Broken靶机

查看靶机的mac地址 使用kail进行扫描ip 探测靶机主机&#xff0c;端口&#xff0c;服务 nmap -sS -sS -A -p- 192.168.154.137 进行目录扫描 dirsearch -u http://192.168.154.137 拼接后没什么发现 访问靶机ip 访问readme.md 发现是十六进制的值 将内容写入到readme.md中 使…

坐牢第二十五天20240813(网络通信)

一、TCP机械臂测试 通过w(红色臂角度增大)s&#xff08;红色臂角度减小&#xff09;d&#xff08;蓝色臂角度增大&#xff09;a&#xff08;蓝色臂角度减小&#xff09;按键控制机械臂 注意&#xff1a;关闭计算机的杀毒软件&#xff0c;电脑管家&#xff0c;防火墙 1&#x…

C语言问答进阶--5、基本表达式和基本语句

赋值表达式 表达式是什么&#xff1f;表达式是由运算符和操作数组成的式子。 如下的代码 #include "iostream.h" int main() { int a1,b2,sum; cout<<(sumab)<<endl; return 0; } 那么如下的呢&#xff1f; #include "iostream.h" int mai…

智能建筑系统,实现智慧城市的可持续发展

智能建筑系统是指通过现代技术和通信技术&#xff0c;对建筑系统进行全方位、智能化的管理和控制。该系统可以通过各种传感器、安全监控系统和计算机设备对工程建筑的内外环境进行认知和控制&#xff0c;进而监控和管理建筑工程设备和信息。 智能建筑系统可以调节室温、湿度等环…

基于Hadoop的汽车大数据分析系统设计与实现【爬虫、数据预处理、MapReduce、echarts、Flask】

文章目录 有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主项目介绍爬虫数据概览HIve表设计Cars Database Tables1. cars_data2. annual_sales_volume3. brand_sales_volume4. city_sales_volume5. sales_volume_by_year_and_brand6. sales_distribu…

Mysql的完整性约束

主键约束&#xff1a;一个表中只有一个主键&#xff0c;通过主键找到唯一的记录。主键不能为空不能重复。 CREATE TABLE s1&#xff08;id TINYINT PRIMARY KEY UNSIGNEDINT AUTO_INCREAMENT,name VARCHAR(20) NOT NULL UNIQUE ,age TINYINT DEFAULT 18&#xff09;;…

镜像仓库认证信息加密初始化脚本

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Python爬虫——爬取bilibili中的视频

爬取bilibili中的视频 本次爬取&#xff0c;还是运用的是requests方法 首先进入bilibili官网中&#xff0c;选取你想要爬取的视频&#xff0c;进入视频播放页面&#xff0c;按F12&#xff0c;将网络中的名称栏向上拉找到第一个并点击&#xff0c;可以在标头中&#xff0c;找到…

【研发日记】嵌入式处理器技能解锁(三)——TI C2000 DSP的C28x内核

文章目录 前言 背景介绍 C28x内核 浮点单元(FPU) 快速整数除法单元(FINTDIV) 三角数学单元(TMU) VCRC单元 CPU总线 指令流水线 总结 参考资料 前言 见《【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法》 见《【研发日记】嵌入式处理器技能解…

Linux--应用层自定义协议与序列化(例子:网络计算器)

目录 0.上篇文章 1.应用层 再谈一谈协议 网络版计算器 序列化 和 反序列化 2.重新理解 read、 write、 recv、 send 和 tcp 为什么支持全双工 3.网络计算器&#xff08;代码实现) 3.1序列化&反序列化的接口 3.2 项目逻辑 3.3 代码 3.3.1辅助库 3.3.2 基于TCP的…

非线性RCD负载:电力系统的智能管理

随着科技的不断发展&#xff0c;电力系统的规模日益扩大&#xff0c;复杂性也越来越高。在这种背景下&#xff0c;非线性RCD负载&#xff08;Resistive-Capacitive-Inductive load&#xff09;的出现&#xff0c;对电力系统的智能管理提出了新的挑战。非线性RCD负载是指由电阻、…

【学习笔记】Day 10

一、进度概述 1、《地震勘探原理》第三章 二、详情 3.1 野外工作概述 主要介绍地上与海上两种情况下的测量方法&#xff0c;这里不做详解&#xff0c;需要就看书。 其中简况分为&#xff1a;试验工作&#xff0c;生产工作过程&#xff0c;干扰波调查&#xff0c;干扰…

thinkphp8反序列化分析

thinkphp8反序列化 前言 摆了一个暑假&#xff0c;正好看见周会有人分析了tp反序列化&#xff0c;想起这条链子的发现者就是我尊敬的nivia&#xff0c;这不得好好分析一下&#xff0c;而且师傅也是分析了这个&#xff0c;所以有了这个文章 链子一 __call触发 分析 相比于我…

SpringSecurity+前端项目+redis完成认证授权的代码

1. 前端准备工作--都在全局main.js页面中设置的 1.1. 创建Vue工程后&#xff0c;并导入element ui和axios&#xff0c;添加连接后端项目的路径&#xff0c;把axios挂载到Vue 1.2. 前置路由守卫&#xff08;所有路由跳转前核实一下身份&#xff09; //前置路由守卫--所有的路由…

C++密码管理器

先问一句 最近有几个关注我的原力等级为0或-1&#xff0c;文章全是转载&#xff0c;转载时间基本都在2021年&#xff0c;而且关注了很多人&#xff0c;这些是僵尸粉吗&#xff1f; 文末有投票&#xff0c;麻烦参与一下谢谢 实现功能列表 暂时还没做加密功能 打算用openssl/a…

C++ STL初阶(9):list 中关于reverse_iterator的实现

在完成vector和list的iterator相关部分的实践后来完成反向迭代器的实现 1. list的反向迭代器 书接上回&#xff0c;反向迭代器应当重新封装一个类。 反向迭代器和正向迭代器最大的区别就是&#xff0c;反向迭代器是倒着走的&#xff0c;所以最核心的逻辑就是将封装成-- 注意&am…

数字化转型-成就智慧智慧企业

数字化转型是企业迈向智慧化发展的关键路径&#xff0c;通过将先进的数字技术融入企业核心业务&#xff0c;构建智能化、数据驱动的运营模式&#xff0c;实现业务的全面升级与优化。智慧企业的实现依托于几个核心要素&#xff1a;首先是数字基础设施的建设&#xff0c;包括云计…