【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
相关推荐
萧技电创EIIA1 天前
基于stc12单片机的PID恒温烙铁设计
单片机·嵌入式硬件·pid过程控制
光子物联单片机1 天前
STM32G474单片机开发入门(八)内部FLASH详解及读写实战
stm32·单片机·嵌入式硬件·mcu
BreezeJuvenile1 天前
通用定时器_输入捕获介绍及案例实操
stm32·单片机·嵌入式硬件·输入捕获·通用定时器
时空自由民.1 天前
无人机系统耗电,低功耗管理问题解决方法(chatgpt)
单片机·嵌入式硬件·无人机
时空自由民.1 天前
无人机系统耗电,低功耗管理问题解决方法(腾讯元宝)
单片机·嵌入式硬件·无人机
清风6666661 天前
基于单片机的双档输出数字直流电压源设计
单片机·mongodb·毕业设计·nosql·课程设计
牛马大师兄1 天前
STM32独立看门狗IWDG与窗口看门狗WWDG知识梳理笔记
笔记·stm32·单片机·嵌入式硬件·嵌入式·看门狗
夜月yeyue1 天前
STM32 Flash 访问加速器详解(ART Accelerator)
linux·单片机·嵌入式硬件·uboot·bootloard
国科安芯1 天前
ASP4644芯片低功耗设计思路解析
网络·单片机·嵌入式硬件·安全
充哥单片机设计1 天前
【STM32项目开源】基于STM32的智能厨房火灾燃气监控
stm32·单片机·嵌入式硬件