首页 > 其他分享 >AT24C02密码锁,51单片机。

AT24C02密码锁,51单片机。

时间:2024-12-18 19:58:38浏览次数:7  
标签:include sw Button 51 Password 单片机 ms SW 密码锁

#include <REGX52.H>
#include <Buttons.h>
#include <AT24C02.h>
#include <LCD1602.h>
#include <Delay.h>
#include <security.h>
#include <Buzzer.h>

unsigned char Original_Password[6] = {0};  // 原始密码数组
unsigned char Now_Password[6] = {0};      // 当前输入的密码数组

/**
 * @brief 开门操作函数
 */
void Open_Door()
{
    LCD_ShowString(1,1 ,"door is open   ");  // 在第一行显示门已开
}

/**
 * @brief 关门操作函数
 */
void Off_Door()
{
    LCD_ShowString(1,1 ,"door is Off    ");  // 在第一行显示门已关
}

/**
 * @brief 主函数
 */
void main()
{
    char Door_status_flag = 0;  // 门的状态标志,0 表示关,1 表示开

    LCD_Init();  // 初始化 LCD
    Buzzer_Init();  // 初始化蜂鸣器
    Boorbell_Init();  // 初始化门铃
    Password_Init(Original_Password);  // 初始化密码

    while (1)
    {
        switch (Read_JZ_Buttons())  // 根据读取的按键值进行处理
        {
        case key_up:  // 向上按键
            if(Password_Input(Now_Password)){  // 输入密码
                if(Password_Proofread(Original_Password, Now_Password)){  // 验证密码
                    Door_status_flag = 1;  // 密码正确,门状态设为开
                   doorbell_Start();
                }
            }
            break;
        case key_down:  // 向下按键
            Door_status_flag = 0;  // 门状态设为关
            break;
        case key_mode:  // 模式按键
            if(Password_Change(Original_Password)){  // 修改密码
                Buzzer_On();  // 蜂鸣器响
                Delay_ms(50);  // 延时
                Buzzer_Off();  // 蜂鸣器停
            }
            break;
        case key_OK:  // 确定按键
            doorbell_Start();  // 启动门铃
            break;
        default:
            break;
        }
        if (Door_status_flag )  // 根据门的状态显示相应信息
        {
            Open_Door();
        } else {
            Off_Door();
        }
    }
}
#include <Delay.h>

/**
 * @brief 实现毫秒级延时的函数
 * @param ms 要延时的毫秒数
 */
void Delay_ms(unsigned int ms)
{
    int i,j;
    // 通过双重循环实现延时
    for(i=ms;i>0;i--) 
        for(j=114;j>0;j--); 
}
#ifndef __DELAY_H
#define __DELAY_H

/**
 * @brief 声明一个毫秒级延时函数
 * @param ms 要延时的毫秒数
 */
void Delay_ms(unsigned int ms);

#endif
#include <Buttons.h>
#include <REGX52.H>
#include <Delay.h>

// 读取普通按钮状态的函数
unsigned char Read_Buttons(void)
{
    unsigned char Button = 0x00; // 初始化按钮状态变量为 0

    // 如果按钮状态不是全 1(即有按钮按下)
    if(SW!= 0xff) {
        Delay_ms(20); // 延时 20 毫秒消抖
    } else {
        return Button; // 如果没有按钮按下,直接返回初始状态 0
    }

    // 判断各个按钮是否按下,若按下则将对应位设为 1
    if(sw1 == 0) Button = Button | 0x01;
    if(sw2 == 0) Button = Button | 0x02;
    if(sw3 == 0) Button = Button | 0x04;
    if(sw4 == 0) Button = Button | 0x08;

    // 等待按钮释放
    while(SW!= 0xff);
    Delay_ms(20);
    return Button;
}

// 读取矩阵按钮状态的函数
unsigned char Read_JZ_Buttons(void)
{
    unsigned char Button = 0x00; // 初始化按钮状态变量为 0
    unsigned char Button_SMzb;
    unsigned char i = 4;

    SW = 0xff; // 设置某个端口为全 1
    sw_x1 = 0;
    sw_x2 = 0;
    sw_x3 = 0;
    sw_x4 = 0;

    // 如果按钮状态与预期一致
    if(SW!= SW_Cmp) {
        Delay_ms(20); // 延时 20 毫秒消抖
    } else {
        return Button; // 如果状态符合预期,直接返回初始状态 0
    }

    // 通过循环依次检查不同的按钮组合
    while (i--)
    {
        switch (i)
        {
            case 3:
                Button_SMzb = 0x10; // 设置一个中间变量的值
                SW = 0xff;
                sw_x1 = 0;
                break;
            case 2:
                Button_SMzb = 0x20;
                SW = 0xff;
                sw_x2 = 0;
                break;
            case 1:
                Button_SMzb = 0x40;
                SW = 0xff;
                sw_x3 = 0;
                break;
            case 0:
                Button_SMzb = 0x80;
                SW = 0xff;
                sw_x4 = 0;
                break;
            default:
                break;
        }

        // 判断各个按钮是否按下,若按下则将对应位设为 1,并与中间变量组合
        if(sw1 == 0)Button |= 0x01 | Button_SMzb;
        if(sw2 == 0)Button |= 0x02 | Button_SMzb;
        if(sw3 == 0)Button |= 0x04 | Button_SMzb;
        if(sw4 == 0)Button |= 0x08 | Button_SMzb;
    }

    SW = 0xff;
    sw_x1 = 0;
    sw_x2 = 0;
    sw_x3 = 0;
    sw_x4 = 0;
    while(SW!= SW_Cmp);
    D

标签:include,sw,Button,51,Password,单片机,ms,SW,密码锁
From: https://blog.csdn.net/m0_73849363/article/details/144568176

相关文章

  • 2024-12-18 17 55 记录 Cambly trip`s summary and wher 1607b517085581159d14fe77503
    2024-12-1817:55记录Camblytrip`ssummaryandwhereisthenext?https://tingwu.aliyun.com/doc/transcripts/g2y8qevxaayxnbeo?sl=1#《2024-12-1817:55记录Camblytrip`ssummaryandwhereisthenext?》1.全文摘要对话讲述了一个人通过使用美好的旅行来学......
  • 【ARM】PK51-系统语言影响网络版连接授权
    1、文档目标记录在日语版windows系统上客户进行PK51网络版的客户端激活时,出现报错,并且有对共享文件夹的修改权限,记录特殊情况,系统语言也会导致授权文件的授权获取失败。2、问题场景客户在PK51客户端上读取服务器端的.FLF文件出现报错,错误代码:E21图2-13、软硬件环境1)......
  • KBPC1510-ASEMI整流桥KBPC1510参数、封装、尺寸
    编辑:llKBPC1510-ASEMI整流桥KBPC1510参数、封装、尺寸型号:KBPC1510品牌:ASEMI封装:KBPC-4正向电流:15A反向电压:1000V引脚数量:4芯片个数:4芯片尺寸:50MIL漏电流:>10ua恢复时间:>2000ns浪涌电流:300A芯片材质:GPP硅芯片正向电压:1.10V封装尺寸:如图特性:整流桥、插件桥堆工作结......
  • 单片机上电后程序不运行怎么排查问题?
    1.电源检查。使用电压表测量单片机的电源电压是否正常,确保电压在规定的范围内,如常见的5V。2.复位检查。检查复位引脚的电压是否正常,在单片机接通电源时,复位引脚通常会有一个高电平,按下复位按钮时,复位引脚也会产生高电平。3.晶振检查。使用示波器或频率计数器检查外部晶振......
  • 浙江工商大学 ZJGSU OJ 2514. 我找还是你找
    目录题面思路重点代码题面2514.我找还是你找描述某公司仓库从有很多刚生产出来的棍子,小Y要从仓库中找到这样一根棍子,这根棍子的要求如下(优先级1>2>3):1、这根棍子一定要是仓库中最长的;2、这根棍子一定要是最长的棍子中最细的;3、这根棍子一定要是符合前两条的......
  • DSCI 510: Principles of Programming f
    DSCI510:PrinciplesofProgrammingforDataScienceFinalProjectGuidelinesInthefinalprojectforthisclass,youwillhavetheopportunitytoapplytheknowledgeandprogrammingskillsyouhavelearnedtoareal-worldproblem.Yourprojectshouldfoc......
  • 51c视觉~YOLO~合集7~
    我自己的原文哦~  https://blog.51cto.com/whaosoft/12835729一、其他yolo1.1 ImageAdaptive-YOLO又发现了一个yolo~~ 恶劣天气下的目标检测也叫IA-YOLO源代码:https://github.com/wenyyu/ImageAdaptive-YOLO尽管基于深度学习的目标检测方法在传统数据集上取得了......
  • 51c视觉~合集32
    我自己的原文哦~  https://blog.51cto.com/whaosoft/12131903#视觉大模型围绕基础模型在视觉领域的发展,综合全面的从经典的架构设计、训练目标以及主流的微调数据集等系统的梳理基础模型的发展脉络。众所周知,视觉系统对于理解和推理视觉场景的组成特性至关重要。这个领域......
  • 【079】基于51单片机智能浇水灌溉系统【Proteus仿真+Keil程序+报告+原理图】
    ☆、设计硬件组成:51单片机最小系统+DHT11温湿度传感器+LCD1602液晶显示+土壤湿度传感器+光敏电阻+ADC0832模数转换芯片+AT24C02存储芯片+水泵浇水+LED补光灯+按键设置+LED报警灯。1、设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片;2、通过ADC0832模数转换芯片......
  • 278、基于51单片机的雨刮器仿真设计(雨量,速度,手动自动,点动,数码管)
    毕设帮助、开题指导、技术解答(有偿)见文末。目录一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括一、设计功能二、proteus仿真三、原理图四、程序源码五、资料包括需要完整的资料可以点击下面的名片,找我要资源压缩包的百度网盘下载......