单片机:实现动态显示七段数码管(附带源码)

news2024/12/25 10:57:27

单片机实现动态显示七段数码管

动态显示七段数码管是指通过不断切换数码管的显示位置和内容,使得数码管的各个数字看起来是同时显示的。通常我们通过控制数码管的扫描方式(逐个显示每个数字)来实现动态显示。每个数字的显示都需要在很短的时间内切换,达到人眼无法察觉的程度,从而实现多个数字同时显示的效果。

本项目将展示如何在单片机上实现动态显示七段数码管,通过定时器控制每个数码管的显示,依次显示不同的数字。

1. 项目需求分析

目标:
  1. 动态显示:通过单片机控制多个七段数码管进行动态显示。
  2. 显示内容:实现显示0到9的数字,模拟时钟、计数器等功能。
  3. 硬件:使用多个七段数码管与单片机连接,通过GPIO端口控制。
功能需求:
  1. 动态扫描显示:通过定时器中断或者程序控制轮流显示数码管,模拟多个数字同时显示的效果。
  2. 数码管控制:控制数码管显示不同的数字(0-9)。

2. 硬件设计

2.1 单片机选择

选择51系列单片机(如AT89C51)作为开发平台,原因是该单片机具有足够的I/O端口,适合控制多个数码管,并且资源较为丰富,便于开发。

2.2 数码管设计

使用的是共阴七段数码管,每个数码管由7个段(a-g)组成,可以通过单片机的GPIO口控制。每个数码管的段通过对应的GPIO端口进行控制,决定显示哪些部分的亮起或熄灭。

2.3 数码管连接方式

假设我们连接了4个数码管,通过4个GPIO口控制每个数码管的段选(a-g)。另外,使用额外的端口控制每个数码管的位选,达到动态扫描显示的效果。

2.4 数码管段选数据表

每个数字(0-9)对应的七段数码管的显示,可以使用一个数组来表示每个数字的段选状态(即每个数字的显示对应于7个段的开关状态)。

// 数码管段选数据(共阴,0表示亮,1表示灭)
unsigned char code digit[] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F   // 9
};

3. 软件设计

3.1 定时器中断

我们使用定时器中断来实现数码管的动态扫描。定时器定时触发中断,每次中断发生时,我们会依次切换不同的数码管进行显示。

3.2 代码实现
#include <reg51.h>  // 包含51系列单片机的寄存器定义文件

// 数码管段选数据(共阴,0表示亮,1表示灭)
unsigned char code digit[] = {
    0x3F,  // 0
    0x06,  // 1
    0x5B,  // 2
    0x4F,  // 3
    0x66,  // 4
    0x6D,  // 5
    0x7D,  // 6
    0x07,  // 7
    0x7F,  // 8
    0x6F   // 9
};

// 定义数码管位选端口
sbit DIG1 = P2^0;  // 数码管1控制位选
sbit DIG2 = P2^1;  // 数码管2控制位选
sbit DIG3 = P2^2;  // 数码管3控制位选
sbit DIG4 = P2^3;  // 数码管4控制位选

// 定义段选端口
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;

// 数码管显示函数
void display_digit(unsigned char position, unsigned char number) {
    // 先关闭所有数码管
    DIG1 = 1;
    DIG2 = 1;
    DIG3 = 1;
    DIG4 = 1;

    // 控制数码管显示指定位置的数字
    switch (position) {
        case 1: DIG1 = 0; break;
        case 2: DIG2 = 0; break;
        case 3: DIG3 = 0; break;
        case 4: DIG4 = 0; break;
    }

    // 根据数字显示对应的段选
    unsigned char seg = digit[number];  // 获取对应数字的段选值
    SEG_A = (seg >> 0) & 0x01;
    SEG_B = (seg >> 1) & 0x01;
    SEG_C = (seg >> 2) & 0x01;
    SEG_D = (seg >> 3) & 0x01;
    SEG_E = (seg >> 4) & 0x01;
    SEG_F = (seg >> 5) & 0x01;
    SEG_G = (seg >> 6) & 0x01;
}

// 定时器中断服务函数
void Timer0_ISR(void) interrupt 1 {
    static unsigned char pos = 1;  // 当前显示的数码管位置
    static unsigned char num[4] = {0, 0, 0, 0};  // 当前显示的数字数组

    // 切换数码管显示位置
    if (pos == 1) {
        display_digit(1, num[0]);
        pos = 2;
    } else if (pos == 2) {
        display_digit(2, num[1]);
        pos = 3;
    } else if (pos == 3) {
        display_digit(3, num[2]);
        pos = 4;
    } else {
        display_digit(4, num[3]);
        pos = 1;
    }

    // 模拟数字增加,方便查看效果
    num[0]++;
    if (num[0] == 10) {
        num[0] = 0;
        num[1]++;
        if (num[1] == 10) {
            num[1] = 0;
            num[2]++;
            if (num[2] == 10) {
                num[2] = 0;
                num[3]++;
                if (num[3] == 10) {
                    num[3] = 0;
                }
            }
        }
    }
}

// 定时器初始化
void Timer0_Init() {
    TMOD = 0x01;  // 定时器0模式1,16位定时器
    TH0 = 0xFC;   // 设置定时器初值
    TL0 = 0x66;
    ET0 = 1;      // 使能定时器0中断
    EA = 1;       // 开启总中断
    TR0 = 1;      // 启动定时器0
}

void main() {
    // 初始化定时器0
    Timer0_Init();

    // 主循环,所有工作都在中断中进行
    while (1) {
        // 此处可以加入其他任务或进入低功耗模式
    }
}

4. 代码解释

  1. 数码管显示函数display_digit函数用于控制指定位置的数码管显示对应的数字。它通过判断position参数来决定哪个数码管显示,之后根据number参数获取对应的段选值并控制七段显示器的每个段(a-g)。

  2. 定时器中断服务函数Timer0_ISR是定时器0的中断服务函数。每次定时器中断时,它会依次切换显示的数码管,并更新显示的数字。为了方便观察效果,我们模拟了一个数字从0到9999的递增显示。

  3. 定时器初始化Timer0_Init函数设置定时器0的工作模式为16位定时器模式,并使能定时器中断。在定时器中断中,我们每隔一定时间切换不同的数码管进行显示。

  4. 主程序:在主程序中,我们初始化定时器并进入一个空的while(1)循环,因为所有的操作都由定时器中断来处理。

5. 总结

通过定时器中断实现了动态显示七段数码管的功能。我们利用定时器定期触发中断,依次切换显示每个数码管并更新显示内容,使得数码管看起来是同时显示的。这个方法不仅节省了计算资源,还能实现平滑的动态显示效果,非常适用于嵌入式应用中对显示有实时性要求的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2265245.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DevNow x Notion

前言 Notion 应该是目前用户量比较大的一个在线笔记软件&#xff0c;它的文档系统也非常完善&#xff0c;支持多种文档格式&#xff0c;如 Markdown、富文本、表格、公式等。 早期我也用过一段时间&#xff0c;后来有点不习惯&#xff0c;就换到了 Obsidian &#xff0c;但是…

OpenAI 12天发布会:AI革命的里程碑@附35页PDF文件下载

在人工智能的浪潮中&#xff0c;OpenAI的12天发布会无疑是2024年科技界的一场盛宴。从12月5日开始&#xff0c;OpenAI连续12天每天发布一个新应用或功能&#xff0c;标志着AI技术的又一次飞跃。本文将梳理这些激动人心的发布&#xff0c;带你一探究竟。 OpenAI发布会概览 Ope…

Mybatis分页插件的使用问题记录

项目中配置的分页插件依赖为 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.1.7</version></dependency>之前的项目代码编写分页的方式为&#xff0c;通过传入的条件…

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》&#xff08;A Philosophy of Software Design&#xff09;是一本在软件架构与设计领域颇具影响力的书籍&#xff0c;作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则&#xff0c;汇聚了作者丰富的实战经验与深邃的…

远程控制macOS一直卡在100%,能连接上了却只显示了壁纸?

前言 前段时间有个朋友过来咨询关于Windows使用第三方远程软件&#xff08;向日葵、Todesk等&#xff09;远程连接控制macOS系统&#xff0c;但出现了一些奇奇怪怪的问题。 比如在连接的时候&#xff0c;一直卡在100%连接&#xff0c;对方的电脑却已经显示已经被控制的状态。…

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击

Pytorch | 利用FGSM针对CIFAR10上的ResNet分类器进行对抗攻击 CIFAR数据集FGSM介绍FGSM代码实现FGSM算法实现攻击效果 代码汇总fgsm.pytrain.pyadvtest.py 之前已经针对CIFAR10训练了多种分类器&#xff1a; Pytorch | 从零构建AlexNet对CIFAR10进行分类 Pytorch | 从零构建Vgg…

mapbox基础,加载mapbox官方地图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…

保护模式基本概念

CPU 架构 RISC&#xff08;Reduced Instruction Set Computer&#xff09; 中文即"精简指令集计算机”。RISC构架的指令格式和长度通常是固定的&#xff08;如ARM是32位的指令&#xff09;、且指令和寻址方式少而简单、大多数指令在一个周期内就可以执行完毕 CISC&…

【Unity3D】Particle粒子特效或3D物体显示在UGUI上的方案

目录 一、RawImage Camera RenderTexture方式 &#xff08;1&#xff09;扩展知识&#xff1a;实现射线检测RawImage内的3D物体 &#xff08;2&#xff09;扩展知识&#xff1a;实现粒子特效显示RawImage上 二、UI摄像机 Canvas(Screen Space - Camera模式)方式 &#…

编程新选择:深入了解仓颉语言的优雅与高效

初识仓颉编程语言 仓颉编程语言&#xff08;Cangjie Programming Language&#xff09;是一种现代化的、面向未来的通用编程语言&#xff0c;其设计理念是为了降低编程的门槛&#xff0c;同时提供高度灵活性和表达力的开发体验。这种语言以其简洁优雅的语法和直观的设计理念受…

vue3项目history路由模式部署上线405、刷新404问题(包括部分页面刷新404问题)

一、找不到js模块 解决方法&#xff1a;配置Nginx配置文件&#xff1a; // root /your/program/path/dist root /www/wwwroot/my_manage_backend_v1/dist;二、刷新页面导致404问题(Not found) 经过一系列配置后发现进入页面一切正常&#xff0c;包括路由前进和回退&#xff0…

谷歌开发者工具 - 控制台篇

Chrome DevTools - Console控制台篇 一、官网二、主要用途三、控制台篇1.JavaScript/浏览器消息记录&#xff08;1&#xff09;演示效果 / 两种记录状态&#xff08;2&#xff09;显示导致调用的堆栈轨迹 2.过滤消息&#xff08;1&#xff09;按日志级别过滤&#xff08;2&…

003-aop-切点表达式

spring-aop-切点表达式 spring-aop-pom依赖

【蓝桥杯——物联网设计与开发】基础模块8 - RTC

目录 一、RTC &#xff08;1&#xff09;资源介绍 &#x1f505;简介 &#x1f505;时钟与分频&#xff08;十分重要‼️&#xff09; &#xff08;2&#xff09;STM32CubeMX 软件配置 &#xff08;3&#xff09;代码编写 &#xff08;4&#xff09;实验现象 二、RTC接口…

Web3.0安全开发实践:探索比特币DeFi生态中的PSBT

近年来&#xff0c;部分签名比特币交易&#xff08;PSBT&#xff09;在比特币生态系统中获得了显著关注。随着如Ordinal和基于铭文的资产等创新的兴起&#xff0c;安全的多方签名和复杂交易的需求不断增加&#xff0c;这使得PSBT成为应对比特币生态不断发展中不可或缺的工具。 …

MaxKB基于大语言模型和 RAG的开源知识库问答系统的快速部署教程

1 部署要求 1.1 服务器配置 部署服务器要求&#xff1a; 操作系统&#xff1a;Ubuntu 22.04 / CentOS 7.6 64 位系统CPU/内存&#xff1a;4C/8GB 以上磁盘空间&#xff1a;100GB 1.2 端口要求 在线部署MaxKB需要开通的访问端口说明如下&#xff1a; 端口作用说明22SSH安装…

【VMware虚拟机】安装win10系统教程双机可ping通

目录 1、下载1.1、点击链接下载媒体创建工具&#xff1a;1.2、下载后得到MediaCreationTool_22H2.exe&#xff1a;1.3、获取ISO镜像 2、安装3、显示4、配置网络4.1、配置4.2、排查4.2.1、关闭防火墙4.2.2、增加路由 1、下载 Windows10微软官网下载链接: https://www.microsoft…

AI一键制作圣诞帽头像丨附详细教程

我用AI换上圣诞帽头像啦~&#x1f385; 不管是搞笑表情、宠物头像还是你的自拍&#xff01;&#xff01;都能一键添加圣诞帽元素&#xff0c;毫无违和感&#xff01;&#x1f389; 详细教程在P3、P4&#xff0c;手残党也能轻松搞定&#xff01; 宝子们需要打“need”&#xff0…

活动图的理解和实践

在软件开发和系统设计中&#xff0c;理解系统的工作流程和并发行为是至关重要的。活动图作为一种重要的建模工具&#xff0c;为我们提供了一种直观且有效的方法来描述这些复杂的过程。本文将详细探讨活动图的理解与实践&#xff0c;包括其基本概念、用途、构建方法以及实际应用…

电磁兼容(EMC):一文解读磁芯复合材料——塑磁

目录 01 塑磁的定义 02 塑磁的常见规格型号 03 塑磁材料的优点 04 塑磁的应用 塑磁,也称为注塑磁,是一种将磁性粉末注入到塑料基体中制成的复合磁体材料。以下是塑磁的定义、应用和材料特性的总结: 01 塑磁的定义 塑磁是以塑料为基体,通过特殊工艺在其中加入磁性粒子(…