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

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

演示视频

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

功能简介

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

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

  • 能够实现密码的修改

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

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

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

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

目录

[第一章 引言](#第一章 引言)

[第二章 硬件设计](#第二章 硬件设计)

[2.1 AT89C51单片机](#2.1 AT89C51单片机)

[2.2 键盘矩阵](#2.2 键盘矩阵)

[2.3 LCD1602液晶显示器](#2.3 LCD1602液晶显示器)

[2.4 蜂鸣器](#2.4 蜂鸣器)

[2.5 24C02 EEPROM](#2.5 24C02 EEPROM)

[第三章 软件设计](#第三章 软件设计)

[3.1 初始化](#3.1 初始化)

[3.2 密码输入与验证](#3.2 密码输入与验证)

[3.3 报警功能](#3.3 报警功能)

[3.4 密码修改](#3.4 密码修改)

[第四章 功能测试](#第四章 功能测试)

[4.1 密码输入测试](#4.1 密码输入测试)

[4.2 密码验证测试](#4.2 密码验证测试)

[4.3 密码修改测试](#4.3 密码修改测试)

[4.4 报警功能测试](#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个按键。每个按键对应一个数字或功能,如下表所示:

行\列 0 1 2 3
0 1 2 3 A
1 4 5 6 B
2 7 8 9 C
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文库https://download.csdn.net/download/m0_61712829/89626296

相关推荐
musir114 分钟前
寄存器控制LED灯亮
单片机
JaneZJW21 分钟前
Proteus仿真——《51单片机AD和DA转换器的设计》
单片机·嵌入式硬件·51单片机·proteus
NEWEVA__zzera223 小时前
利用光耦来隔离485芯片与串口引脚,实现自动收发485电路
单片机·嵌入式硬件
m0_748240543 小时前
STM32第十一课:STM32-基于标准库的42步进电机的简单IO控制(附电机教程,看到即赚到)
stm32·单片机·嵌入式硬件
温柔的男孩像海洋丶3 小时前
vscode的keil assistant 中搜索不到全局变量
ide·vscode·单片机
沐欣工作室_lvyiyi3 小时前
基于单片机的多功能智能小车(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·单片机毕业设计
鸿喵小仙女4 小时前
C# WPF读写STM32/GD32单片机Flash数据
stm32·单片机·c#·wpf
lucy153027510794 小时前
MCU 功耗基准测试
科技·单片机·嵌入式硬件·智能家居·信号处理·工控主板
m0_748240915 小时前
OpenMV与STM32通信全面指南
stm32·单片机·嵌入式硬件
Cchengzu7 小时前
阿里巴巴2017实习生笔试题(二)
stm32·单片机·嵌入式硬件