m0_73883922 2023-02-21 17:00 采纳率: 33.3%
浏览 353
已结题

51单片机八位密码锁,数码管显示

1.用矩阵按键来输入0~9的数字来输入密码,在数码管中显示。
2.输入密码后用独立按键K1确认密码输入。
3.如果密码正确,LED灯亮任意一盏,不与38译码器冲突。
4.如果密码错误,鸣叫三秒后进行密码重新输入。
5.如果错误三次数码管显示ERROR

img

  • 写回答

5条回答

  • 「已注销」 2023-02-21 21:31
    关注

    参考GPT和自己的思路,单片机的程序相对复杂,和硬件关系密切,所以只能给你提供一个基本的代码框架和算法,帮助你开始编写代码。

    // 引入必要的头文件
    #include <reg51.h>
    
    // 定义矩阵按键输入和数码管显示的引脚
    sbit keypad_row1=P2^0;
    sbit keypad_row2=P2^1;
    sbit keypad_row3=P2^2;
    sbit keypad_row4=P2^3;
    sbit keypad_col1=P2^4;
    sbit keypad_col2=P2^5;
    sbit keypad_col3=P2^6;
    sbit keypad_col4=P2^7;
    sbit seg_a=P1^0;
    sbit seg_b=P1^1;
    sbit seg_c=P1^2;
    sbit seg_d=P1^3;
    sbit seg_e=P1^4;
    sbit seg_f=P1^5;
    sbit seg_g=P1^6;
    sbit seg_dp=P1^7;
    
    // 定义密码变量和计数器
    unsigned char password[8] = {0}; // 八位密码
    unsigned char input_password[8] = {0}; // 输入的密码
    unsigned char input_count = 0; // 当前输入的密码位数
    unsigned char error_count = 0; // 密码错误计数器
    
    // 定义函数原型
    void display(unsigned char num); // 在数码管中显示数字
    unsigned char read_keypad(); // 读取矩阵按键输入
    void check_password(); // 检查密码是否正确
    
    void main()
    {
        // 初始化
        input_count = 0;
        error_count = 0;
    
        while(1)
        {
            // 读取矩阵按键输入
            unsigned char input_num = read_keypad();
    
            // 如果输入的是数字
            if(input_num <= 9)
            {
                // 在数码管中显示输入的数字
                display(input_num);
    
                // 保存输入的密码
                input_password[input_count] = input_num;
                input_count++;
            }
    
            // 如果输入的是确认键
            if(input_num == 10)
            {
                // 检查密码是否正确
                check_password();
    
                // 重置输入计数器和输入密码数组
                input_count = 0;
                for(unsigned char i = 0; i < 8; i++)
                {
                    input_password[i] = 0;
                }
            }
        }
    }
    
    // 在数码管中显示数字
    void display(unsigned char num)
    {
        // 设置数码管段的状态,根据具体的硬件连接和数码管型号进行修改
        seg_a = ...;
        seg_b = ...;
        seg_c = ...;
        seg_d = ...;
        seg_e = ...;
        seg_f = ...;
        seg_g = ...;
        seg_dp = ...;
    }
    
    // 读取矩阵按键输入
    unsigned char read_keypad()
    {
        // 矩阵按键输入的具体实现,根据具体的硬件连接和矩阵键盘型号进行修改
    // 通过逐行扫描和逐列检测的方式读取输入
    keypad_row1 = 0;
    keypad_row2 = 1;
    keypad_row3 = 1;
    keypad_row4 = 1;
    if(keypad_col1 == 0) { return 1; }
    if(keypad_col2 == 0) { return 2; }
    if(keypad_col3 == 0) { return 3; }
    if(keypad_col4 == 0) { return 10; }
    keypad_row1 = 1;
    keypad_row2 = 0;
    keypad_row3 = 1;
    keypad_row4 = 1;
    if(keypad_col1 == 0) { return 4; }
    if(keypad_col2 == 0) { return 5; }
    if(keypad_col3 == 0) { return 6; }
    if(keypad_col4 == 0) { return 10; }
    keypad_row1 = 1;
    keypad_row2 = 1;
    keypad_row3 = 0;
    keypad_row4 = 1;
    if(keypad_col1 == 0) { return 7; }
    if(keypad_col2 == 0) { return 8; }
    if(keypad_col3 == 0) { return 9; }
    if(keypad_col4 == 0) { return 10; }
    keypad_row1 = 1;
    keypad_row2 = 1;
    keypad_row3 = 1;
    keypad_row4 = 0;
    if(keypad_col1 == 0) { return 0; }
    if(keypad_col2 == 0) { return 10; }
    if(keypad_col3 == 0) { return 10; }
    if(keypad_col4 == 0) { return 10; }
    return 10; // 返回10表示没有输入
    }
    

    // 检查密码是否正确
    void check_password()
    {
    // 检查输入的密码是否和设定的密码相同
    for(unsigned char i = 0; i < 8; i++)
    {
    if(input_password[i] != password[i])
    {
    // 密码错误计数器加1
    error_count++;

            // 鸣叫三秒后进行密码重新输入
            if(error_count >= 3)
            {
                // 在数码管中显示ERROR
                display(10); // 这里的10表示显示"E""r""r""o""r",根据具体的数码管型号进行修改
    
                // 延时3秒钟
                for(unsigned int i = 0; i < 30000; i++)
                {
                    for(unsigned int j = 0; j < 100; j++);
                }
    
                // 重置密码错误计数器和数码管显示
                error_count = 0;
                display(11); // 这里的11表示清空数码管的显示,根据具体的数码管型号进行修改
            }
    
            return;
        }
    }
    
    // 如果密码正确,LED灯亮任意一盏
    // 这里根据具体的硬件连接和LED灯的型号进行修改
    P3 = ...;
    

    }

    // 独立按键K1确认密码输入
    void confirm_password()
    {
    // 如果已经输入了8位密码,则可以进行确认
    if(input_index >= 8)
    {
    // 检查密码是否正确
    check_password();

        // 重置输入计数器和输入缓存
        input_index = 0;
        for(unsigned char i = 0; i < 8; i++)
        {
            input_password[i] = 0;
        }
    }
    

    }

    // 定时器0中断服务函数,每隔10毫秒执行一次
    void timer0_isr() interrupt 1
    {
    static unsigned char timer_count = 0;

    // 数码管扫描
    if(++timer_count >= 10)
    {
        timer_count = 0;
        scan_display();
    }
    
    // 检测矩阵按键输入
    unsigned char key = scan_keypad();
    if(key < 10)
    {
        // 在数码管中显示输入的数字
        display(key);
    
        // 将输入的数字存储到缓存中
        input_password[input_index++] = key;
    }
    
    // 检测独立按键K1
    if(k1 == 0)
    {
        confirm_password();
    }
    

    }

    void main()
    {
    // 初始化定时器0,设置为工作模式1、自动重装载、1ms中断一次
    TMOD = 0x01;
    TH0 = (65536 - 1000) / 256;
    TL0 = (65536 - 1000) % 256;
    ET0 = 1;
    EA = 1;
    TR0 = 1;

    // 初始化输入计数器和错误计数器
    input_index = 0;
    error_count = 0;
    
    // 初始化数码管、LED灯、矩阵按键、独立按键
    init_display();
    init_led();
    init_keypad();
    init_k1();
    
    // 设置密码为"12345678"
    password[0] = 1;
    password[1] = 2;
    password[2] = 3;
    password[3] = 4;
    password[4] = 5;
    password[5] = 6;
    password[6] = 7;
    password[7] = 8;
    
    while(1);
    }
    

    在这个示例代码中,我们定义了一些函数来初始化各种硬件设备,包括数码管、LED灯、矩阵按键、独立按键等。然后在 main() 函数中,我们设置密码为 "12345678",并进入一个死循环。在死循环中,程序不断等待定时器中断并扫描矩阵按键、检测独立按键,以及检查输入的密码是否正确。

    在定时器中断服务函数中,我们先进行数码管的扫描,然后检测矩阵按键输入和独立按键K1。如果输入的是数字键,则将输入的数字存储到缓存中,并在数码管中显示输入的数字。如果按下了独立按键K1,则调用 confirm_password() 函数来检查密码是否正确,并重置输入计数器和输入缓存。

    check_password() 函数用来检查输入的密码是否正确。如果输入的密码与设定的密码一致,则点亮任意一盏LED灯。如果输入的密码不正确,则错误计数器加1,并鸣叫三秒。如果错误计数器已经达到3,则在数码管中显示 "ERROR"。

    其他函数包括 init_display()、init_led()、init_keypad()、init_k1()、scan_keypad()、scan_display()、display() 等等,这些函数的具体实现要根据实际情况来编写。
    如果对您有帮助,请给与采纳,谢谢。

    评论

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 创建了问题 2月21日