【TB作品】数码管独立按键密码锁,ATMEGA16单片机,Proteus仿真 atmega16数码管独立按键密码锁


文章目录

基于ATmega16的数码管独立按键密码锁设计实验报告

实验背景

本实验旨在设计并实现一个基于ATmega16单片机的数码管独立按键密码锁系统。该系统能够接受用户输入的密码,并与预设的系统密码进行比对,若匹配成功则点亮绿色LED灯,否则点亮红色LED灯。此设计广泛应用于电子门锁等安全系统中。

硬件介绍

主要元器件

  1. ATmega16单片机:核心控制器,负责按键扫描、密码存储及比较、LED灯和数码管显示控制等。
  2. 独立按键:用于用户输入密码。
  3. 共阴极数码管:用于显示用户输入的密码。
  4. LED灯:绿色和红色LED分别用于指示密码输入正确与否。
  5. 电阻、电容:用于限流和滤波。

电路连接

  1. 独立按键:连接至单片机的PINA和PINB引脚,用于检测按键输入。
  2. 数码管:连接至单片机的PORTC和PORTD引脚,通过动态扫描方式显示用户输入的密码。
  3. LED灯:分别连接至单片机的PORTA引脚,通过控制高低电平实现亮灭。
  4. 电源:为整个系统提供稳定的电源供给。

设计原理

硬件设计

  • 独立按键检测:采用独立按键,通过PINA和PINB端口检测按键状态。每个按键对应一个独立的引脚,当按键按下时,检测到低电平,从而获取按键值。
  • 数码管显示:采用动态扫描方式,逐个显示数码管的内容。通过控制PORTD和PORTC实现数码管的选择和段码显示。
  • LED指示:通过控制PORTA的高低电平来实现绿色和红色LED灯的亮灭,指示密码输入的正确与否。

软件设计

程序采用C语言编写,主要包括以下几个模块:

  1. 延时函数:通过简单的循环实现延时,以配合数码管动态扫描的刷新。
  2. 按键检测:扫描独立按键,获取用户按键输入的值。
  3. 密码显示:将用户输入的密码通过数码管显示出来。
  4. 密码比较:将用户输入的密码与预设密码进行比对,控制LED灯的显示状态。

程序原理

延时函数

c 复制代码
void delay_nms(int time) {
    int i;
    for (; time > 0; time--) {
        for (i = 0; i < 1000; i++);
    }
}

延时函数通过简单的循环实现,以配合数码管的动态扫描。

独立按键检测

c 复制代码
int getKeyBoardValue(void) {
    if ((PINB & 0x01) == 0) return 0;
    else if ((PINB & 0x02) == 0) return 1;
    else if ((PINB & 0x04) == 0) return 2;
    else if ((PINB & 0x08) == 0) return 3;
    else if ((PINB & 0x10) == 0) return 4;
    else if ((PINB & 0x20) == 0) return 5;
    else if ((PINB & 0x40) == 0) return 6;
    else if ((PINB & 0x80) == 0) return 7;
    else if ((PINA & 0x08) == 0) return 8;
    else if ((PINA & 0x10) == 0) return 9;
    else if ((PINA & 0x20) == 0) return 10;
    else if ((PINA & 0x40) == 0) return 11;
    else if ((PINA & 0x80) == 0) return 12;
    return 20;
}

通过检测PINA和PINB引脚的电平状态,判断哪个键被按下。

密码显示

c 复制代码
void display_pwd(char *pwdptr, unsigned char length) {
    int i = 0;
    for (i = 0; i < length; i++) {
        LedOut[i] = Disp_Tab[pwdptr[i] - '0'];
    }
    for (i = length; i < 6; i++) {
        LedOut[i] = Disp_Tab[11];
    }
}

将用户输入的密码通过数码管显示出来,未输入的位显示为空白。

主函数

c 复制代码
void main(void) {
    char cnt_seg = 0;
    int keyTemp = 0;
    char SYSTEM_PASSWORD[7] = "123456";
    char in_buffer[7] = {0, 0, 0, 0, 0, 0, 0};
    char input_nuber = 0;
    char key_press_flag = 0;



    while (1) {
        keyTemp = getKeyBoardValue();
        if ((keyTemp != 20) && (key_press_flag == 0)) {
            key_press_flag = 1;
            if (keyTemp <= 9) keyTemp += '0';
            if ((keyTemp >= '0') && (keyTemp <= '9') && (input_nuber < 6)) {
                in_buffer[input_nuber++] = keyTemp;
            }
            if ((keyTemp == 11) && input_nuber) {
                input_nuber--;
                in_buffer[input_nuber] = 0;
            }
            if (keyTemp == 12) {
                input_nuber = 0;
                memset(in_buffer, 0, sizeof(in_buffer));
                PORTA |= 0x01;
                PORTA |= 0x02;
            }
            if ((keyTemp == 10) && (input_nuber == 6)) {
                if (memcmp(in_buffer, SYSTEM_PASSWORD, 6) == 0) {
                    PORTA &= ~0x02;
                    PORTA |= 0x01;
                } else {
                    PORTA &= ~0x01;
                    PORTA |= 0x02;
                }
                memset(LedOut, Disp_Tab[11], sizeof(LedOut));
                input_nuber = 0;
                memset(in_buffer, 0, sizeof(in_buffer));
            }
            display_pwd(in_buffer, input_nuber);
        }
        if (getKeyBoardValue() == 20) {
            key_press_flag = 0;
        }
        cnt_seg++;
        if (cnt_seg > 5) {
            cnt_seg = 0;
        }

        delay_nms(2);
    }
}

主函数负责初始化各端口,循环检测按键输入,处理用户输入的密码,并通过数码管显示和LED指示密码验证结果。

资源代码

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2
相关推荐
EVERSPIN3 小时前
分享国产32位单片机的电机控制方案
单片机·嵌入式硬件
每天一杯冰美式oh3 小时前
51单片机的家用煤气报警系统【proteus仿真+程序+报告+原理图+演示视频】
嵌入式硬件·51单片机·proteus
芯橦5 小时前
【瑞昱RTL8763E】音频
单片机·嵌入式硬件·mcu·物联网·音视频·visual studio code·智能手表
夜间去看海9 小时前
基于单片机的智能浇花系统
单片机·嵌入式硬件·智能浇花
VirtuousLiu10 小时前
LM74912-Q1用作电源开关
单片机·嵌入式硬件·ti·电源设计·lm74912·电源开关
打地基的小白10 小时前
软件I2C-基于江科大源码进行的原理解析和改造升级
stm32·单片机·嵌入式硬件·通信模式·i2c
Echo_cy_10 小时前
STM32 DMA+AD多通道
stm32·单片机·嵌入式硬件
朴人11 小时前
【从零开始实现stm32无刷电机FOC】【实践】【7.2/7 完整代码编写】
stm32·单片机·嵌入式硬件·foc
追梦少年时11 小时前
STM32中断——外部中断
stm32·单片机·嵌入式硬件
bai_lan_ya11 小时前
stm32定时器中断和外部中断
stm32·单片机·嵌入式硬件