单片机:实现按键控制数码管动态显示0~9(附带源码)

单片机:实现按键控制数码管动态显示0~9

1. 项目背景与目标

在许多嵌入式系统中,我们需要通过按键输入控制系统的显示内容。数码管作为一种常见的显示器,可以用来显示数字和字母。本项目的目标是实现一个按键控制数码管动态显示数字0到9的功能。用户可以通过按键逐步更改数码管上显示的数字。

2. 硬件设计
2.1 硬件组件
  1. 单片机:使用AT89C51(或其他类似单片机,如STC89C52)。
  2. 按键:4个按键(K1-K4)用于控制数字的显示。
  3. 数码管:使用7段数码管来显示数字。
  4. 电源:为单片机及外部电路提供5V电源。
2.2 硬件连接
  1. 数码管连接

  2. 数码管的7个段(a, b, c, d, e, f, g)分别连接到单片机的P2口(假设连接到P2.0~P2.6)。
  3. 数码管的公共端连接到地或电源,根据数码管的类型(共阳或共阴)决定。
  4. 按键连接

  5. 4个按键(K1-K4)分别连接到单片机的P3.0~P3.3口,并通过外部上拉电阻连接至5V。
  6. 电源连接

  7. 为单片机和数码管提供5V电源。
3. 软件设计
3.1 数码管的7段编码

数码管的显示是通过点亮不同的段来实现的。每个数字对应一个7段的显示编码。例如:

  • 数字0对应的7段显示编码为0x3F
  • 数字1对应的7段显示编码为0x06
  • 数字2对应的7段显示编码为0x5B
  • 以此类推,直到数字9。
  • 3.2 按键扫描

    按键通常通过扫描的方式进行读取。每次按键被按下时,P3口上的相应引脚会由高电平变为低电平。我们通过检测每个按键的状态,判断按下了哪个按键。

    3.3 程序设计思路
    1. 数码管初始化:初始化P2口为输出模式,用于控制数码管的7段显示。
    2. 按键扫描:通过P3口读取按键状态,当按键被按下时,通过中断或轮询方式控制数字的变化。
    3. 显示数字:根据按下的按键,更新显示在数码管上的数字。
    4. 动态显示:实现数字在数码管上的动态显示,即逐段显示数字。
    3.4 代码实现

    以下是基于AT89C51单片机实现按键控制数码管动态显示0~9的代码:

    #include <reg51.h>  // 引入51单片机的寄存器定义文件
    
    // 数码管段选编码 (共阳数码管)
    unsigned char segment_code[] = {
        0x3F,  // 0
        0x06,  // 1
        0x5B,  // 2
        0x4F,  // 3
        0x66,  // 4
        0x6D,  // 5
        0x7D,  // 6
        0x07,  // 7
        0x7F,  // 8
        0x6F   // 9
    };
    
    // 按键连接的引脚
    #define KEY1 P3_0
    #define KEY2 P3_1
    #define KEY3 P3_2
    #define KEY4 P3_3
    
    // 延时函数
    void delay(unsigned int ms) {
        unsigned int i, j;
        for (i = 0; i < ms; i++) {
            for (j = 0; j < 120; j++);
        }
    }
    
    // 显示数字到数码管
    void display_digit(unsigned char digit) {
        P2 = segment_code[digit];  // 将数字转换为7段显示码并显示
    }
    
    // 按键扫描
    unsigned char key_scan() {
        if (KEY1 == 0) {  // 判断按键1是否按下
            delay(10);  // 防抖延时
            if (KEY1 == 0) {
                return 1;  // 返回按键1
            }
        }
        if (KEY2 == 0) {  // 判断按键2是否按下
            delay(10);  // 防抖延时
            if (KEY2 == 0) {
                return 2;  // 返回按键2
            }
        }
        if (KEY3 == 0) {  // 判断按键3是否按下
            delay(10);  // 防抖延时
            if (KEY3 == 0) {
                return 3;  // 返回按键3
            }
        }
        if (KEY4 == 0) {  // 判断按键4是否按下
            delay(10);  // 防抖延时
            if (KEY4 == 0) {
                return 4;  // 返回按键4
            }
        }
        return 0;  // 如果没有按键按下,返回0
    }
    
    // 主程序
    void main() {
        unsigned char digit = 0;
        
        while (1) {
            // 按键扫描
            unsigned char key = key_scan();
            
            // 按键1增加数字,按键2减少数字
            if (key == 1) {
                digit = (digit + 1) % 10;  // 增加数字,最大到9
                delay(200);  // 防抖延时
            }
            if (key == 2) {
                digit = (digit - 1) % 10;  // 减少数字,最小到0
                if (digit < 0) {
                    digit = 9;  // 如果数字小于0,则变为9
                }
                delay(200);  // 防抖延时
            }
    
            // 显示数字到数码管
            display_digit(digit);
        }
    }
    
    3.5 代码解释
    1. 数码管段选编码
    2. segment_code[]数组包含了数字0到9对应的7段数码管显示编码。
    3. 按键扫描
    4. 使用key_scan()函数扫描四个按键。每个按键连接到P3口的不同引脚。当某个按键被按下时,该引脚会变为低电平,通过检测该状态来判断按键是否被按下。
    5. 数字更新与显示
    6. digit变量用来存储当前显示的数字。按下不同的按键后,数字会增加或减少。
    7. display_digit()函数将数字转换为7段显示编码,并通过P2口控制数码管显示。
    8. 防抖
    9. 按键按下时,增加了一个短暂的延时(delay(10)),以确保按键的稳定输入,防止按键的抖动影响程序运行。
    4. 仿真与测试
    4.1 电路设计
    1. 在Proteus中创建一个新项目,选择AT89C51单片机
    2. 添加一个7段数码管,并连接到单片机的P2口。
    3. 添加四个按键(K1-K4),并连接到单片机的P3口(P3.0~P3.3)。
    4. 提供5V电源。
    4.2 仿真步骤
    1. 将编写好的代码上传到Proteus仿真环境中。
    2. 运行仿真,按下按键1和按键2,观察数码管显示的数字是否随着按键的按下而增加或减少。
    5. 总结

    本项目实现了一个基于单片机的按键控制数码管显示数字的功能。通过扫描按键,用户可以控制数码管显示的数字在0到9之间循环。该设计适用于需要数字输入和显示的嵌入式应用,且能够有效地使用按键控制显示内容。通过该项目的实现,深入理解了数码管控制、按键扫描以及防抖的处理方法。

    作者:Katie。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机:实现按键控制数码管动态显示0~9(附带源码)

    发表回复